From be41c140594ccea16ce17ccca7251d614cc75e1e Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Mon, 6 Dec 2010 08:47:32 +0100 Subject: Propegate fullscreen screen size back to toplevel widgets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed by: Jørgen Lind --- src/plugins/platforms/eglfs/qeglfswindow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp index d0e15d3..b5b7e05 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.cpp +++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp @@ -62,6 +62,9 @@ void QEglFSWindow::setGeometry(const QRect &) QRect rect(m_screen->availableGeometry()); QWindowSystemInterface::handleGeometryChange(this->widget(), rect); + // Since toplevels are fullscreen, propegate the screen size back to the widget + widget()->setGeometry(rect); + QPlatformWindow::setGeometry(rect); } -- cgit v0.12 From 3753b15e88f2c8220b887f27be79491c4135a291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Mon, 6 Dec 2010 16:13:34 +0100 Subject: Added window focus handling to lighthouse The idea is that QPlatformWindows can request focus handling. And when actual focus shifting is done by windowsystem callbacks/events which are sent to QWindowSystemInterface --- src/gui/kernel/qapplication_p.h | 2 ++ src/gui/kernel/qapplication_qpa.cpp | 7 +++++++ src/gui/kernel/qplatformwindow_qpa.cpp | 19 +++++++++++++++++++ src/gui/kernel/qplatformwindow_qpa.h | 1 + src/gui/kernel/qwidget_qpa.cpp | 8 ++------ src/gui/kernel/qwindowsysteminterface_qpa.cpp | 6 ++++++ src/gui/kernel/qwindowsysteminterface_qpa.h | 1 + src/gui/kernel/qwindowsysteminterface_qpa_p.h | 9 +++++++++ src/plugins/platforms/testlite/qtestlitewindow.cpp | 22 ++++++++++++++++++++++ src/plugins/platforms/testlite/qtestlitewindow.h | 3 +++ 10 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h index 7b49999..73c4462 100644 --- a/src/gui/kernel/qapplication_p.h +++ b/src/gui/kernel/qapplication_p.h @@ -508,6 +508,8 @@ public: static void processEnterEvent(QWindowSystemInterfacePrivate::EnterEvent *e); static void processLeaveEvent(QWindowSystemInterfacePrivate::LeaveEvent *e); + static void processActivatedEvent(QWindowSystemInterfacePrivate::ActivatedWindowEvent *e); + static void processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent *e); // static void reportScreenCount(int count); diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp index ece035c..a587e8e 100644 --- a/src/gui/kernel/qapplication_qpa.cpp +++ b/src/gui/kernel/qapplication_qpa.cpp @@ -111,6 +111,9 @@ void QApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate case QWindowSystemInterfacePrivate::Leave: QApplicationPrivate::processLeaveEvent(static_cast(e)); break; + case QWindowSystemInterfacePrivate::ActivatedWindow: + QApplicationPrivate::processActivatedEvent(static_cast(e)); + break; case QWindowSystemInterfacePrivate::Close: QApplicationPrivate::processCloseEvent( static_cast(e)); @@ -823,6 +826,10 @@ void QApplicationPrivate::processLeaveEvent(QWindowSystemInterfacePrivate::Leave } +void QApplicationPrivate::processActivatedEvent(QWindowSystemInterfacePrivate::ActivatedWindowEvent *e) +{ + QApplication::setActiveWindow(e->activated.data()); +} void QApplicationPrivate::processGeometryChangeEvent(QWindowSystemInterfacePrivate::GeometryChangeEvent *e) { diff --git a/src/gui/kernel/qplatformwindow_qpa.cpp b/src/gui/kernel/qplatformwindow_qpa.cpp index 29eaa82..b6b6693 100644 --- a/src/gui/kernel/qplatformwindow_qpa.cpp +++ b/src/gui/kernel/qplatformwindow_qpa.cpp @@ -41,6 +41,7 @@ #include "qplatformwindow_qpa.h" +#include #include class QPlatformWindowPrivate @@ -171,6 +172,24 @@ void QPlatformWindow::setOpacity(qreal level) } /*! + Reimplement to let Qt be able to request activation/focus for a window + + Some window systems will probably not have callbacks for this functionality, + and then calling QWindowSystemInterface::handleWindowActivated(QWidget *w) + would be sufficient. + + If the window system has some event handling/callbacks then call + QWindowSystemInterface::handleWindowActivated(QWidget *w) when the window system + gives the notification. + + Default implementation calls QWindowSystem::handleWindowActivated(QWidget *w) +*/ +void QPlatformWindow::requestActivateWindow() +{ + QWindowSystemInterface::handleWindowActivated(widget()); +} + +/*! Reimplement to return the glContext associated with the window. */ QPlatformGLContext *QPlatformWindow::glContext() const diff --git a/src/gui/kernel/qplatformwindow_qpa.h b/src/gui/kernel/qplatformwindow_qpa.h index 4f6fedc..abc35d1 100644 --- a/src/gui/kernel/qplatformwindow_qpa.h +++ b/src/gui/kernel/qplatformwindow_qpa.h @@ -80,6 +80,7 @@ public: virtual void lower(); virtual void setOpacity(qreal level); + virtual void requestActivateWindow(); virtual QPlatformGLContext *glContext() const; protected: diff --git a/src/gui/kernel/qwidget_qpa.cpp b/src/gui/kernel/qwidget_qpa.cpp index 617d984..1279e0a 100644 --- a/src/gui/kernel/qwidget_qpa.cpp +++ b/src/gui/kernel/qwidget_qpa.cpp @@ -379,9 +379,8 @@ QWidget *QWidget::keyboardGrabber() void QWidget::activateWindow() { - // XXX -// qDebug() << "QWidget::activateWindow" << this; - QApplication::setActiveWindow(this); //##### + if (platformWindow()) + platformWindow()->requestActivateWindow(); } void QWidgetPrivate::show_sys() @@ -409,9 +408,6 @@ void QWidgetPrivate::show_sys() } if (window) window->setVisible(true); - - if (q->isWindow() && q->windowType() != Qt::Popup && q->windowType() != Qt::ToolTip && !(q->windowFlags() & Qt::X11BypassWindowManagerHint)) - q->activateWindow(); //### QWindowSystemInterface should have callback function for when WS actually activates window. } } diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.cpp b/src/gui/kernel/qwindowsysteminterface_qpa.cpp index bb29cbf..b6177b0 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa.cpp +++ b/src/gui/kernel/qwindowsysteminterface_qpa.cpp @@ -82,6 +82,12 @@ void QWindowSystemInterface::handleLeaveEvent(QWidget *tlw) QWindowSystemInterfacePrivate::queueWindowSystemEvent(e); } +void QWindowSystemInterface::handleWindowActivated(QWidget *tlw) +{ + QWindowSystemInterfacePrivate::ActivatedWindowEvent *e = new QWindowSystemInterfacePrivate::ActivatedWindowEvent(tlw); + QWindowSystemInterfacePrivate::queueWindowSystemEvent(e); +} + void QWindowSystemInterface::handleGeometryChange(QWidget *tlw, const QRect &newRect) { if (tlw) { diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.h b/src/gui/kernel/qwindowsysteminterface_qpa.h index 1c79f2a..39c2f79 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa.h +++ b/src/gui/kernel/qwindowsysteminterface_qpa.h @@ -83,6 +83,7 @@ public: static void handleCloseEvent(QWidget *w); static void handleEnterEvent(QWidget *w); static void handleLeaveEvent(QWidget *w); + static void handleWindowActivated(QWidget *w); // Changes to the screen static void handleScreenGeometryChange(int screenIndex); diff --git a/src/gui/kernel/qwindowsysteminterface_qpa_p.h b/src/gui/kernel/qwindowsysteminterface_qpa_p.h index 78e1f33..3491a1a 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa_p.h +++ b/src/gui/kernel/qwindowsysteminterface_qpa_p.h @@ -54,6 +54,7 @@ public: GeometryChange, Enter, Leave, + ActivatedWindow, Mouse, Wheel, Key, @@ -102,6 +103,14 @@ public: QWeakPointer leave; }; + class ActivatedWindowEvent : public WindowSystemEvent { + public: + ActivatedWindowEvent(QWidget *activatedWindow) + : WindowSystemEvent(ActivatedWindow), activated(activatedWindow) + { } + QWeakPointer activated; + }; + class UserEvent : public WindowSystemEvent { public: UserEvent(QWidget * w, ulong time, EventType t) diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index b52aae9..5f9d387 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -318,6 +318,16 @@ void QTestLiteWindow::handleLeaveEvent() QWindowSystemInterface::handleLeaveEvent(widget()); } +void QTestLiteWindow::handleFocusInEvent() +{ + QWindowSystemInterface::handleWindowActivated(widget()); +} + +void QTestLiteWindow::handleFocusOutEvent() +{ + QWindowSystemInterface::handleWindowActivated(0); +} + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Key event stuff -- not pretty either @@ -694,6 +704,10 @@ void QTestLiteWindow::paintEvent() surface->flush(widget(), QRect(xpos,ypos,width, height), QPoint()); } +void QTestLiteWindow::requestActivateWindow() +{ + XSetInputFocus(xd->display, x_window, XRevertToParent, CurrentTime); +} void QTestLiteWindow::resizeEvent(XConfigureEvent *e) { @@ -1456,6 +1470,14 @@ bool MyDisplay::handleEvent(XEvent *xe) xw->handleLeaveEvent(); break; + case XFocusIn: + xw->handleFocusInEvent(); + break; + + case XFocusOut: + xw->handleFocusOutEvent(); + break; + default: #ifdef MYX11_DEBUG qDebug() << hex << xe->xany.window << "Other X event" << xe->type; diff --git a/src/plugins/platforms/testlite/qtestlitewindow.h b/src/plugins/platforms/testlite/qtestlitewindow.h index dc628f1..69442f1 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.h +++ b/src/plugins/platforms/testlite/qtestlitewindow.h @@ -109,10 +109,13 @@ public: void handleCloseEvent(); void handleEnterEvent(); void handleLeaveEvent(); + void handleFocusInEvent(); + void handleFocusOutEvent(); void resizeEvent(XConfigureEvent *configure_event); void paintEvent(); + void requestActivateWindow(); void setGeometry(const QRect &rect); -- cgit v0.12 From f6c5b16768d45f196bab0a2766d4be6027991e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 8 Dec 2010 13:09:36 +0100 Subject: Add function QPlatformScreen::platformScreenForWidget This so there is some logical connection between what screen a widget belongs to --- src/gui/kernel/qdesktopwidget_qpa_p.h | 8 ++++++- src/gui/kernel/qplatformscreen_qpa.cpp | 15 ++++++++++++++ src/gui/kernel/qplatformscreen_qpa.h | 4 ++++ src/gui/kernel/qwidget.cpp | 5 ++--- src/gui/kernel/qwidget_p.h | 5 ++--- src/gui/kernel/qwidget_qpa.cpp | 38 ++++++---------------------------- 6 files changed, 36 insertions(+), 39 deletions(-) diff --git a/src/gui/kernel/qdesktopwidget_qpa_p.h b/src/gui/kernel/qdesktopwidget_qpa_p.h index 8bed09d..47ccca2 100644 --- a/src/gui/kernel/qdesktopwidget_qpa_p.h +++ b/src/gui/kernel/qdesktopwidget_qpa_p.h @@ -59,7 +59,13 @@ class QDesktopScreenWidget : public QWidget { Q_OBJECT public: - QDesktopScreenWidget(int screenNumber = -1) { setWindowFlags(Qt::Desktop); setVisible(false); d_func()->screenNumber = screenNumber; } + QDesktopScreenWidget(int screenNumber = -1) + { + setWindowFlags(Qt::Desktop); + setVisible(false); + QTLWExtra *topData = d_func()->topData(); + topData->screenIndex = screenNumber; + } }; class QDesktopWidgetPrivate : public QWidgetPrivate { diff --git a/src/gui/kernel/qplatformscreen_qpa.cpp b/src/gui/kernel/qplatformscreen_qpa.cpp index 5e80ba8..118835f 100644 --- a/src/gui/kernel/qplatformscreen_qpa.cpp +++ b/src/gui/kernel/qplatformscreen_qpa.cpp @@ -41,7 +41,11 @@ #include "qplatformscreen_qpa.h" #include +#include #include +#include +#include +#include /*! Return the given top level widget for a given position. @@ -77,6 +81,17 @@ QSize QPlatformScreen::physicalSize() const return QSize(width,height); } +Q_GUI_EXPORT extern QWidgetPrivate *qt_widget_private(QWidget *widget); +QPlatformScreen * QPlatformScreen::platformScreenForWidget(const QWidget *widget) +{ + QWidget *window = widget->window(); + QWidgetPrivate *windowPrivate = qt_widget_private(window); + QTLWExtra * topData = windowPrivate->topData(); + QPlatformIntegration *integration = + QApplicationPrivate::platformIntegration(); + return integration->screens()[topData->screenIndex]; +} + /*! \class QPlatformScreen \since 4.8 diff --git a/src/gui/kernel/qplatformscreen_qpa.h b/src/gui/kernel/qplatformscreen_qpa.h index 9080489..1f52764 100644 --- a/src/gui/kernel/qplatformscreen_qpa.h +++ b/src/gui/kernel/qplatformscreen_qpa.h @@ -73,6 +73,10 @@ public: //jl: should setDirty be removed. virtual void setDirty(const QRect &) {} virtual QWidget *topLevelAt(const QPoint &point) const; + + //jl: should this function be in QPlatformIntegration + //jl: maybe screenForWidget is a better name? + static QPlatformScreen *platformScreenForWidget(const QWidget *widget); }; QT_END_NAMESPACE diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 16f64ff..6a6a218 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -303,8 +303,6 @@ QWidgetPrivate::QWidgetPrivate(int version) , hasAlienChildren(0) , window_event(0) , qd_hd(0) -#elif defined (Q_WS_QPA) - , screenNumber(0) #endif { if (!qApp) { @@ -1277,7 +1275,7 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) } #elif defined(Q_WS_QPA) if (desktopWidget) { - int screen = desktopWidget->d_func()->screenNumber; + int screen = desktopWidget->d_func()->topData()->screenIndex; QPlatformIntegration *platform = QApplicationPrivate::platformIntegration(); platform->moveToScreen(q, screen); } @@ -1729,6 +1727,7 @@ void QWidgetPrivate::createTLExtra() #if defined(Q_WS_QPA) x->platformWindow = 0; x->platformWindowFormat = QPlatformWindowFormat::defaultFormat(); + x->screenIndex = 0; #endif } } diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index 6b85391..a0f0ec8 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -233,6 +233,7 @@ struct QTLWExtra { #elif defined(Q_WS_QPA) QPlatformWindow *platformWindow; QPlatformWindowFormat platformWindowFormat; + quint32 screenIndex; // index in qplatformscreenlist #endif }; @@ -885,11 +886,9 @@ public: void updateCursor() const; #endif QScreen* getScreen() const; -#elif defined(Q_WS_QPA) +#elif defined(Q_WS_QPA) // <--------------------------------------------------------- QPA void setMaxWindowState_helper(); void setFullScreenSize_helper(); - - int screenNumber; // screen the widget should be displayed on #ifndef QT_NO_CURSOR void updateCursor() const; #endif diff --git a/src/gui/kernel/qwidget_qpa.cpp b/src/gui/kernel/qwidget_qpa.cpp index 1279e0a..24ab8f7 100644 --- a/src/gui/kernel/qwidget_qpa.cpp +++ b/src/gui/kernel/qwidget_qpa.cpp @@ -53,7 +53,6 @@ #include QT_BEGIN_NAMESPACE -static QPlatformScreen *qt_screenForWidget(const QWidget *w); void q_createNativeChildrenAndSetParent(QPlatformWindow *parentWindow, const QWidget *parentWidget) { @@ -122,7 +121,7 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO } } - QApplicationPrivate::platformIntegration()->moveToScreen(q, screenNumber); + QApplicationPrivate::platformIntegration()->moveToScreen(q, topData()->screenIndex); // qDebug() << "create_sys" << q << q->internalWinId(); } @@ -173,7 +172,7 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) // programmer specified desktop widget // get the desktop's screen number - targetScreen = newparent->d_func()->screenNumber; + targetScreen = newparent->window()->d_func()->topData()->screenIndex; newparent = 0; } @@ -192,7 +191,7 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) f |= Qt::Window; if (targetScreen == -1) { if (parent) - targetScreen = qobject_cast(parent)->d_func()->screenNumber; + targetScreen = q->parentWidget()->window()->d_func()->topData()->screenIndex; } } @@ -228,7 +227,8 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) // move the window to the selected screen if (!newparent && targetScreen != -1) { - screenNumber = targetScreen; + if (maybeTopData()) + maybeTopData()->screenIndex = targetScreen; // only if it is already created if (q->testAttribute(Qt::WA_WState_Created)) { QPlatformIntegration *platform = QApplicationPrivate::platformIntegration(); @@ -643,37 +643,11 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &r) scrollRect(r, dx, dy); } -static QPlatformScreen *qt_screenForWidget(const QWidget *w) -{ - if (!w) - return 0; - QRect frame = w->frameGeometry(); - if (!w->isWindow()) - frame.moveTopLeft(w->mapToGlobal(QPoint(0, 0))); - const QPoint p = (frame.topLeft() + frame.bottomRight()) / 2; - - QPlatformIntegration *pi = QApplicationPrivate::platformIntegration(); - QList screens = pi->screens(); - - for (int i = 0; i < screens.size(); ++i) { - if (screens[i]->geometry().contains(p)) - return screens[i]; - } - - // Assume screen zero if we have it. - if (!screens.isEmpty()) - return screens[0]; - else - qWarning("qt_screenForWidget: no screens"); - - return 0; -} - int QWidget::metric(PaintDeviceMetric m) const { Q_D(const QWidget); - QPlatformScreen *screen = qt_screenForWidget(this); + QPlatformScreen *screen = QPlatformScreen::platformScreenForWidget(this); if (!screen) { if (m == PdmDpiX || m == PdmDpiY) return 72; -- cgit v0.12 From 337f75854883fb93e1b4f41e10c79dc7c352f4a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 8 Dec 2010 13:11:30 +0100 Subject: Refactoring of testlite to conform with Lighthouse structure --- src/plugins/platforms/testlite/qglxintegration.cpp | 75 +- src/plugins/platforms/testlite/qglxintegration.h | 18 +- src/plugins/platforms/testlite/qtestlitecursor.cpp | 200 +++++ src/plugins/platforms/testlite/qtestlitecursor.h | 69 ++ .../platforms/testlite/qtestliteintegration.cpp | 65 +- .../platforms/testlite/qtestliteintegration.h | 29 +- src/plugins/platforms/testlite/qtestlitescreen.cpp | 430 ++++++++++ src/plugins/platforms/testlite/qtestlitescreen.h | 103 +++ src/plugins/platforms/testlite/qtestlitewindow.cpp | 871 ++------------------- src/plugins/platforms/testlite/qtestlitewindow.h | 96 +-- .../platforms/testlite/qtestlitewindowsurface.cpp | 34 +- .../platforms/testlite/qtestlitewindowsurface.h | 2 +- src/plugins/platforms/testlite/testlite.pro | 9 +- 13 files changed, 1005 insertions(+), 996 deletions(-) create mode 100644 src/plugins/platforms/testlite/qtestlitecursor.cpp create mode 100644 src/plugins/platforms/testlite/qtestlitecursor.h create mode 100644 src/plugins/platforms/testlite/qtestlitescreen.cpp create mode 100644 src/plugins/platforms/testlite/qtestlitescreen.h diff --git a/src/plugins/platforms/testlite/qglxintegration.cpp b/src/plugins/platforms/testlite/qglxintegration.cpp index a4b7b69..1dffb3e 100644 --- a/src/plugins/platforms/testlite/qglxintegration.cpp +++ b/src/plugins/platforms/testlite/qglxintegration.cpp @@ -44,6 +44,7 @@ #include #include "qtestlitewindow.h" +#include "qtestlitescreen.h" #include #include @@ -57,9 +58,9 @@ QT_BEGIN_NAMESPACE -QMutex QGLXGLContext::m_defaultSharedContextMutex(QMutex::Recursive); +QMutex QGLXContext::m_defaultSharedContextMutex(QMutex::Recursive); -QVector QGLXGLContext::buildSpec(const QPlatformWindowFormat &format) +QVector QGLXContext::buildSpec(const QPlatformWindowFormat &format) { QVector spec(48); int i = 0; @@ -111,7 +112,7 @@ QVector QGLXGLContext::buildSpec(const QPlatformWindowFormat &format) return spec; } -GLXFBConfig QGLXGLContext::findConfig(const MyDisplay *xd, const QPlatformWindowFormat &format) +GLXFBConfig QGLXContext::findConfig(const QTestLiteScreen *screen, const QPlatformWindowFormat &format) { bool reduced = true; GLXFBConfig chosenConfig = 0; @@ -120,7 +121,7 @@ GLXFBConfig QGLXGLContext::findConfig(const MyDisplay *xd, const QPlatformWindow QVector spec = buildSpec(reducedFormat); int confcount = 0; GLXFBConfig *configs; - configs = glXChooseFBConfig(xd->display,xd->screen,spec.constData(),&confcount); + configs = glXChooseFBConfig(screen->display(),screen->xScreenNumber(),spec.constData(),&confcount); if (confcount) { for (int i = 0; i < confcount; i++) { @@ -128,7 +129,7 @@ GLXFBConfig QGLXGLContext::findConfig(const MyDisplay *xd, const QPlatformWindow // Make sure we try to get an ARGB visual if the format asked for an alpha: if (reducedFormat.alpha()) { int alphaSize; - glXGetFBConfigAttrib(xd->display,configs[i],GLX_ALPHA_SIZE,&alphaSize); + glXGetFBConfigAttrib(screen->display(),configs[i],GLX_ALPHA_SIZE,&alphaSize); if (alphaSize > 0) break; } else { @@ -147,14 +148,14 @@ GLXFBConfig QGLXGLContext::findConfig(const MyDisplay *xd, const QPlatformWindow return chosenConfig; } -XVisualInfo *QGLXGLContext::findVisualInfo(const MyDisplay *xd, const QPlatformWindowFormat &format) +XVisualInfo *QGLXContext::findVisualInfo(const QTestLiteScreen *screen, const QPlatformWindowFormat &format) { - GLXFBConfig config = QGLXGLContext::findConfig(xd,format); - XVisualInfo *visualInfo = glXGetVisualFromFBConfig(xd->display,config); + GLXFBConfig config = QGLXContext::findConfig(screen,format); + XVisualInfo *visualInfo = glXGetVisualFromFBConfig(screen->display(),config); return visualInfo; } -QPlatformWindowFormat QGLXGLContext::platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext ctx) +QPlatformWindowFormat QGLXContext::platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext ctx) { QPlatformWindowFormat format; int redSize = 0; @@ -210,7 +211,7 @@ QPlatformWindowFormat QGLXGLContext::platformWindowFromGLXFBConfig(Display *disp return format; } -QPlatformWindowFormat QGLXGLContext::reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced) +QPlatformWindowFormat QGLXContext::reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced) { QPlatformWindowFormat retFormat = format; *reduced = true; @@ -235,9 +236,9 @@ QPlatformWindowFormat QGLXGLContext::reducePlatformWindowFormat(const QPlatformW return retFormat; } -QGLXGLContext::QGLXGLContext(Window window, MyDisplay *xd, const QPlatformWindowFormat &format) +QGLXContext::QGLXContext(Window window, QTestLiteScreen *screen, const QPlatformWindowFormat &format) : QPlatformGLContext() - , m_xd(xd) + , m_screen(screen) , m_drawable((Drawable)window) , m_context(0) { @@ -246,7 +247,7 @@ QGLXGLContext::QGLXGLContext(Window window, MyDisplay *xd, const QPlatformWindow if (format.useDefaultSharedContext()) { if (!QPlatformGLContext::defaultSharedContext()) { if (m_defaultSharedContextMutex.tryLock()){ - createDefaultSharedContex(xd); + createDefaultSharedContex(screen); m_defaultSharedContextMutex.unlock(); } else { m_defaultSharedContextMutex.lock(); //wait to the the shared context is created @@ -259,32 +260,32 @@ QGLXGLContext::QGLXGLContext(Window window, MyDisplay *xd, const QPlatformWindow } GLXContext shareGlxContext = 0; if (sharePlatformContext) - shareGlxContext = static_cast(sharePlatformContext)->glxContext(); + shareGlxContext = static_cast(sharePlatformContext)->glxContext(); - GLXFBConfig config = findConfig(xd,format); - m_context = glXCreateNewContext(xd->display,config,GLX_RGBA_TYPE,shareGlxContext,TRUE); - m_windowFormat = QGLXGLContext::platformWindowFromGLXFBConfig(xd->display,config,m_context); + GLXFBConfig config = findConfig(screen,format); + m_context = glXCreateNewContext(screen->display(),config,GLX_RGBA_TYPE,shareGlxContext,TRUE); + m_windowFormat = QGLXContext::platformWindowFromGLXFBConfig(screen->display(),config,m_context); #ifdef MYX11_DEBUG qDebug() << "QGLXGLContext::create context" << m_context; #endif } -QGLXGLContext::QGLXGLContext(MyDisplay *display, Drawable drawable, GLXContext context) - : QPlatformGLContext(), m_xd(display), m_drawable(drawable), m_context(context) +QGLXContext::QGLXContext(QTestLiteScreen *screen, Drawable drawable, GLXContext context) + : QPlatformGLContext(), m_screen(screen), m_drawable(drawable), m_context(context) { } -QGLXGLContext::~QGLXGLContext() +QGLXContext::~QGLXContext() { if (m_context) { qDebug("Destroying GLX context 0x%p", m_context); - glXDestroyContext(m_xd->display, m_context); + glXDestroyContext(m_screen->display(), m_context); } } -void QGLXGLContext::createDefaultSharedContex(MyDisplay *xd) +void QGLXContext::createDefaultSharedContex(QTestLiteScreen *screen) { int x = 0; int y = 0; @@ -293,45 +294,45 @@ void QGLXGLContext::createDefaultSharedContex(MyDisplay *xd) QPlatformWindowFormat format = QPlatformWindowFormat::defaultFormat(); GLXContext context; - GLXFBConfig config = findConfig(xd,format); + GLXFBConfig config = findConfig(screen,format); if (config) { - XVisualInfo *visualInfo = glXGetVisualFromFBConfig(xd->display,config); - Colormap cmap = XCreateColormap(xd->display,xd->rootWindow(),visualInfo->visual,AllocNone); + XVisualInfo *visualInfo = glXGetVisualFromFBConfig(screen->display(),config); + Colormap cmap = XCreateColormap(screen->display(),screen->rootWindow(),visualInfo->visual,AllocNone); XSetWindowAttributes a; a.colormap = cmap; - Window sharedWindow = XCreateWindow(xd->display, xd->rootWindow(),x, y, w, h, + Window sharedWindow = XCreateWindow(screen->display(), screen->rootWindow(),x, y, w, h, 0, visualInfo->depth, InputOutput, visualInfo->visual, CWColormap, &a); - context = glXCreateNewContext(xd->display,config,GLX_RGBA_TYPE,0,TRUE); - QPlatformGLContext *sharedContext = new QGLXGLContext(xd,sharedWindow,context); + context = glXCreateNewContext(screen->display(),config,GLX_RGBA_TYPE,0,TRUE); + QPlatformGLContext *sharedContext = new QGLXContext(screen,sharedWindow,context); QPlatformGLContext::setDefaultSharedContext(sharedContext); } else { qWarning("Warning no shared context created"); } } -void QGLXGLContext::makeCurrent() +void QGLXContext::makeCurrent() { QPlatformGLContext::makeCurrent(); #ifdef MYX11_DEBUG qDebug("QGLXGLContext::makeCurrent(window=0x%x, ctx=0x%x)", m_drawable, m_context); #endif - glXMakeCurrent(m_xd->display, m_drawable, m_context); + glXMakeCurrent(m_screen->display(), m_drawable, m_context); } -void QGLXGLContext::doneCurrent() +void QGLXContext::doneCurrent() { QPlatformGLContext::doneCurrent(); - glXMakeCurrent(m_xd->display, 0, 0); + glXMakeCurrent(m_screen->display(), 0, 0); } -void QGLXGLContext::swapBuffers() +void QGLXContext::swapBuffers() { - glXSwapBuffers(m_xd->display, m_drawable); + glXSwapBuffers(m_screen->display(), m_drawable); } -void* QGLXGLContext::getProcAddress(const QString& procName) +void* QGLXContext::getProcAddress(const QString& procName) { typedef void *(*qt_glXGetProcAddressARB)(const GLubyte *); static qt_glXGetProcAddressARB glXGetProcAddressARB = 0; @@ -340,7 +341,7 @@ void* QGLXGLContext::getProcAddress(const QString& procName) if (resolved && !glXGetProcAddressARB) return 0; if (!glXGetProcAddressARB) { - QList glxExt = QByteArray(glXGetClientString(m_xd->display, GLX_EXTENSIONS)).split(' '); + QList glxExt = QByteArray(glXGetClientString(m_screen->display(), GLX_EXTENSIONS)).split(' '); if (glxExt.contains("GLX_ARB_get_proc_address")) { #if defined(Q_OS_LINUX) || defined(Q_OS_BSD4) void *handle = dlopen(NULL, RTLD_LAZY); @@ -364,7 +365,7 @@ void* QGLXGLContext::getProcAddress(const QString& procName) return glXGetProcAddressARB(reinterpret_cast(procName.toLatin1().data())); } -QPlatformWindowFormat QGLXGLContext::platformWindowFormat() const +QPlatformWindowFormat QGLXContext::platformWindowFormat() const { return m_windowFormat; } diff --git a/src/plugins/platforms/testlite/qglxintegration.h b/src/plugins/platforms/testlite/qglxintegration.h index e17790e..5ae0b2a 100644 --- a/src/plugins/platforms/testlite/qglxintegration.h +++ b/src/plugins/platforms/testlite/qglxintegration.h @@ -53,13 +53,11 @@ QT_BEGIN_NAMESPACE -class MyDisplay; - -class QGLXGLContext : public QPlatformGLContext +class QGLXContext : public QPlatformGLContext { public: - QGLXGLContext(Window window, MyDisplay *xd, const QPlatformWindowFormat &format); - ~QGLXGLContext(); + QGLXContext(Window window, QTestLiteScreen *xd, const QPlatformWindowFormat &format); + ~QGLXContext(); virtual void makeCurrent(); virtual void doneCurrent(); @@ -70,22 +68,22 @@ public: QPlatformWindowFormat platformWindowFormat() const; - static XVisualInfo *findVisualInfo(const MyDisplay *xd, const QPlatformWindowFormat &format); + static XVisualInfo *findVisualInfo(const QTestLiteScreen *xd, const QPlatformWindowFormat &format); private: - static GLXFBConfig findConfig(const MyDisplay *xd,const QPlatformWindowFormat &format); + static GLXFBConfig findConfig(const QTestLiteScreen *xd,const QPlatformWindowFormat &format); static QVector buildSpec(const QPlatformWindowFormat &format); static QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context); static QPlatformWindowFormat reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced); - MyDisplay *m_xd; + QTestLiteScreen *m_screen; Drawable m_drawable; GLXContext m_context; QPlatformWindowFormat m_windowFormat; - QGLXGLContext (MyDisplay *display, Drawable drawable, GLXContext context); + QGLXContext (QTestLiteScreen *screen, Drawable drawable, GLXContext context); static QMutex m_defaultSharedContextMutex; - static void createDefaultSharedContex(MyDisplay *xd); + static void createDefaultSharedContex(QTestLiteScreen *xd); }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitecursor.cpp b/src/plugins/platforms/testlite/qtestlitecursor.cpp new file mode 100644 index 0000000..4f3f0cb --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitecursor.cpp @@ -0,0 +1,200 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtestlitecursor.h" + +#include "qtestliteintegration.h" +#include "qtestlitescreen.h" +#include "qtestlitewindow.h" + +#include + +#include + +QT_BEGIN_NAMESPACE + +QTestLiteCursor::QTestLiteCursor(QTestLiteScreen *screen) + : QPlatformCursor(screen) +{ +} + +void QTestLiteCursor::changeCursor(QCursor *cursor, QWidget *widget) +{ + QTestLiteWindow *w = 0; + if (widget) { + QWidget *window = widget->window(); + w = static_cast(window->platformWindow()); + } else { + // No X11 cursor control when there is no widget under the cursor + return; + } + + if (!w) + return; + + int id = cursor->handle(); + if (id == currentCursor) + return; + Cursor c; + if (!cursorMap.contains(id)) { + if (cursor->shape() == Qt::BitmapCursor) + c = createCursorBitmap(cursor); + else + c = createCursorShape(cursor->shape()); + if (!c) { + return; + } + cursorMap.insert(id, c); + } else { + c = cursorMap.value(id); + } + + w->setCursor(c); +} + +Cursor QTestLiteCursor::createCursorBitmap(QCursor * cursor) +{ + XColor bg, fg; + bg.red = 255 << 8; + bg.green = 255 << 8; + bg.blue = 255 << 8; + fg.red = 0; + fg.green = 0; + fg.blue = 0; + QPoint spot = cursor->hotSpot(); + Window rootwin = testLiteScreen()->rootWindow(); + + QImage mapImage = cursor->bitmap()->toImage().convertToFormat(QImage::Format_MonoLSB); + QImage maskImage = cursor->mask()->toImage().convertToFormat(QImage::Format_MonoLSB); + + int width = cursor->bitmap()->width(); + int height = cursor->bitmap()->height(); + int bytesPerLine = mapImage.bytesPerLine(); + int destLineSize = width / 8; + if (width % 8) + destLineSize++; + + const uchar * map = mapImage.bits(); + const uchar * mask = maskImage.bits(); + + char * mapBits = new char[height * destLineSize]; + char * maskBits = new char[height * destLineSize]; + for (int i = 0; i < height; i++) { + memcpy(mapBits + (destLineSize * i),map + (bytesPerLine * i), destLineSize); + memcpy(maskBits + (destLineSize * i),mask + (bytesPerLine * i), destLineSize); + } + + Pixmap cp = XCreateBitmapFromData(testLiteScreen()->display(), rootwin, mapBits, width, height); + Pixmap mp = XCreateBitmapFromData(testLiteScreen()->display(), rootwin, maskBits, width, height); + Cursor c = XCreatePixmapCursor(testLiteScreen()->display(), cp, mp, &fg, &bg, spot.x(), spot.y()); + XFreePixmap(testLiteScreen()->display(), cp); + XFreePixmap(testLiteScreen()->display(), mp); + delete[] mapBits; + delete[] maskBits; + + return c; +} + +Cursor QTestLiteCursor::createCursorShape(int cshape) +{ + Cursor cursor = 0; + + if (cshape < 0 || cshape > Qt::LastCursor) + return 0; + + switch (cshape) { + case Qt::ArrowCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_left_ptr); + break; + case Qt::UpArrowCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_center_ptr); + break; + case Qt::CrossCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_crosshair); + break; + case Qt::WaitCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_watch); + break; + case Qt::IBeamCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_xterm); + break; + case Qt::SizeAllCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_fleur); + break; + case Qt::PointingHandCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_hand2); + break; + case Qt::SizeBDiagCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_top_right_corner); + break; + case Qt::SizeFDiagCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_bottom_right_corner); + break; + case Qt::SizeVerCursor: + case Qt::SplitVCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_sb_v_double_arrow); + break; + case Qt::SizeHorCursor: + case Qt::SplitHCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_sb_h_double_arrow); + break; + case Qt::WhatsThisCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_question_arrow); + break; + case Qt::ForbiddenCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_circle); + break; + case Qt::BusyCursor: + cursor = XCreateFontCursor(testLiteScreen()->display(), XC_watch); + break; + + default: //default cursor for all the rest + break; + } + return cursor; +} + +QTestLiteScreen * QTestLiteCursor::testLiteScreen() const +{ + return static_cast(screen); +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitecursor.h b/src/plugins/platforms/testlite/qtestlitecursor.h new file mode 100644 index 0000000..15a5b2a --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitecursor.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTESTLITECURSOR_H +#define QTESTLITECURSOR_H + +#include + +#include "qtestliteintegration.h" + +QT_BEGIN_NAMESPACE + +class QTestLiteCursor : QPlatformCursor +{ +public: + QTestLiteCursor(QTestLiteScreen *screen); + + void changeCursor(QCursor * cursor, QWidget * widget); +private: + + Cursor createCursorBitmap(QCursor * cursor); + Cursor createCursorShape(int cshape); + + QTestLiteScreen *testLiteScreen() const; + int currentCursor; + QMap cursorMap; +}; + +QT_END_NAMESPACE + +#endif // QTESTLITECURSOR_H diff --git a/src/plugins/platforms/testlite/qtestliteintegration.cpp b/src/plugins/platforms/testlite/qtestliteintegration.cpp index 68e9051..fc2a89c 100644 --- a/src/plugins/platforms/testlite/qtestliteintegration.cpp +++ b/src/plugins/platforms/testlite/qtestliteintegration.cpp @@ -39,17 +39,14 @@ ** ****************************************************************************/ - - #include "qtestliteintegration.h" #include "qtestlitewindowsurface.h" #include #include -#include - #include "qtestlitewindow.h" #include "qgenericunixfontdatabase.h" +#include "qtestlitescreen.h" #ifndef QT_NO_OPENGL #include @@ -59,50 +56,13 @@ QT_BEGIN_NAMESPACE -class MyCursor : QPlatformCursor -{ -public: - MyCursor(QPlatformScreen *screen) : QPlatformCursor(screen) {} - - void changeCursor(QCursor * cursor, QWidget * widget) { - QTestLiteWindow *w = 0; - if (widget) { - QWidget *window = widget->window(); - w = static_cast(window->platformWindow()); - } else { - // No X11 cursor control when there is no widget under the cursor - return; - } - - //qDebug() << "changeCursor" << widget << ws; - if (!w) - return; - - w->setCursor(cursor); - } -}; - QTestLiteIntegration::QTestLiteIntegration(bool useOpenGL) : mUseOpenGL(useOpenGL) , mFontDb(new QGenericUnixFontDatabase()) { - xd = new MyDisplay; - mPrimaryScreen = new QTestLiteScreen(); - - mPrimaryScreen->mGeometry = QRect - (0, 0, xd->width, xd->height); - mPrimaryScreen->mDepth = 32; - mPrimaryScreen->mFormat = QImage::Format_RGB32; - mPrimaryScreen->mPhysicalSize = - QSize(xd->physicalWidth, xd->physicalHeight); - mScreens.append(mPrimaryScreen); - - - (void)new MyCursor(mPrimaryScreen); - } QPixmapData *QTestLiteIntegration::createPixmapData(QPixmapData::PixelType type) const @@ -120,21 +80,33 @@ QWindowSurface *QTestLiteIntegration::createWindowSurface(QWidget *widget, WId) if (mUseOpenGL) return new QGLWindowSurface(widget); #endif - return new QTestLiteWindowSurface(mPrimaryScreen, widget); + return new QTestLiteWindowSurface(widget); } QPlatformWindow *QTestLiteIntegration::createPlatformWindow(QWidget *widget, WId /*winId*/) const { - return new QTestLiteWindow(this, mPrimaryScreen, widget); + return new QTestLiteWindow(widget); } QPixmap QTestLiteIntegration::grabWindow(WId window, int x, int y, int width, int height) const { - QImage img = xd->grabWindow(window, x, y, width, height); - return QPixmap::fromImage(img); + QImage image; + QWidget *widget = QWidget::find(window); + if (widget) { + QTestLiteScreen *screen = QTestLiteScreen::testLiteScreenForWidget(widget); + image = screen->grabWindow(window,x,y,width,height); + } else { + for (int i = 0; i < mScreens.size(); i++) { + QTestLiteScreen *screen = static_cast(mScreens[i]); + if (screen->rootWindow() == window) { + image = screen->grabWindow(window,x,y,width,height); + } + } + } + return QPixmap::fromImage(image); } QPlatformFontDatabase *QTestLiteIntegration::fontDatabase() const @@ -145,7 +117,8 @@ QPlatformFontDatabase *QTestLiteIntegration::fontDatabase() const bool QTestLiteIntegration::hasOpenGL() const { #ifndef QT_NO_OPENGL - return glXQueryExtension(xd->display, 0, 0) != 0; + QTestLiteScreen *screen = static_cast(mScreens.at(0)); + return glXQueryExtension(screen->display(), 0, 0) != 0; #endif return false; } diff --git a/src/plugins/platforms/testlite/qtestliteintegration.h b/src/plugins/platforms/testlite/qtestliteintegration.h index 8286ef0..37d09f5 100644 --- a/src/plugins/platforms/testlite/qtestliteintegration.h +++ b/src/plugins/platforms/testlite/qtestliteintegration.h @@ -42,34 +42,17 @@ #ifndef QGRAPHICSSYSTEM_TESTLITE_H #define QGRAPHICSSYSTEM_TESTLITE_H -#include -#include - //make sure textstream is included before any X11 headers #include -QT_BEGIN_NAMESPACE +#include +#include -class MyDisplay; +#include -class QTestLiteScreen : public QPlatformScreen -{ -public: - QTestLiteScreen() - : mDepth(16), mFormat(QImage::Format_RGB16) {} - ~QTestLiteScreen() {} - - QRect geometry() const { return mGeometry; } - int depth() const { return mDepth; } - QImage::Format format() const { return mFormat; } - QSize physicalSize() const { return mPhysicalSize; } +QT_BEGIN_NAMESPACE -public: - QRect mGeometry; - int mDepth; - QImage::Format mFormat; - QSize mPhysicalSize; -}; +class QTestLiteScreen; class QTestLiteIntegration : public QPlatformIntegration { @@ -88,8 +71,6 @@ public: bool hasOpenGL() const; - MyDisplay *xd; - private: bool mUseOpenGL; QTestLiteScreen *mPrimaryScreen; diff --git a/src/plugins/platforms/testlite/qtestlitescreen.cpp b/src/plugins/platforms/testlite/qtestlitescreen.cpp new file mode 100644 index 0000000..919506e --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitescreen.cpp @@ -0,0 +1,430 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtestlitescreen.h" + +#include "qtestlitecursor.h" +#include "qtestlitewindow.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +static int (*original_x_errhandler)(Display *dpy, XErrorEvent *); +static bool seen_badwindow; + +static int qt_x_errhandler(Display *dpy, XErrorEvent *err) +{ + +qDebug() << "qt_x_errhandler" << err->error_code; + + switch (err->error_code) { + case BadAtom: +#if 0 + if (err->request_code == 20 /* X_GetProperty */ + && (err->resourceid == XA_RESOURCE_MANAGER + || err->resourceid == XA_RGB_DEFAULT_MAP + || err->resourceid == ATOM(_NET_SUPPORTED) + || err->resourceid == ATOM(_NET_SUPPORTING_WM_CHECK) + || err->resourceid == ATOM(KDE_FULL_SESSION) + || err->resourceid == ATOM(KWIN_RUNNING) + || err->resourceid == ATOM(XdndProxy) + || err->resourceid == ATOM(XdndAware)) + + + ) { + // Perhaps we're running under SECURITY reduction? :/ + return 0; + } +#endif + qDebug() << "BadAtom"; + break; + + case BadWindow: + if (err->request_code == 2 /* X_ChangeWindowAttributes */ + || err->request_code == 38 /* X_QueryPointer */) { + for (int i = 0; i < ScreenCount(dpy); ++i) { + if (err->resourceid == RootWindow(dpy, i)) { + // Perhaps we're running under SECURITY reduction? :/ + return 0; + } + } + } + seen_badwindow = true; + if (err->request_code == 25 /* X_SendEvent */) { + for (int i = 0; i < ScreenCount(dpy); ++i) { + if (err->resourceid == RootWindow(dpy, i)) { + // Perhaps we're running under SECURITY reduction? :/ + return 0; + } + } +#if 0 + if (X11->xdndHandleBadwindow()) { + qDebug("xdndHandleBadwindow returned true"); + return 0; + } +#endif + } +#if 0 + if (X11->ignore_badwindow) + return 0; +#endif + break; + + case BadMatch: + if (err->request_code == 42 /* X_SetInputFocus */) + return 0; + break; + + default: +#if 0 //!defined(QT_NO_XINPUT) + if (err->request_code == X11->xinput_major + && err->error_code == (X11->xinput_errorbase + XI_BadDevice) + && err->minor_code == 3 /* X_OpenDevice */) { + return 0; + } +#endif + break; + } + + char errstr[256]; + XGetErrorText( dpy, err->error_code, errstr, 256 ); + char buffer[256]; + char request_str[256]; + qsnprintf(buffer, 256, "%d", err->request_code); + XGetErrorDatabaseText(dpy, "XRequest", buffer, "", request_str, 256); + if (err->request_code < 128) { + // X error for a normal protocol request + qWarning( "X Error: %s %d\n" + " Major opcode: %d (%s)\n" + " Resource id: 0x%lx", + errstr, err->error_code, + err->request_code, + request_str, + err->resourceid ); + } else { + // X error for an extension request + const char *extensionName = 0; +#if 0 + if (err->request_code == X11->xrender_major) + extensionName = "RENDER"; + else if (err->request_code == X11->xrandr_major) + extensionName = "RANDR"; + else if (err->request_code == X11->xinput_major) + extensionName = "XInputExtension"; + else if (err->request_code == X11->mitshm_major) + extensionName = "MIT-SHM"; +#endif + char minor_str[256]; + if (extensionName) { + qsnprintf(buffer, 256, "%s.%d", extensionName, err->minor_code); + XGetErrorDatabaseText(dpy, "XRequest", buffer, "", minor_str, 256); + } else { + extensionName = "Uknown extension"; + qsnprintf(minor_str, 256, "Unknown request"); + } + qWarning( "X Error: %s %d\n" + " Extension: %d (%s)\n" + " Minor opcode: %d (%s)\n" + " Resource id: 0x%lx", + errstr, err->error_code, + err->request_code, + extensionName, + err->minor_code, + minor_str, + err->resourceid ); + } + + // ### we really should distinguish between severe, non-severe and + // ### application specific errors + + return 0; +} + +QTestLiteScreen::QTestLiteScreen() + : mFormat(QImage::Format_RGB32) + , mWmProtocolsAtom(0) + , mWmDeleteWindowAtom(0) +{ + char *display_name = getenv("DISPLAY"); + mDisplay = XOpenDisplay(display_name); + if (!mDisplay) { + fprintf(stderr, "Cannot connect to X server: %s\n", + display_name); + exit(1); + } + +#ifndef DONT_USE_MIT_SHM + Status MIT_SHM_extension_supported = XShmQueryExtension (mDisplay); + Q_ASSERT(MIT_SHM_extension_supported == True); +#endif + original_x_errhandler = XSetErrorHandler(qt_x_errhandler); + + if (qgetenv("DO_X_SYNCHRONIZE").toInt()) + XSynchronize(mDisplay, true); + + mScreen = DefaultScreen(mDisplay); + int width = DisplayWidth(mDisplay, mScreen); + int height = DisplayHeight(mDisplay, mScreen); + mGeometry = QRect(0,0,width,height); + + int physicalWidth = DisplayWidthMM(mDisplay, mScreen); + int physicalHeight = DisplayHeightMM(mDisplay, mScreen); + mPhysicalSize = QSize(physicalWidth,physicalHeight); + + int xSocketNumber = XConnectionNumber(mDisplay); + + mDepth = DefaultDepth(mDisplay,mScreen); +#ifdef MYX11_DEBUG + qDebug() << "X socket:"<< xSocketNumber; +#endif + QSocketNotifier *sock = new QSocketNotifier(xSocketNumber, QSocketNotifier::Read, this); + connect(sock, SIGNAL(activated(int)), this, SLOT(eventDispatcher())); + + mWmProtocolsAtom = XInternAtom (mDisplay, "WM_PROTOCOLS", False); + mWmDeleteWindowAtom = XInternAtom (mDisplay, "WM_DELETE_WINDOW", False); + + mWmMotifHintAtom = XInternAtom(mDisplay, "_MOTIF_WM_HINTS\0", False); + + mCursor = new QTestLiteCursor(this); +} + +QTestLiteScreen::~QTestLiteScreen() +{ + delete mCursor; + XCloseDisplay(mDisplay); +} + +#ifdef KeyPress +#undef KeyPress +#endif +#ifdef KeyRelease +#undef KeyRelease +#endif + +//Q_GUI_EXPORT extern Atom wmProtocolsAtom; +//Q_GUI_EXPORT extern Atom wmDeleteWindowAtom; + +bool QTestLiteScreen::handleEvent(XEvent *xe) +{ + int quit = false; + QTestLiteWindow *xw = 0; + QWidget *widget = QWidget::find(xe->xany.window); + if (widget) { + xw = static_cast(widget->platformWindow()); + } + if (!xw) { +#ifdef MYX11_DEBUG + qWarning() << "Unknown window" << hex << xe->xany.window << "received event" << xe->type; +#endif + return quit; + } + + switch (xe->type) { + + case ClientMessage: + if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom()) { + Atom a = xe->xclient.data.l[0]; + if (a == wmDeleteWindowAtom()) + xw->handleCloseEvent(); +#ifdef MYX11_DEBUG + qDebug() << "ClientMessage WM_PROTOCOLS" << a; +#endif + } +#ifdef MYX11_DEBUG + else + qDebug() << "ClientMessage" << xe->xclient.format << xe->xclient.message_type; +#endif + break; + + case Expose: + if (xw) + if (xe->xexpose.count == 0) + xw->paintEvent(); + break; + case ConfigureNotify: + if (xw) + xw->resizeEvent(&xe->xconfigure); + break; + + case ButtonPress: + xw->mousePressEvent(&xe->xbutton); + break; + + case ButtonRelease: + xw->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton); + break; + + case MotionNotify: + xw->handleMouseEvent(QEvent::MouseMove, &xe->xbutton); + break; + + case XKeyPress: + xw->handleKeyEvent(QEvent::KeyPress, &xe->xkey); + break; + + case XKeyRelease: + xw->handleKeyEvent(QEvent::KeyRelease, &xe->xkey); + break; + + case EnterNotify: + xw->handleEnterEvent(); + break; + + case LeaveNotify: + xw->handleLeaveEvent(); + break; + + case XFocusIn: + xw->handleFocusInEvent(); + break; + + case XFocusOut: + xw->handleFocusOutEvent(); + break; + + default: +#ifdef MYX11_DEBUG + qDebug() << hex << xe->xany.window << "Other X event" << xe->type; +#endif + break; + } + return quit; +} + +void QTestLiteScreen::eventDispatcher() +{ + ulong marker = XNextRequest(mDisplay); + // int i = 0; + while (XPending(mDisplay)) { + XEvent event; + XNextEvent(mDisplay, &event); + /* done = */ + handleEvent(&event); + + if (event.xany.serial >= marker) { + #ifdef MYX11_DEBUG + qDebug() << "potential livelock averted"; + #endif + #if 0 + if (XEventsQueued(mDisplay, QueuedAfterFlush)) { + qDebug() << " with events queued"; + QTimer::singleShot(0, this, SLOT(eventDispatcher())); + } + #endif + break; + } + } +} + +QImage QTestLiteScreen::grabWindow(Window window, int x, int y, int w, int h) +{ + if (w == 0 || h ==0) + return QImage(); + + //WinId 0 means the desktop widget + if (!window) + window = rootWindow(); + + XWindowAttributes window_attr; + if (!XGetWindowAttributes(mDisplay, window, &window_attr)) + return QImage(); + + if (w < 0) + w = window_attr.width - x; + if (h < 0) + h = window_attr.height - y; + + // Ideally, we should also limit ourselves to the screen area, but the Qt docs say + // that it's "unsafe" to go outside the screen, so we can ignore that problem. + + //We're definitely not optimizing for speed... + XImage *xi = XGetImage(mDisplay, window, x, y, w, h, AllPlanes, ZPixmap); + + if (!xi) + return QImage(); + + //taking a copy to make sure we have ownership -- not fast + QImage result = QImage( (uchar*) xi->data, xi->width, xi->height, xi->bytes_per_line, QImage::Format_RGB32 ).copy(); + + XDestroyImage(xi); + + return result; +} + +QTestLiteScreen * QTestLiteScreen::testLiteScreenForWidget(QWidget *widget) +{ + QPlatformScreen *platformScreen = platformScreenForWidget(widget); + return static_cast(platformScreen); +} + +Display * QTestLiteScreen::display() const +{ + return mDisplay; +} + +int QTestLiteScreen::xScreenNumber() const +{ + return mScreen; +} + +Atom QTestLiteScreen::wmProtocolsAtom() const +{ + return mWmProtocolsAtom; +} + +Atom QTestLiteScreen::wmDeleteWindowAtom() const +{ + return mWmDeleteWindowAtom; +} + +void QTestLiteScreen::setWmDeleteWindowAtom(Atom newDeleteWindowAtom) +{ + mWmDeleteWindowAtom = newDeleteWindowAtom; +} + +Atom QTestLiteScreen::atomForMotifWmHints() const +{ + return mWmMotifHintAtom; +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitescreen.h b/src/plugins/platforms/testlite/qtestlitescreen.h new file mode 100644 index 0000000..f8d9468 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitescreen.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTESTLITESCREEN_H +#define QTESTLITESCREEN_H + +#include +#include "qtestliteintegration.h" + +QT_BEGIN_NAMESPACE + +class QTestLiteCursor; + +class QTestLiteScreen : public QPlatformScreen +{ + Q_OBJECT +public: + QTestLiteScreen(); + + ~QTestLiteScreen(); + + QRect geometry() const { return mGeometry; } + int depth() const { return mDepth; } + QImage::Format format() const { return mFormat; } + QSize physicalSize() const { return mPhysicalSize; } + + Window rootWindow() { return RootWindow(mDisplay, mScreen); } + unsigned long blackPixel() { return BlackPixel(mDisplay, mScreen); } + unsigned long whitePixel() { return WhitePixel(mDisplay, mScreen); } + + bool handleEvent(XEvent *xe); + QImage grabWindow(Window window, int x, int y, int w, int h); + + static QTestLiteScreen *testLiteScreenForWidget(QWidget *widget); + + Display *display() const; + int xScreenNumber() const; + + Atom wmProtocolsAtom() const; + Atom wmDeleteWindowAtom() const; + void setWmDeleteWindowAtom(Atom newDeleteWindowAtom); + + Atom atomForMotifWmHints() const; + + +public slots: + void eventDispatcher(); + +private: + QRect mGeometry; + QSize mPhysicalSize; + int mDepth; + QImage::Format mFormat; + QTestLiteCursor *mCursor; + + Display * mDisplay; + int mScreen; + Atom mWmProtocolsAtom; + Atom mWmDeleteWindowAtom; + Atom mWmMotifHintAtom; +}; + +QT_END_NAMESPACE + +#endif // QTESTLITESCREEN_H diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index 5f9d387..f8f4a5f 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -39,169 +39,81 @@ ** ****************************************************************************/ -#include "qtestliteintegration.h" -#include -#include -#include - #include "qtestlitewindow.h" -#include -#include -#include -#include -#include -#include +#include "qtestliteintegration.h" +#include "qtestlitescreen.h" -#include -#include +#include +#include #include +#include + +#include +#include #ifndef QT_NO_OPENGL #include "qglxintegration.h" #endif -#include -#include - - -#include - -#include - - - -//### remove stuff we don't want from qt_x11_p.h -#undef ATOM -#undef X11 - //#define MYX11_DEBUG QT_BEGIN_NAMESPACE -static int (*original_x_errhandler)(Display *dpy, XErrorEvent *); -static bool seen_badwindow; - - -static Atom wmProtocolsAtom; -static Atom wmDeleteWindowAtom; - -class MyX11CursorNode +QTestLiteWindow::QTestLiteWindow(QWidget *window) + : QPlatformWindow(window) + , mGLContext(0) + , mScreen(QTestLiteScreen::testLiteScreenForWidget(window)) { -public: - MyX11CursorNode(int id, Cursor c) { idValue = id; cursorValue = c; refCount = 1; } - QDateTime expiration() { return t; } - void setExpiration(QDateTime val) { t = val; } - MyX11CursorNode * ante() { return before; } - void setAnte(MyX11CursorNode *node) { before = node; } - MyX11CursorNode * post() { return after; } - void setPost(MyX11CursorNode *node) { after = node; } - Cursor cursor() { return cursorValue; } - int id() { return idValue; } - unsigned int refCount; - -private: - MyX11CursorNode *before; - MyX11CursorNode *after; - QDateTime t; - Cursor cursorValue; - int idValue; - - Display * display; -}; - - - - - -class MyX11Cursors : public QObject -{ - Q_OBJECT -public: - MyX11Cursors(Display * d); - ~MyX11Cursors() { timer.stop(); } - void incrementUseCount(int id); - void decrementUseCount(int id); - void createNode(int id, Cursor c); - bool exists(int id) { return lookupMap.contains(id); } - Cursor cursor(int id); -public slots: - void timeout(); - -private: - void removeNode(MyX11CursorNode *node); - void insertNode(MyX11CursorNode *node); - - // linked list of cursors currently not assigned to any window - MyX11CursorNode *firstExpired; - MyX11CursorNode *lastExpired; - - QHash lookupMap; - QTimer timer; - - Display *display; - - int removalDelay; -}; - - - - - -QTestLiteWindow::QTestLiteWindow(const QTestLiteIntegration *platformIntegration, - QTestLiteScreen */*screen*/, QWidget *window) - :QPlatformWindow(window), mGLContext(0) -{ - xd = platformIntegration->xd; - xd->windowList.append(this); - { - int x = window->x(); - int y = window->y(); - int w = window->width(); - int h = window->height(); + int x = window->x(); + int y = window->y(); + int w = window->width(); + int h = window->height(); if(window->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL - && QApplicationPrivate::platformIntegration()->hasOpenGL() ) { + && QApplicationPrivate + ::platformIntegration()->hasOpenGL() ) { #ifndef QT_NO_OPENGL - XVisualInfo *visualInfo = QGLXGLContext::findVisualInfo(xd,window->platformWindowFormat()); - Colormap cmap = XCreateColormap(xd->display,xd->rootWindow(),visualInfo->visual,AllocNone); + XVisualInfo *visualInfo = QGLXContext::findVisualInfo(mScreen,window->platformWindowFormat()); + Colormap cmap = XCreateColormap(mScreen->display(),mScreen->rootWindow(),visualInfo->visual,AllocNone); XSetWindowAttributes a; a.colormap = cmap; - x_window = XCreateWindow(xd->display, xd->rootWindow(),x, y, w, h, + x_window = XCreateWindow(mScreen->display(), mScreen->rootWindow(),x, y, w, h, 0, visualInfo->depth, InputOutput, visualInfo->visual, CWColormap, &a); #endif //QT_NO_OPENGL } else { - x_window = XCreateSimpleWindow(xd->display, xd->rootWindow(), + x_window = XCreateSimpleWindow(mScreen->display(), mScreen->rootWindow(), x, y, w, h, 0 /*border_width*/, - xd->blackPixel(), xd->whitePixel()); + mScreen->blackPixel(), mScreen->whitePixel()); } #ifdef MYX11_DEBUG qDebug() << "QTestLiteWindow::QTestLiteWindow creating" << hex << x_window << window; #endif - } +// } - width = -1; - height = -1; - xpos = -1; - ypos = -1; +// width = -1; +// height = -1; +// xpos = -1; +// ypos = -1; - XSetWindowBackgroundPixmap(xd->display, x_window, XNone); + XSetWindowBackgroundPixmap(mScreen->display(), x_window, XNone); - XSelectInput(xd->display, x_window, ExposureMask | KeyPressMask | KeyReleaseMask | + XSelectInput(mScreen->display(), x_window, ExposureMask | KeyPressMask | KeyReleaseMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | StructureNotifyMask); gc = createGC(); - XChangeProperty (xd->display, x_window, - wmProtocolsAtom, - XA_ATOM, 32, PropModeAppend, - (unsigned char *) &wmDeleteWindowAtom, 1); - currentCursor = -1; + Atom wmDeleteWindowAtom = mScreen->wmDeleteWindowAtom(); + XChangeProperty (mScreen->display(), x_window, + mScreen->wmProtocolsAtom(), + XA_ATOM, 32, PropModeAppend, + (unsigned char *) &wmDeleteWindowAtom, 1); + mScreen->setWmDeleteWindowAtom(wmDeleteWindowAtom); } @@ -211,19 +123,12 @@ QTestLiteWindow::~QTestLiteWindow() qDebug() << "~QTestLiteWindow" << hex << x_window; #endif delete mGLContext; - XFreeGC(xd->display, gc); - XDestroyWindow(xd->display, x_window); - - xd->windowList.removeAll(this); + XFreeGC(mScreen->display(), gc); + XDestroyWindow(mScreen->display(), x_window); } - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Mouse event stuff - - - - static Qt::MouseButtons translateMouseButtons(int s) { Qt::MouseButtons ret = 0; @@ -236,13 +141,11 @@ static Qt::MouseButtons translateMouseButtons(int s) return ret; } - static Qt::KeyboardModifiers translateModifiers(int s) { const uchar qt_alt_mask = Mod1Mask; const uchar qt_meta_mask = Mod4Mask; - Qt::KeyboardModifiers ret = 0; if (s & ShiftMask) ret |= Qt::ShiftModifier; @@ -328,7 +231,6 @@ void QTestLiteWindow::handleFocusOutEvent() QWindowSystemInterface::handleWindowActivated(0); } - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Key event stuff -- not pretty either // @@ -570,7 +472,6 @@ static const unsigned int keyTbl[] = { 0, 0 }; - static int lookupCode(unsigned int xkeycode) { if (xkeycode >= XK_F1 && xkeycode <= XK_F35) @@ -586,7 +487,6 @@ static int lookupCode(unsigned int xkeycode) return 0; } - static Qt::KeyboardModifiers modifierFromKeyCode(int qtcode) { switch (qtcode) { @@ -640,7 +540,7 @@ void QTestLiteWindow::handleKeyEvent(QEvent::Type type, void *ev) void QTestLiteWindow::setGeometry(const QRect &rect) { - XMoveResizeWindow(xd->display, x_window, rect.x(), rect.y(), rect.width(), rect.height()); + XMoveResizeWindow(mScreen->display(), x_window, rect.x(), rect.y(), rect.width(), rect.height()); QPlatformWindow::setGeometry(rect); } @@ -658,17 +558,17 @@ WId QTestLiteWindow::winId() const void QTestLiteWindow::setParent(const QPlatformWindow *window) { QPoint point = widget()->mapTo(widget()->nativeParentWidget(),QPoint()); - XReparentWindow(xd->display,x_window,window->winId(),point.x(),point.y()); + XReparentWindow(mScreen->display(),x_window,window->winId(),point.x(),point.y()); } void QTestLiteWindow::raise() { - XRaiseWindow(xd->display, x_window); + XRaiseWindow(mScreen->display(), x_window); } void QTestLiteWindow::lower() { - XLowerWindow(xd->display, x_window); + XLowerWindow(mScreen->display(), x_window); } void QTestLiteWindow::setWindowTitle(const QString &title) @@ -680,14 +580,14 @@ void QTestLiteWindow::setWindowTitle(const QString &title) windowName.format = 8; windowName.nitems = ba.length(); - XSetWMName(xd->display, x_window, &windowName); + XSetWMName(mScreen->display(), x_window, &windowName); } GC QTestLiteWindow::createGC() { GC gc; - gc = XCreateGC(xd->display, x_window, 0, 0); + gc = XCreateGC(mScreen->display(), x_window, 0, 0); if (gc < 0) { qWarning("QTestLiteWindow::createGC() could not create GC"); } @@ -701,34 +601,32 @@ void QTestLiteWindow::paintEvent() #endif if (QWindowSurface *surface = widget()->windowSurface()) - surface->flush(widget(), QRect(xpos,ypos,width, height), QPoint()); + surface->flush(widget(), widget()->geometry(), QPoint()); } void QTestLiteWindow::requestActivateWindow() { - XSetInputFocus(xd->display, x_window, XRevertToParent, CurrentTime); + XSetInputFocus(mScreen->display(), x_window, XRevertToParent, CurrentTime); } void QTestLiteWindow::resizeEvent(XConfigureEvent *e) { - if ((e->width != width || e->height != height) && e->x == 0 && e->y == 0) { + int xpos = geometry().x(); + int ypos = geometry().y(); + if ((e->width != geometry().width() || e->height != geometry().height()) && e->x == 0 && e->y == 0) { //qDebug() << "resize with bogus pos" << e->x << e->y << e->width << e->height << "window"<< hex << window; } else { //qDebug() << "geometry change" << e->x << e->y << e->width << e->height << "window"<< hex << window; xpos = e->x; ypos = e->y; } - width = e->width; - height = e->height; - #ifdef MYX11_DEBUG qDebug() << hex << x_window << dec << "ConfigureNotify" << e->x << e->y << e->width << e->height << "geometry" << xpos << ypos << width << height; #endif - QWindowSystemInterface::handleGeometryChange(widget(), QRect(xpos, ypos, width, height)); + QWindowSystemInterface::handleGeometryChange(widget(), QRect(xpos, ypos, e->width, e->height)); } - void QTestLiteWindow::mousePressEvent(XButtonEvent *e) { static long prevTime = 0; @@ -752,51 +650,7 @@ void QTestLiteWindow::mousePressEvent(XButtonEvent *e) handleMouseEvent(type, e); } - - -// WindowFlag stuff, lots of copied code from qwidget_x11.cpp... - -//We're hacking here... - - -// MWM support -struct QtMWMHints { - ulong flags, functions, decorations; - long input_mode; - ulong status; -}; - -enum { - MWM_HINTS_FUNCTIONS = (1L << 0), - - MWM_FUNC_ALL = (1L << 0), - MWM_FUNC_RESIZE = (1L << 1), - MWM_FUNC_MOVE = (1L << 2), - MWM_FUNC_MINIMIZE = (1L << 3), - MWM_FUNC_MAXIMIZE = (1L << 4), - MWM_FUNC_CLOSE = (1L << 5), - - MWM_HINTS_DECORATIONS = (1L << 1), - - MWM_DECOR_ALL = (1L << 0), - MWM_DECOR_BORDER = (1L << 1), - MWM_DECOR_RESIZEH = (1L << 2), - MWM_DECOR_TITLE = (1L << 3), - MWM_DECOR_MENU = (1L << 4), - MWM_DECOR_MINIMIZE = (1L << 5), - MWM_DECOR_MAXIMIZE = (1L << 6), - - MWM_HINTS_INPUT_MODE = (1L << 2), - - MWM_INPUT_MODELESS = 0L, - MWM_INPUT_PRIMARY_APPLICATION_MODAL = 1L, - MWM_INPUT_FULL_APPLICATION_MODAL = 3L -}; - -static Atom mwm_hint_atom = XNone; - -#if 0 -static QtMWMHints GetMWMHints(Display *display, Window window) +QtMWMHints QTestLiteWindow::getMWMHints() const { QtMWMHints mwmhints; @@ -804,10 +658,10 @@ static QtMWMHints GetMWMHints(Display *display, Window window) int format; ulong nitems, bytesLeft; uchar *data = 0; - if ((XGetWindowProperty(display, window, mwm_hint_atom, 0, 5, false, - mwm_hint_atom, &type, &format, &nitems, &bytesLeft, + if ((XGetWindowProperty(mScreen->display(), x_window, mScreen->atomForMotifWmHints(), 0, 5, false, + mScreen->atomForMotifWmHints(), &type, &format, &nitems, &bytesLeft, &data) == Success) - && (type == mwm_hint_atom + && (type == mScreen->atomForMotifWmHints() && format == 32 && nitems >= 5)) { mwmhints = *(reinterpret_cast(data)); @@ -824,15 +678,15 @@ static QtMWMHints GetMWMHints(Display *display, Window window) return mwmhints; } -#endif -static void SetMWMHints(Display *display, Window window, const QtMWMHints &mwmhints) +void QTestLiteWindow::setMWMHints(const QtMWMHints &mwmhints) { if (mwmhints.flags != 0l) { - XChangeProperty(display, window, mwm_hint_atom, mwm_hint_atom, 32, + XChangeProperty(mScreen->display(), x_window, + mScreen->atomForMotifWmHints(), mScreen->atomForMotifWmHints(), 32, PropModeReplace, (unsigned char *) &mwmhints, 5); } else { - XDeleteProperty(display, window, mwm_hint_atom); + XDeleteProperty(mScreen->display(), x_window, mScreen->atomForMotifWmHints()); } } @@ -849,17 +703,11 @@ static inline bool isTransient(const QWidget *w) && !w->testAttribute(Qt::WA_X11BypassTransientForHint)); } - - Qt::WindowFlags QTestLiteWindow::setWindowFlags(Qt::WindowFlags flags) { // Q_ASSERT(flags & Qt::Window); window_flags = flags; - if (mwm_hint_atom == XNone) { - mwm_hint_atom = XInternAtom(xd->display, "_MOTIF_WM_HINTS\0", False); - } - #ifdef MYX11_DEBUG qDebug() << "QTestLiteWindow::setWindowFlags" << hex << x_window << "flags" << flags; #endif @@ -878,12 +726,10 @@ Qt::WindowFlags QTestLiteWindow::setWindowFlags(Qt::WindowFlags flags) bool tool = (type == Qt::Tool || type == Qt::SplashScreen || type == Qt::ToolTip || type == Qt::Drawer); - Q_UNUSED(topLevel); Q_UNUSED(dialog); Q_UNUSED(desktop); - bool tooltip = (type == Qt::ToolTip); XSetWindowAttributes wsa; @@ -964,7 +810,7 @@ Qt::WindowFlags QTestLiteWindow::setWindowFlags(Qt::WindowFlags flags) mwmhints.decorations = 0; } - SetMWMHints(xd->display, x_window, mwmhints); + setMWMHints(mwmhints); //##### only if initializeWindow??? @@ -977,7 +823,7 @@ Qt::WindowFlags QTestLiteWindow::setWindowFlags(Qt::WindowFlags flags) wsa.override_redirect = True; wsa.save_under = True; - XChangeWindowAttributes(xd->display, x_window, CWOverrideRedirect | CWSaveUnder, + XChangeWindowAttributes(mScreen->display(), x_window, CWOverrideRedirect | CWSaveUnder, &wsa); } else { #ifdef MYX11_DEBUG @@ -994,38 +840,15 @@ void QTestLiteWindow::setVisible(bool visible) qDebug() << "QTestLiteWindow::setVisible" << visible << hex << x_window; #endif if (visible) - XMapWindow(xd->display, x_window); + XMapWindow(mScreen->display(), x_window); else - XUnmapWindow(xd->display, x_window); + XUnmapWindow(mScreen->display(), x_window); } - -void QTestLiteWindow::setCursor(QCursor * cursor) +void QTestLiteWindow::setCursor(const Cursor &cursor) { - int id = cursor->handle(); - if (id == currentCursor) - return; - Cursor c; - if (!xd->cursors->exists(id)) { - if (cursor->shape() == Qt::BitmapCursor) - c = createCursorBitmap(cursor); - else - c = createCursorShape(cursor->shape()); - if (!c) { - return; - } - xd->cursors->createNode(id, c); - } else { - xd->cursors->incrementUseCount(id); - c = xd->cursors->cursor(id); - } - - if (currentCursor != -1) - xd->cursors->decrementUseCount(currentCursor); - currentCursor = id; - - XDefineCursor(xd->display, x_window, c); - XFlush(xd->display); + XDefineCursor(mScreen->display(), x_window, cursor); + XFlush(mScreen->display()); } QPlatformGLContext *QTestLiteWindow::glContext() const @@ -1035,574 +858,20 @@ QPlatformGLContext *QTestLiteWindow::glContext() const if (!mGLContext) { QTestLiteWindow *that = const_cast(this); #ifndef QT_NO_OPENGL - that->mGLContext = new QGLXGLContext(x_window, xd,widget()->platformWindowFormat()); + that->mGLContext = new QGLXContext(x_window, mScreen,widget()->platformWindowFormat()); #endif } return mGLContext; } -Cursor QTestLiteWindow::createCursorBitmap(QCursor * cursor) -{ - XColor bg, fg; - bg.red = 255 << 8; - bg.green = 255 << 8; - bg.blue = 255 << 8; - fg.red = 0; - fg.green = 0; - fg.blue = 0; - QPoint spot = cursor->hotSpot(); - Window rootwin = x_window; - - QImage mapImage = cursor->bitmap()->toImage().convertToFormat(QImage::Format_MonoLSB); - QImage maskImage = cursor->mask()->toImage().convertToFormat(QImage::Format_MonoLSB); - - int width = cursor->bitmap()->width(); - int height = cursor->bitmap()->height(); - int bytesPerLine = mapImage.bytesPerLine(); - int destLineSize = width / 8; - if (width % 8) - destLineSize++; - - const uchar * map = mapImage.bits(); - const uchar * mask = maskImage.bits(); - - char * mapBits = new char[height * destLineSize]; - char * maskBits = new char[height * destLineSize]; - for (int i = 0; i < height; i++) { - memcpy(mapBits + (destLineSize * i),map + (bytesPerLine * i), destLineSize); - memcpy(maskBits + (destLineSize * i),mask + (bytesPerLine * i), destLineSize); - } - - Pixmap cp = XCreateBitmapFromData(xd->display, rootwin, mapBits, width, height); - Pixmap mp = XCreateBitmapFromData(xd->display, rootwin, maskBits, width, height); - Cursor c = XCreatePixmapCursor(xd->display, cp, mp, &fg, &bg, spot.x(), spot.y()); - XFreePixmap(xd->display, cp); - XFreePixmap(xd->display, mp); - delete[] mapBits; - delete[] maskBits; - - return c; -} - -Cursor QTestLiteWindow::createCursorShape(int cshape) -{ - Cursor cursor = 0; - - if (cshape < 0 || cshape > Qt::LastCursor) - return 0; - - switch (cshape) { - case Qt::ArrowCursor: - cursor = XCreateFontCursor(xd->display, XC_left_ptr); - break; - case Qt::UpArrowCursor: - cursor = XCreateFontCursor(xd->display, XC_center_ptr); - break; - case Qt::CrossCursor: - cursor = XCreateFontCursor(xd->display, XC_crosshair); - break; - case Qt::WaitCursor: - cursor = XCreateFontCursor(xd->display, XC_watch); - break; - case Qt::IBeamCursor: - cursor = XCreateFontCursor(xd->display, XC_xterm); - break; - case Qt::SizeAllCursor: - cursor = XCreateFontCursor(xd->display, XC_fleur); - break; - case Qt::PointingHandCursor: - cursor = XCreateFontCursor(xd->display, XC_hand2); - break; - case Qt::SizeBDiagCursor: - cursor = XCreateFontCursor(xd->display, XC_top_right_corner); - break; - case Qt::SizeFDiagCursor: - cursor = XCreateFontCursor(xd->display, XC_bottom_right_corner); - break; - case Qt::SizeVerCursor: - case Qt::SplitVCursor: - cursor = XCreateFontCursor(xd->display, XC_sb_v_double_arrow); - break; - case Qt::SizeHorCursor: - case Qt::SplitHCursor: - cursor = XCreateFontCursor(xd->display, XC_sb_h_double_arrow); - break; - case Qt::WhatsThisCursor: - cursor = XCreateFontCursor(xd->display, XC_question_arrow); - break; - case Qt::ForbiddenCursor: - cursor = XCreateFontCursor(xd->display, XC_circle); - break; - case Qt::BusyCursor: - cursor = XCreateFontCursor(xd->display, XC_watch); - break; - - default: //default cursor for all the rest - break; - } - return cursor; -} - - -MyX11Cursors::MyX11Cursors(Display * d) : firstExpired(0), lastExpired(0), display(d), removalDelay(3) -{ - connect(&timer, SIGNAL(timeout()), this, SLOT(timeout())); -} - -void MyX11Cursors::insertNode(MyX11CursorNode * node) +Window QTestLiteWindow::xWindow() const { - QDateTime now = QDateTime::currentDateTime(); - QDateTime timeout = now.addSecs(removalDelay); - node->setExpiration(timeout); - node->setPost(0); - if (lastExpired) { - lastExpired->setPost(node); - node->setAnte(lastExpired); - } - lastExpired = node; - if (!firstExpired) { - firstExpired = node; - node->setAnte(0); - int interval = removalDelay * 1000; - timer.setInterval(interval); - timer.start(); - } -} - -void MyX11Cursors::removeNode(MyX11CursorNode * node) -{ - MyX11CursorNode *pre = node->ante(); - MyX11CursorNode *post = node->post(); - if (pre) - pre->setPost(post); - if (post) - post->setAnte(pre); - if (node == lastExpired) - lastExpired = pre; - if (node == firstExpired) { - firstExpired = post; - if (!firstExpired) { - timer.stop(); - return; - } - int interval = QDateTime::currentDateTime().secsTo(firstExpired->expiration()) * 1000; - timer.stop(); - timer.setInterval(interval); - timer.start(); - } -} - -void MyX11Cursors::incrementUseCount(int id) -{ - MyX11CursorNode * node = lookupMap.value(id); - Q_ASSERT(node); - if (!node->refCount) - removeNode(node); - node->refCount++; -} - -void MyX11Cursors::decrementUseCount(int id) -{ - MyX11CursorNode * node = lookupMap.value(id); - Q_ASSERT(node); - node->refCount--; - if (!node->refCount) - insertNode(node); -} - -void MyX11Cursors::createNode(int id, Cursor c) -{ - MyX11CursorNode * node = new MyX11CursorNode(id, c); - lookupMap.insert(id, node); -} - -void MyX11Cursors::timeout() -{ - MyX11CursorNode * node; - node = firstExpired; - QDateTime now = QDateTime::currentDateTime(); - while (node && now.secsTo(node->expiration()) < 1) { - Cursor c = node->cursor(); - int id = node->id(); - lookupMap.take(id); - MyX11CursorNode * tmp = node; - node = node->post(); - if (node) - node->setAnte(0); - delete tmp; - XFreeCursor(display, c); - } - firstExpired = node; - if (node == 0) { - timer.stop(); - lastExpired = 0; - } - else { - int interval = QDateTime::currentDateTime().secsTo(firstExpired->expiration()) * 1000; - timer.setInterval(interval); - timer.start(); - } -} - -Cursor MyX11Cursors::cursor(int id) -{ - MyX11CursorNode * node = lookupMap.value(id); - Q_ASSERT(node); - return node->cursor(); -} - - - -/******************************************************************** - -MyDisplay class - perhaps better placed in qplatformintegration_testlite? - -*********************************************************************/ - -//### copied from qapplication_x11.cpp - -static int qt_x_errhandler(Display *dpy, XErrorEvent *err) -{ - -qDebug() << "qt_x_errhandler" << err->error_code; - - switch (err->error_code) { - case BadAtom: -#if 0 - if (err->request_code == 20 /* X_GetProperty */ - && (err->resourceid == XA_RESOURCE_MANAGER - || err->resourceid == XA_RGB_DEFAULT_MAP - || err->resourceid == ATOM(_NET_SUPPORTED) - || err->resourceid == ATOM(_NET_SUPPORTING_WM_CHECK) - || err->resourceid == ATOM(KDE_FULL_SESSION) - || err->resourceid == ATOM(KWIN_RUNNING) - || err->resourceid == ATOM(XdndProxy) - || err->resourceid == ATOM(XdndAware)) - - - ) { - // Perhaps we're running under SECURITY reduction? :/ - return 0; - } -#endif - qDebug() << "BadAtom"; - break; - - case BadWindow: - if (err->request_code == 2 /* X_ChangeWindowAttributes */ - || err->request_code == 38 /* X_QueryPointer */) { - for (int i = 0; i < ScreenCount(dpy); ++i) { - if (err->resourceid == RootWindow(dpy, i)) { - // Perhaps we're running under SECURITY reduction? :/ - return 0; - } - } - } - seen_badwindow = true; - if (err->request_code == 25 /* X_SendEvent */) { - for (int i = 0; i < ScreenCount(dpy); ++i) { - if (err->resourceid == RootWindow(dpy, i)) { - // Perhaps we're running under SECURITY reduction? :/ - return 0; - } - } -#if 0 - if (X11->xdndHandleBadwindow()) { - qDebug("xdndHandleBadwindow returned true"); - return 0; - } -#endif - } -#if 0 - if (X11->ignore_badwindow) - return 0; -#endif - break; - - case BadMatch: - if (err->request_code == 42 /* X_SetInputFocus */) - return 0; - break; - - default: -#if 0 //!defined(QT_NO_XINPUT) - if (err->request_code == X11->xinput_major - && err->error_code == (X11->xinput_errorbase + XI_BadDevice) - && err->minor_code == 3 /* X_OpenDevice */) { - return 0; - } -#endif - break; - } - - char errstr[256]; - XGetErrorText( dpy, err->error_code, errstr, 256 ); - char buffer[256]; - char request_str[256]; - qsnprintf(buffer, 256, "%d", err->request_code); - XGetErrorDatabaseText(dpy, "XRequest", buffer, "", request_str, 256); - if (err->request_code < 128) { - // X error for a normal protocol request - qWarning( "X Error: %s %d\n" - " Major opcode: %d (%s)\n" - " Resource id: 0x%lx", - errstr, err->error_code, - err->request_code, - request_str, - err->resourceid ); - } else { - // X error for an extension request - const char *extensionName = 0; -#if 0 - if (err->request_code == X11->xrender_major) - extensionName = "RENDER"; - else if (err->request_code == X11->xrandr_major) - extensionName = "RANDR"; - else if (err->request_code == X11->xinput_major) - extensionName = "XInputExtension"; - else if (err->request_code == X11->mitshm_major) - extensionName = "MIT-SHM"; -#endif - char minor_str[256]; - if (extensionName) { - qsnprintf(buffer, 256, "%s.%d", extensionName, err->minor_code); - XGetErrorDatabaseText(dpy, "XRequest", buffer, "", minor_str, 256); - } else { - extensionName = "Uknown extension"; - qsnprintf(minor_str, 256, "Unknown request"); - } - qWarning( "X Error: %s %d\n" - " Extension: %d (%s)\n" - " Minor opcode: %d (%s)\n" - " Resource id: 0x%lx", - errstr, err->error_code, - err->request_code, - extensionName, - err->minor_code, - minor_str, - err->resourceid ); - } - - // ### we really should distinguish between severe, non-severe and - // ### application specific errors - - return 0; -} - - -#ifdef KeyPress -#undef KeyPress -#endif -#ifdef KeyRelease -#undef KeyRelease -#endif - -bool MyDisplay::handleEvent(XEvent *xe) -{ - //qDebug() << "handleEvent" << xe->xany.type << xe->xany.window; - int quit = false; - QTestLiteWindow *xw = 0; - foreach (QTestLiteWindow *w, windowList) { - if (w->winId() == xe->xany.window) { - xw = w; - break; - } - } - if (!xw) { -#ifdef MYX11_DEBUG - qWarning() << "Unknown window" << hex << xe->xany.window << "received event" << xe->type; -#endif - return quit; - } - - switch (xe->type) { - - case ClientMessage: - if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom) { - Atom a = xe->xclient.data.l[0]; - if (a == wmDeleteWindowAtom) - xw->handleCloseEvent(); -#ifdef MYX11_DEBUG - qDebug() << "ClientMessage WM_PROTOCOLS" << a; -#endif - } -#ifdef MYX11_DEBUG - else - qDebug() << "ClientMessage" << xe->xclient.format << xe->xclient.message_type; -#endif - break; - - case Expose: - if (xw) - if (xe->xexpose.count == 0) - xw->paintEvent(); - break; - case ConfigureNotify: - if (xw) - xw->resizeEvent(&xe->xconfigure); - break; - - case ButtonPress: - xw->mousePressEvent(&xe->xbutton); - break; - - case ButtonRelease: - xw->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton); - break; - - case MotionNotify: - xw->handleMouseEvent(QEvent::MouseMove, &xe->xbutton); - break; - - case XKeyPress: - xw->handleKeyEvent(QEvent::KeyPress, &xe->xkey); - break; - - case XKeyRelease: - xw->handleKeyEvent(QEvent::KeyRelease, &xe->xkey); - break; - - case EnterNotify: - xw->handleEnterEvent(); - break; - - case LeaveNotify: - xw->handleLeaveEvent(); - break; - - case XFocusIn: - xw->handleFocusInEvent(); - break; - - case XFocusOut: - xw->handleFocusOutEvent(); - break; - - default: -#ifdef MYX11_DEBUG - qDebug() << hex << xe->xany.window << "Other X event" << xe->type; -#endif - break; - } - return quit; -}; - - - -MyDisplay::MyDisplay() -{ - char *display_name = getenv("DISPLAY"); - display = XOpenDisplay(display_name); - if (!display) { - fprintf(stderr, "Cannot connect to X server: %s\n", - display_name); - exit(1); - } - -#ifndef DONT_USE_MIT_SHM - Status MIT_SHM_extension_supported = XShmQueryExtension (display); - Q_ASSERT(MIT_SHM_extension_supported == True); -#endif - original_x_errhandler = XSetErrorHandler(qt_x_errhandler); - - if (qgetenv("DO_X_SYNCHRONIZE").toInt()) - XSynchronize(display, true); - - screen = DefaultScreen(display); - width = DisplayWidth(display, screen); - height = DisplayHeight(display, screen); - physicalWidth = DisplayWidthMM(display, screen); - physicalHeight = DisplayHeightMM(display, screen); - - int xSocketNumber = XConnectionNumber(display); -#ifdef MYX11_DEBUG - qDebug() << "X socket:"<< xSocketNumber; -#endif - QSocketNotifier *sock = new QSocketNotifier(xSocketNumber, QSocketNotifier::Read, this); - connect(sock, SIGNAL(activated(int)), this, SLOT(eventDispatcher())); - - wmProtocolsAtom = XInternAtom (display, "WM_PROTOCOLS", False); - wmDeleteWindowAtom = XInternAtom (display, "WM_DELETE_WINDOW", False); - - cursors = new MyX11Cursors(display); -} - - -MyDisplay::~MyDisplay() -{ - XCloseDisplay(display); -} - - -void MyDisplay::eventDispatcher() -{ -// qDebug() << "eventDispatcher"; - - - ulong marker = XNextRequest(display); -// int i = 0; - while (XPending(display)) { - XEvent event; - XNextEvent(display, &event); - /* done = */ - handleEvent(&event); - - if (event.xany.serial >= marker) { -#ifdef MYX11_DEBUG - qDebug() << "potential livelock averted"; -#endif -#if 0 - if (XEventsQueued(display, QueuedAfterFlush)) { - qDebug() << " with events queued"; - QTimer::singleShot(0, this, SLOT(eventDispatcher())); - } -#endif - break; - } - } + return x_window; } - -QImage MyDisplay::grabWindow(Window window, int x, int y, int w, int h) +GC QTestLiteWindow::graphicsContext() const { - if (w == 0 || h ==0) - return QImage(); - - //WinId 0 means the desktop widget - if (!window) - window = rootWindow(); - - XWindowAttributes window_attr; - if (!XGetWindowAttributes(display, window, &window_attr)) - return QImage(); - - if (w < 0) - w = window_attr.width - x; - if (h < 0) - h = window_attr.height - y; - - // Ideally, we should also limit ourselves to the screen area, but the Qt docs say - // that it's "unsafe" to go outside the screen, so we can ignore that problem. - - //We're definitely not optimizing for speed... - XImage *xi = XGetImage(display, window, x, y, w, h, AllPlanes, ZPixmap); - - if (!xi) - return QImage(); - - //taking a copy to make sure we have ownership -- not fast - QImage result = QImage( (uchar*) xi->data, xi->width, xi->height, xi->bytes_per_line, QImage::Format_RGB32 ).copy(); - - XDestroyImage(xi); - - return result; + return gc; } - - - - - - QT_END_NAMESPACE -#include "qtestlitewindow.moc" diff --git a/src/plugins/platforms/testlite/qtestlitewindow.h b/src/plugins/platforms/testlite/qtestlitewindow.h index 69442f1..8e9f6fd 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.h +++ b/src/plugins/platforms/testlite/qtestlitewindow.h @@ -42,63 +42,51 @@ #ifndef QTESTLITEWINDOW_H #define QTESTLITEWINDOW_H +#include "qtestliteintegration.h" + #include -#include +#include #include #include -#include -#include - -#include - -#include -#include - - - -class QTestLiteIntegration; -class QTestLiteScreen; -class QTestLiteWindowSurface; -class MyX11Cursors; -class QTestLiteWindow; -class MyDisplay : public QObject -{ - Q_OBJECT; -public: - MyDisplay(); - ~MyDisplay(); +struct QtMWMHints { + ulong flags, functions, decorations; + long input_mode; + ulong status; +}; - Window rootWindow() { return RootWindow(display, screen); } - unsigned long blackPixel() { return BlackPixel(display, screen); } - unsigned long whitePixel() { return WhitePixel(display, screen); } +enum { + MWM_HINTS_FUNCTIONS = (1L << 0), - bool handleEvent(XEvent *xe); - QImage grabWindow(Window window, int x, int y, int w, int h); + MWM_FUNC_ALL = (1L << 0), + MWM_FUNC_RESIZE = (1L << 1), + MWM_FUNC_MOVE = (1L << 2), + MWM_FUNC_MINIMIZE = (1L << 3), + MWM_FUNC_MAXIMIZE = (1L << 4), + MWM_FUNC_CLOSE = (1L << 5), -public slots: - void eventDispatcher(); + MWM_HINTS_DECORATIONS = (1L << 1), -public: //### - Display * display; - int screen; - int width, height; - int physicalWidth; - int physicalHeight; + MWM_DECOR_ALL = (1L << 0), + MWM_DECOR_BORDER = (1L << 1), + MWM_DECOR_RESIZEH = (1L << 2), + MWM_DECOR_TITLE = (1L << 3), + MWM_DECOR_MENU = (1L << 4), + MWM_DECOR_MINIMIZE = (1L << 5), + MWM_DECOR_MAXIMIZE = (1L << 6), - QList windowList; + MWM_HINTS_INPUT_MODE = (1L << 2), - MyX11Cursors * cursors; + MWM_INPUT_MODELESS = 0L, + MWM_INPUT_PRIMARY_APPLICATION_MODAL = 1L, + MWM_INPUT_FULL_APPLICATION_MODAL = 3L }; -struct MyShmImageInfo; - class QTestLiteWindow : public QPlatformWindow { public: - QTestLiteWindow(const QTestLiteIntegration *platformIntegration, - QTestLiteScreen *screen, QWidget *window); + QTestLiteWindow(QWidget *window); ~QTestLiteWindow(); @@ -128,33 +116,29 @@ public: void lower(); void setWindowTitle(const QString &title); - void setCursor(QCursor * cursor); + void setCursor(const Cursor &cursor); QPlatformGLContext *glContext() const; + Window xWindow() const; + GC graphicsContext() const; + +protected: + void setMWMHints(const QtMWMHints &mwmhints); + QtMWMHints getMWMHints() const; + private: - int xpos, ypos; - int width, height; Window x_window; GC gc; GC createGC(); - Cursor createCursorShape(int cshape); - Cursor createCursorBitmap(QCursor * cursor); - - int currentCursor; - - MyDisplay *xd; + QPlatformGLContext *mGLContext; QTestLiteScreen *mScreen; Qt::WindowFlags window_flags; - QPlatformGLContext *mGLContext; - - friend class QTestLiteWindowSurface; // x_window, gc and windowSurface -}; - - + Atom m_mwm_hint_atom; +}; #endif diff --git a/src/plugins/platforms/testlite/qtestlitewindowsurface.cpp b/src/plugins/platforms/testlite/qtestlitewindowsurface.cpp index b3232c8..ced964a 100644 --- a/src/plugins/platforms/testlite/qtestlitewindowsurface.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindowsurface.cpp @@ -46,6 +46,7 @@ #include #include "qtestlitewindow.h" +#include "qtestlitescreen.h" # include # include @@ -65,8 +66,6 @@ struct MyShmImageInfo { Display *display; }; -//void QTestLiteWindowSurface::flush() - #ifndef DONT_USE_MIT_SHM void MyShmImageInfo::destroy() @@ -80,20 +79,21 @@ void MyShmImageInfo::destroy() void QTestLiteWindowSurface::resizeShmImage(int width, int height) { - MyDisplay *xd = xw->xd; #ifdef DONT_USE_MIT_SHM shm_img = QImage(width, height, QImage::Format_RGB32); #else + + QTestLiteScreen *screen = QTestLiteScreen::testLiteScreenForWidget(window()); if (image_info) image_info->destroy(); else - image_info = new MyShmImageInfo(xd->display); + image_info = new MyShmImageInfo(screen->display()); - Visual *visual = DefaultVisual(xd->display, xd->screen); + Visual *visual = DefaultVisual(screen->display(), screen->xScreenNumber()); - XImage *image = XShmCreateImage (xd->display, visual, 24, ZPixmap, 0, + XImage *image = XShmCreateImage (screen->display(), visual, 24, ZPixmap, 0, &image_info->shminfo, width, height); @@ -105,7 +105,7 @@ void QTestLiteWindowSurface::resizeShmImage(int width, int height) image_info->image = image; - Status shm_attach_status = XShmAttach(xd->display, &image_info->shminfo); + Status shm_attach_status = XShmAttach(screen->display(), &image_info->shminfo); Q_ASSERT(shm_attach_status == True); @@ -126,7 +126,7 @@ QSize QTestLiteWindowSurface::bufferSize() const return shm_img.size(); } -QTestLiteWindowSurface::QTestLiteWindowSurface (QTestLiteScreen */*screen*/, QWidget *window) +QTestLiteWindowSurface::QTestLiteWindowSurface (QWidget *window) : QWindowSurface(window), painted(false), image_info(0) { @@ -151,29 +151,27 @@ void QTestLiteWindowSurface::flush(QWidget *widget, const QRegion ®ion, const Q_UNUSED(region); Q_UNUSED(offset); - // qDebug() << "QTestLiteWindowSurface::flush:" << (long)this; - if (!painted) return; - MyDisplay *xd = xw->xd; - GC gc = xw->gc; - Window window = xw->x_window; + QTestLiteScreen *screen = QTestLiteScreen::testLiteScreenForWidget(widget); + GC gc = xw->graphicsContext(); + Window window = xw->xWindow(); #ifdef DONT_USE_MIT_SHM // just convert the image every time... if (!shm_img.isNull()) { - Visual *visual = DefaultVisual(xd->display, xd->screen); + Visual *visual = DefaultVisual(screen->display(), screen->xScreenNumber()); QImage image = shm_img; //img.convertToFormat( - XImage *xi = XCreateImage(xd->display, visual, 24, ZPixmap, + XImage *xi = XCreateImage(screen->display(), visual, 24, ZPixmap, 0, (char *) image.scanLine(0), image.width(), image.height(), 32, image.bytesPerLine()); int x = 0; int y = 0; - /*int r =*/ XPutImage(xd->display, window, gc, xi, 0, 0, x, y, image.width(), image.height()); + /*int r =*/ XPutImage(screen->display(), window, gc, xi, 0, 0, x, y, image.width(), image.height()); xi->data = 0; // QImage owns these bits XDestroyImage(xi); @@ -187,11 +185,11 @@ void QTestLiteWindowSurface::flush(QWidget *widget, const QRegion ®ion, const // We could set send_event to true, and then use the ShmCompletion to synchronize, // but let's do like Qt/11 and just use XSync - XShmPutImage (xd->display, window, gc, image_info->image, 0, 0, + XShmPutImage (screen->display(), window, gc, image_info->image, 0, 0, x, y, image_info->image->width, image_info->image->height, /*send_event*/ False); - XSync(xd->display, False); + XSync(screen->display(), False); } #endif } diff --git a/src/plugins/platforms/testlite/qtestlitewindowsurface.h b/src/plugins/platforms/testlite/qtestlitewindowsurface.h index 915e7fe..ca900e5 100644 --- a/src/plugins/platforms/testlite/qtestlitewindowsurface.h +++ b/src/plugins/platforms/testlite/qtestlitewindowsurface.h @@ -55,7 +55,7 @@ class MyShmImageInfo; class QTestLiteWindowSurface : public QWindowSurface { public: - QTestLiteWindowSurface (QTestLiteScreen *screen, QWidget *window); + QTestLiteWindowSurface (QWidget *window); ~QTestLiteWindowSurface(); QPaintDevice *paintDevice(); diff --git a/src/plugins/platforms/testlite/testlite.pro b/src/plugins/platforms/testlite/testlite.pro index 05bd384..ef977bf 100644 --- a/src/plugins/platforms/testlite/testlite.pro +++ b/src/plugins/platforms/testlite/testlite.pro @@ -7,13 +7,16 @@ SOURCES = \ main.cpp \ qtestliteintegration.cpp \ qtestlitewindowsurface.cpp \ - qtestlitewindow.cpp + qtestlitewindow.cpp \ + qtestlitecursor.cpp \ + qtestlitescreen.cpp HEADERS = \ qtestliteintegration.h \ qtestlitewindowsurface.h \ - qtestlitewindow.h - + qtestlitewindow.h \ + qtestlitecursor.h \ + qtestlitescreen.h LIBS += -lX11 -lXext -- cgit v0.12 From dd72b151b500838475f2ec40695449a37acd3922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Thu, 9 Dec 2010 09:00:02 +0100 Subject: Remove Lighthouse specific code in QGLWidget constructor truth to be told, I can't remember why I decided that it was a good idea to have the code there. But clearly now I don't think so anymore. Such initialisation should happen in qgl_qpa.cpp chooseContext. If we tear down the window and the context then that has to be solved elsewhere. --- src/opengl/opengl.pro.user.2.1pre1 | 83 ++++++++++++++++++++++++++++++++++++++ src/opengl/qgl.cpp | 34 ---------------- src/opengl/qgl_qpa.cpp | 5 --- 3 files changed, 83 insertions(+), 39 deletions(-) create mode 100644 src/opengl/opengl.pro.user.2.1pre1 diff --git a/src/opengl/opengl.pro.user.2.1pre1 b/src/opengl/opengl.pro.user.2.1pre1 new file mode 100644 index 0000000..0c38724 --- /dev/null +++ b/src/opengl/opengl.pro.user.2.1pre1 @@ -0,0 +1,83 @@ + + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + UTF-8 + + + + ProjectExplorer.Project.Target.0 + + Desktop + Qt4ProjectManager.Target.DesktopTarget + 0 + 0 + + + qmake + QtProjectManager.QMakeBuildStep + + QMAKE_ABSOLUTE_SOURCE_PATH=/home/jlind/dev/qt/lighthouse-master/src/opengl + + + + Make + Qt4ProjectManager.MakeStep + false + + -j9 + + + + 2 + + Make + Qt4ProjectManager.MakeStep + true + + clean + + + + 1 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + /home/jlind/builds/master-lighthouse/src/opengl + 23 + 0 + true + + 1 + + headers + Qt4ProjectManager.Qt4RunConfiguration + 2 + + ../../../../../builds/master-lighthouse/include/QtOpenGL/headers.pri + false + false + + false + false + + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 4 + + diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index e9e8880..dac00dc 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -3772,24 +3772,7 @@ QGLWidget::QGLWidget(QWidget *parent, const QGLWidget* shareWidget, Qt::WindowFl setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_NoSystemBackground); setAutoFillBackground(true); // for compatibility -#ifdef Q_WS_QPA - QPlatformWindowFormat platformFormat = QGLFormat::toPlatformWindowFormat(QGLFormat::defaultFormat()); - platformFormat.setUseDefaultSharedContext(false); - if (shareWidget && shareWidget->d_func()->glcx) { - QPlatformGLContext *sharedPlatformContext = shareWidget->d_func()->glcx->d_func()->platformContext; - platformFormat.setSharedContext(sharedPlatformContext); - } - setPlatformWindowFormat(platformFormat); - winId(); // create window; - QGLContext *glContext = 0; - if (platformWindow()) - glContext = QGLContext::fromPlatformGLContext(platformWindow()->glContext()); - if (glContext){ - d->init(glContext,shareWidget); - } -#else d->init(new QGLContext(QGLFormat::defaultFormat(), this), shareWidget); -#endif } @@ -3829,24 +3812,7 @@ QGLWidget::QGLWidget(const QGLFormat &format, QWidget *parent, const QGLWidget* setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_NoSystemBackground); setAutoFillBackground(true); // for compatibility -#ifdef Q_WS_QPA - QPlatformWindowFormat platformFormat = QGLFormat::toPlatformWindowFormat(format); - platformFormat.setUseDefaultSharedContext(false); - if (shareWidget && shareWidget->d_func()->glcx) { - QPlatformGLContext *sharedPlatformContext = shareWidget->d_func()->glcx->d_func()->platformContext; - platformFormat.setSharedContext(sharedPlatformContext); - } - setPlatformWindowFormat(platformFormat); - winId(); // create window; - QGLContext *glContext = 0; - if (platformWindow()) - glContext = QGLContext::fromPlatformGLContext(platformWindow()->glContext()); - if (glContext){ - d->init(glContext,shareWidget); - } -#else d->init(new QGLContext(format, this), shareWidget); -#endif } /*! diff --git a/src/opengl/qgl_qpa.cpp b/src/opengl/qgl_qpa.cpp index 415e915..52eb57f 100644 --- a/src/opengl/qgl_qpa.cpp +++ b/src/opengl/qgl_qpa.cpp @@ -325,11 +325,6 @@ void QGLWidget::setMouseTracking(bool enable) bool QGLWidget::event(QEvent *e) { Q_D(QGLWidget); - if (e->type() == QEvent::WinIdChange) { - if (platformWindow()) { - d->glcx = QGLContext::fromPlatformGLContext(platformWindow()->glContext()); - } - } return QWidget::event(e); } -- cgit v0.12 From 90de48493be283b9afb249f6a0fd8dbd8958517d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 10 Dec 2010 16:43:16 +0100 Subject: Handle the QWidgetPrivate::mapper structure Dont have widgets without a valid winId there --- src/gui/kernel/qwidget_qpa.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/kernel/qwidget_qpa.cpp b/src/gui/kernel/qwidget_qpa.cpp index 24ab8f7..560c9cd 100644 --- a/src/gui/kernel/qwidget_qpa.cpp +++ b/src/gui/kernel/qwidget_qpa.cpp @@ -768,6 +768,7 @@ void QWidgetPrivate::deleteTLSysExtra() context->deleteQGLContext(); } } + setWinId(0); delete extra->topextra->platformWindow; extra->topextra->platformWindow = 0; extra->topextra->backingStore.destroy(); -- cgit v0.12 From d0414bd582190e205aa698f5cb24f1c6909d8222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 10 Dec 2010 16:44:44 +0100 Subject: Dont do backingStore.destroy in deleteTLSysExtra It is done by QWidgetPrivate::deleteExtra() --- src/gui/kernel/qwidget_qpa.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/kernel/qwidget_qpa.cpp b/src/gui/kernel/qwidget_qpa.cpp index 560c9cd..dce23a3 100644 --- a/src/gui/kernel/qwidget_qpa.cpp +++ b/src/gui/kernel/qwidget_qpa.cpp @@ -771,7 +771,6 @@ void QWidgetPrivate::deleteTLSysExtra() setWinId(0); delete extra->topextra->platformWindow; extra->topextra->platformWindow = 0; - extra->topextra->backingStore.destroy(); } } -- cgit v0.12 From e90cb6992e35ed4b9c2aae85edb8d787c24a8a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 14 Dec 2010 17:08:55 +0100 Subject: Fix gstreamer phonon build on X11 I added an x11{ } clause in the pro file for the plugin. But as it turnes out the x11 clause is defined in gui.pro so it is not available for use in any other pro or pri files. Also fixed a missing !qpa in qttest_p4.prf --- mkspecs/features/qttest_p4.prf | 2 +- src/plugins/phonon/gstreamer/gstreamer.pro | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mkspecs/features/qttest_p4.prf b/mkspecs/features/qttest_p4.prf index 2ee148b..26f4b35 100644 --- a/mkspecs/features/qttest_p4.prf +++ b/mkspecs/features/qttest_p4.prf @@ -2,7 +2,7 @@ isEmpty(TEMPLATE):TEMPLATE=app CONFIG += qt warn_on console depend_includepath testcase # x11 is not defined by configure (the following line is copied from gui.pro) -!win32:!embedded:!mac:!symbian:CONFIG += x11 +!win32:!embedded:!qpa:!mac:!symbian:CONFIG += x11 qtAddLibrary(QtTest) diff --git a/src/plugins/phonon/gstreamer/gstreamer.pro b/src/plugins/phonon/gstreamer/gstreamer.pro index 02e0848..c0d2604 100644 --- a/src/plugins/phonon/gstreamer/gstreamer.pro +++ b/src/plugins/phonon/gstreamer/gstreamer.pro @@ -58,7 +58,7 @@ SOURCES += $$PHONON_GSTREAMER_DIR/abstractrenderer.cpp \ $$PHONON_GSTREAMER_DIR/volumefadereffect.cpp \ $$PHONON_GSTREAMER_DIR/widgetrenderer.cpp -x11 { +!qpa:!embedded{ HEADERS += $$PHONON_GSTREAMER_DIR/x11renderer.h SOURCES += $$PHONON_GSTREAMER_DIR/x11renderer.cpp } -- cgit v0.12 From a7fc0e8bad3bd020ece5fa70f0462bcaf59b3d77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 14 Dec 2010 17:15:44 +0100 Subject: Fix nativechild widget position in Lighthouse --- src/gui/kernel/qwidget_qpa.cpp | 16 ++++++---------- src/plugins/platforms/testlite/qtestlitewindow.cpp | 11 ++++++----- src/plugins/platforms/testlite/qtestlitewindow.h | 3 --- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/gui/kernel/qwidget_qpa.cpp b/src/gui/kernel/qwidget_qpa.cpp index dce23a3..001810e 100644 --- a/src/gui/kernel/qwidget_qpa.cpp +++ b/src/gui/kernel/qwidget_qpa.cpp @@ -162,7 +162,6 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) { Q_Q(QWidget); - // QWidget *oldParent = q->parentWidget(); Qt::WindowFlags oldFlags = data.window_flags; int targetScreen = -1; @@ -214,13 +213,6 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) data.window_flags = window->setWindowFlags(data.window_flags); } - // Reparenting child to toplevel - if ((f&Qt::Window) && !(oldFlags&Qt::Window)) { - //qDebug() << "setParent_sys() change to toplevel"; - q->create(); //### too early: this ought to happen at show() time - } - - if (q->isWindow() || (!newparent || newparent->isVisible()) || explicitlyHidden) q->setAttribute(Qt::WA_WState_Hidden); q->setAttribute(Qt::WA_WState_ExplicitShowHide, explicitlyHidden); @@ -396,7 +388,11 @@ void QWidgetPrivate::show_sys() QPlatformWindow *window = q->platformWindow(); if (window) { - const QRect geomRect = q->geometry(); + QRect geomRect = q->geometry(); + if (!q->isWindow()) { + QPoint topLeftOfWindow = q->mapTo(q->nativeParentWidget(),QPoint()); + geomRect.moveTopLeft(topLeftOfWindow); + } const QRect windowRect = window->geometry(); if (windowRect != geomRect) { window->setGeometry(geomRect); @@ -591,7 +587,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) if (q->isVisible()) { if (q->platformWindow()) { if (q->isWindow()) { - q->platformWindow()->setGeometry(q->frameGeometry()); + q->platformWindow()->setGeometry(q->geometry()); } else { QPoint posInNativeParent = q->mapTo(q->nativeParentWidget(),QPoint()); q->platformWindow()->setGeometry(QRect(posInNativeParent,r.size())); diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index f8f4a5f..5446615 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -71,8 +71,7 @@ QTestLiteWindow::QTestLiteWindow(QWidget *window) int h = window->height(); if(window->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL - && QApplicationPrivate - ::platformIntegration()->hasOpenGL() ) { + && QApplicationPrivate::platformIntegration()->hasOpenGL() ) { #ifndef QT_NO_OPENGL XVisualInfo *visualInfo = QGLXContext::findVisualInfo(mScreen,window->platformWindowFormat()); Colormap cmap = XCreateColormap(mScreen->display(),mScreen->rootWindow(),visualInfo->visual,AllocNone); @@ -117,6 +116,7 @@ QTestLiteWindow::QTestLiteWindow(QWidget *window) } + QTestLiteWindow::~QTestLiteWindow() { #ifdef MYX11_DEBUG @@ -557,8 +557,8 @@ WId QTestLiteWindow::winId() const void QTestLiteWindow::setParent(const QPlatformWindow *window) { - QPoint point = widget()->mapTo(widget()->nativeParentWidget(),QPoint()); - XReparentWindow(mScreen->display(),x_window,window->winId(),point.x(),point.y()); + QPoint topLeft = geometry().topLeft(); + XReparentWindow(mScreen->display(),x_window,window->winId(),topLeft.x(),topLeft.y()); } void QTestLiteWindow::raise() @@ -624,7 +624,8 @@ void QTestLiteWindow::resizeEvent(XConfigureEvent *e) qDebug() << hex << x_window << dec << "ConfigureNotify" << e->x << e->y << e->width << e->height << "geometry" << xpos << ypos << width << height; #endif - QWindowSystemInterface::handleGeometryChange(widget(), QRect(xpos, ypos, e->width, e->height)); + QRect newRect(xpos, ypos, e->width, e->height); + QWindowSystemInterface::handleGeometryChange(widget(), newRect); } void QTestLiteWindow::mousePressEvent(XButtonEvent *e) diff --git a/src/plugins/platforms/testlite/qtestlitewindow.h b/src/plugins/platforms/testlite/qtestlitewindow.h index 8e9f6fd..7e990ee 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.h +++ b/src/plugins/platforms/testlite/qtestlitewindow.h @@ -136,9 +136,6 @@ private: QPlatformGLContext *mGLContext; QTestLiteScreen *mScreen; Qt::WindowFlags window_flags; - - Atom m_mwm_hint_atom; - }; #endif -- cgit v0.12 From fc79d664af9fe3396badac8d1829623118e827fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 17 Dec 2010 07:58:43 +0100 Subject: Remove current cursor optimization It was broken since it didn't take care of the initial cursor. --- src/plugins/platforms/testlite/qtestlitecursor.cpp | 3 +-- src/plugins/platforms/testlite/qtestlitecursor.h | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plugins/platforms/testlite/qtestlitecursor.cpp b/src/plugins/platforms/testlite/qtestlitecursor.cpp index 4f3f0cb..e9e6eb7 100644 --- a/src/plugins/platforms/testlite/qtestlitecursor.cpp +++ b/src/plugins/platforms/testlite/qtestlitecursor.cpp @@ -71,8 +71,7 @@ void QTestLiteCursor::changeCursor(QCursor *cursor, QWidget *widget) return; int id = cursor->handle(); - if (id == currentCursor) - return; + Cursor c; if (!cursorMap.contains(id)) { if (cursor->shape() == Qt::BitmapCursor) diff --git a/src/plugins/platforms/testlite/qtestlitecursor.h b/src/plugins/platforms/testlite/qtestlitecursor.h index 15a5b2a..bb3549e 100644 --- a/src/plugins/platforms/testlite/qtestlitecursor.h +++ b/src/plugins/platforms/testlite/qtestlitecursor.h @@ -60,7 +60,6 @@ private: Cursor createCursorShape(int cshape); QTestLiteScreen *testLiteScreen() const; - int currentCursor; QMap cursorMap; }; -- cgit v0.12 From 683263e4010e3e1797221edb73d91471aea7b93a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 17 Dec 2010 08:02:04 +0100 Subject: Refactored the keyboard event handling in testlite --- .../platforms/testlite/qtestlitekeyboard.cpp | 943 +++++++++++++++++++++ src/plugins/platforms/testlite/qtestlitekeyboard.h | 35 + src/plugins/platforms/testlite/qtestlitescreen.cpp | 11 +- src/plugins/platforms/testlite/qtestlitescreen.h | 3 + src/plugins/platforms/testlite/qtestlitewindow.cpp | 329 +------ src/plugins/platforms/testlite/qtestlitewindow.h | 1 - src/plugins/platforms/testlite/testlite.pro | 6 +- 7 files changed, 997 insertions(+), 331 deletions(-) create mode 100644 src/plugins/platforms/testlite/qtestlitekeyboard.cpp create mode 100644 src/plugins/platforms/testlite/qtestlitekeyboard.h diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp new file mode 100644 index 0000000..c18de59 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp @@ -0,0 +1,943 @@ +#include "qtestlitekeyboard.h" + +#include "qtestlitescreen.h" + +#include + +#include + +#ifndef XK_ISO_Left_Tab +#define XK_ISO_Left_Tab 0xFE20 +#endif + +#ifndef XK_dead_hook +#define XK_dead_hook 0xFE61 +#endif + +#ifndef XK_dead_horn +#define XK_dead_horn 0xFE62 +#endif + +#ifndef XK_Codeinput +#define XK_Codeinput 0xFF37 +#endif + +#ifndef XK_Kanji_Bangou +#define XK_Kanji_Bangou 0xFF37 /* same as codeinput */ +#endif + +// Fix old X libraries +#ifndef XK_KP_Home +#define XK_KP_Home 0xFF95 +#endif +#ifndef XK_KP_Left +#define XK_KP_Left 0xFF96 +#endif +#ifndef XK_KP_Up +#define XK_KP_Up 0xFF97 +#endif +#ifndef XK_KP_Right +#define XK_KP_Right 0xFF98 +#endif +#ifndef XK_KP_Down +#define XK_KP_Down 0xFF99 +#endif +#ifndef XK_KP_Prior +#define XK_KP_Prior 0xFF9A +#endif +#ifndef XK_KP_Next +#define XK_KP_Next 0xFF9B +#endif +#ifndef XK_KP_End +#define XK_KP_End 0xFF9C +#endif +#ifndef XK_KP_Insert +#define XK_KP_Insert 0xFF9E +#endif +#ifndef XK_KP_Delete +#define XK_KP_Delete 0xFF9F +#endif + +// the next lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special +// multimedia keys. They are included here as not every system has them. +#define XF86XK_MonBrightnessUp 0x1008FF02 +#define XF86XK_MonBrightnessDown 0x1008FF03 +#define XF86XK_KbdLightOnOff 0x1008FF04 +#define XF86XK_KbdBrightnessUp 0x1008FF05 +#define XF86XK_KbdBrightnessDown 0x1008FF06 +#define XF86XK_Standby 0x1008FF10 +#define XF86XK_AudioLowerVolume 0x1008FF11 +#define XF86XK_AudioMute 0x1008FF12 +#define XF86XK_AudioRaiseVolume 0x1008FF13 +#define XF86XK_AudioPlay 0x1008FF14 +#define XF86XK_AudioStop 0x1008FF15 +#define XF86XK_AudioPrev 0x1008FF16 +#define XF86XK_AudioNext 0x1008FF17 +#define XF86XK_HomePage 0x1008FF18 +#define XF86XK_Mail 0x1008FF19 +#define XF86XK_Start 0x1008FF1A +#define XF86XK_Search 0x1008FF1B +#define XF86XK_AudioRecord 0x1008FF1C +#define XF86XK_Calculator 0x1008FF1D +#define XF86XK_Memo 0x1008FF1E +#define XF86XK_ToDoList 0x1008FF1F +#define XF86XK_Calendar 0x1008FF20 +#define XF86XK_PowerDown 0x1008FF21 +#define XF86XK_ContrastAdjust 0x1008FF22 +#define XF86XK_Back 0x1008FF26 +#define XF86XK_Forward 0x1008FF27 +#define XF86XK_Stop 0x1008FF28 +#define XF86XK_Refresh 0x1008FF29 +#define XF86XK_PowerOff 0x1008FF2A +#define XF86XK_WakeUp 0x1008FF2B +#define XF86XK_Eject 0x1008FF2C +#define XF86XK_ScreenSaver 0x1008FF2D +#define XF86XK_WWW 0x1008FF2E +#define XF86XK_Sleep 0x1008FF2F +#define XF86XK_Favorites 0x1008FF30 +#define XF86XK_AudioPause 0x1008FF31 +#define XF86XK_AudioMedia 0x1008FF32 +#define XF86XK_MyComputer 0x1008FF33 +#define XF86XK_LightBulb 0x1008FF35 +#define XF86XK_Shop 0x1008FF36 +#define XF86XK_History 0x1008FF37 +#define XF86XK_OpenURL 0x1008FF38 +#define XF86XK_AddFavorite 0x1008FF39 +#define XF86XK_HotLinks 0x1008FF3A +#define XF86XK_BrightnessAdjust 0x1008FF3B +#define XF86XK_Finance 0x1008FF3C +#define XF86XK_Community 0x1008FF3D +#define XF86XK_AudioRewind 0x1008FF3E +#define XF86XK_BackForward 0x1008FF3F +#define XF86XK_Launch0 0x1008FF40 +#define XF86XK_Launch1 0x1008FF41 +#define XF86XK_Launch2 0x1008FF42 +#define XF86XK_Launch3 0x1008FF43 +#define XF86XK_Launch4 0x1008FF44 +#define XF86XK_Launch5 0x1008FF45 +#define XF86XK_Launch6 0x1008FF46 +#define XF86XK_Launch7 0x1008FF47 +#define XF86XK_Launch8 0x1008FF48 +#define XF86XK_Launch9 0x1008FF49 +#define XF86XK_LaunchA 0x1008FF4A +#define XF86XK_LaunchB 0x1008FF4B +#define XF86XK_LaunchC 0x1008FF4C +#define XF86XK_LaunchD 0x1008FF4D +#define XF86XK_LaunchE 0x1008FF4E +#define XF86XK_LaunchF 0x1008FF4F +#define XF86XK_ApplicationLeft 0x1008FF50 +#define XF86XK_ApplicationRight 0x1008FF51 +#define XF86XK_Book 0x1008FF52 +#define XF86XK_CD 0x1008FF53 +#define XF86XK_Calculater 0x1008FF54 +#define XF86XK_Clear 0x1008FF55 +#define XF86XK_ClearGrab 0x1008FE21 +#define XF86XK_Close 0x1008FF56 +#define XF86XK_Copy 0x1008FF57 +#define XF86XK_Cut 0x1008FF58 +#define XF86XK_Display 0x1008FF59 +#define XF86XK_DOS 0x1008FF5A +#define XF86XK_Documents 0x1008FF5B +#define XF86XK_Excel 0x1008FF5C +#define XF86XK_Explorer 0x1008FF5D +#define XF86XK_Game 0x1008FF5E +#define XF86XK_Go 0x1008FF5F +#define XF86XK_iTouch 0x1008FF60 +#define XF86XK_LogOff 0x1008FF61 +#define XF86XK_Market 0x1008FF62 +#define XF86XK_Meeting 0x1008FF63 +#define XF86XK_MenuKB 0x1008FF65 +#define XF86XK_MenuPB 0x1008FF66 +#define XF86XK_MySites 0x1008FF67 +#define XF86XK_News 0x1008FF69 +#define XF86XK_OfficeHome 0x1008FF6A +#define XF86XK_Option 0x1008FF6C +#define XF86XK_Paste 0x1008FF6D +#define XF86XK_Phone 0x1008FF6E +#define XF86XK_Reply 0x1008FF72 +#define XF86XK_Reload 0x1008FF73 +#define XF86XK_RotateWindows 0x1008FF74 +#define XF86XK_RotationPB 0x1008FF75 +#define XF86XK_RotationKB 0x1008FF76 +#define XF86XK_Save 0x1008FF77 +#define XF86XK_Send 0x1008FF7B +#define XF86XK_Spell 0x1008FF7C +#define XF86XK_SplitScreen 0x1008FF7D +#define XF86XK_Support 0x1008FF7E +#define XF86XK_TaskPane 0x1008FF7F +#define XF86XK_Terminal 0x1008FF80 +#define XF86XK_Tools 0x1008FF81 +#define XF86XK_Travel 0x1008FF82 +#define XF86XK_Video 0x1008FF87 +#define XF86XK_Word 0x1008FF89 +#define XF86XK_Xfer 0x1008FF8A +#define XF86XK_ZoomIn 0x1008FF8B +#define XF86XK_ZoomOut 0x1008FF8C +#define XF86XK_Away 0x1008FF8D +#define XF86XK_Messenger 0x1008FF8E +#define XF86XK_WebCam 0x1008FF8F +#define XF86XK_MailForward 0x1008FF90 +#define XF86XK_Pictures 0x1008FF91 +#define XF86XK_Music 0x1008FF92 +#define XF86XK_Battery 0x1008FF93 +#define XF86XK_Bluetooth 0x1008FF94 +#define XF86XK_WLAN 0x1008FF95 +#define XF86XK_UWB 0x1008FF96 +#define XF86XK_AudioForward 0x1008FF97 +#define XF86XK_AudioRepeat 0x1008FF98 +#define XF86XK_AudioRandomPlay 0x1008FF99 +#define XF86XK_Subtitle 0x1008FF9A +#define XF86XK_AudioCycleTrack 0x1008FF9B +#define XF86XK_Time 0x1008FF9F +#define XF86XK_Select 0x1008FFA0 +#define XF86XK_View 0x1008FFA1 +#define XF86XK_TopMenu 0x1008FFA2 +#define XF86XK_Suspend 0x1008FFA7 +#define XF86XK_Hibernate 0x1008FFA8 + + +// end of XF86keysyms.h + +// Special keys used by Qtopia, mapped into the X11 private keypad range. +#define QTOPIAXK_Select 0x11000601 +#define QTOPIAXK_Yes 0x11000602 +#define QTOPIAXK_No 0x11000603 +#define QTOPIAXK_Cancel 0x11000604 +#define QTOPIAXK_Printer 0x11000605 +#define QTOPIAXK_Execute 0x11000606 +#define QTOPIAXK_Sleep 0x11000607 +#define QTOPIAXK_Play 0x11000608 +#define QTOPIAXK_Zoom 0x11000609 +#define QTOPIAXK_Context1 0x1100060A +#define QTOPIAXK_Context2 0x1100060B +#define QTOPIAXK_Context3 0x1100060C +#define QTOPIAXK_Context4 0x1100060D +#define QTOPIAXK_Call 0x1100060E +#define QTOPIAXK_Hangup 0x1100060F +#define QTOPIAXK_Flip 0x11000610 + +// keyboard mapping table +static const unsigned int KeyTbl[] = { + + // misc keys + + XK_Escape, Qt::Key_Escape, + XK_Tab, Qt::Key_Tab, + XK_ISO_Left_Tab, Qt::Key_Backtab, + XK_BackSpace, Qt::Key_Backspace, + XK_Return, Qt::Key_Return, + XK_Insert, Qt::Key_Insert, + XK_Delete, Qt::Key_Delete, + XK_Clear, Qt::Key_Delete, + XK_Pause, Qt::Key_Pause, + XK_Print, Qt::Key_Print, + 0x1005FF60, Qt::Key_SysReq, // hardcoded Sun SysReq + 0x1007ff00, Qt::Key_SysReq, // hardcoded X386 SysReq + + // cursor movement + + XK_Home, Qt::Key_Home, + XK_End, Qt::Key_End, + XK_Left, Qt::Key_Left, + XK_Up, Qt::Key_Up, + XK_Right, Qt::Key_Right, + XK_Down, Qt::Key_Down, + XK_Prior, Qt::Key_PageUp, + XK_Next, Qt::Key_PageDown, + + // modifiers + + XK_Shift_L, Qt::Key_Shift, + XK_Shift_R, Qt::Key_Shift, + XK_Shift_Lock, Qt::Key_Shift, + XK_Control_L, Qt::Key_Control, + XK_Control_R, Qt::Key_Control, + XK_Meta_L, Qt::Key_Meta, + XK_Meta_R, Qt::Key_Meta, + XK_Alt_L, Qt::Key_Alt, + XK_Alt_R, Qt::Key_Alt, + XK_Caps_Lock, Qt::Key_CapsLock, + XK_Num_Lock, Qt::Key_NumLock, + XK_Scroll_Lock, Qt::Key_ScrollLock, + XK_Super_L, Qt::Key_Super_L, + XK_Super_R, Qt::Key_Super_R, + XK_Menu, Qt::Key_Menu, + XK_Hyper_L, Qt::Key_Hyper_L, + XK_Hyper_R, Qt::Key_Hyper_R, + XK_Help, Qt::Key_Help, + 0x1000FF74, Qt::Key_Backtab, // hardcoded HP backtab + 0x1005FF10, Qt::Key_F11, // hardcoded Sun F36 (labeled F11) + 0x1005FF11, Qt::Key_F12, // hardcoded Sun F37 (labeled F12) + + // numeric and function keypad keys + + XK_KP_Space, Qt::Key_Space, + XK_KP_Tab, Qt::Key_Tab, + XK_KP_Enter, Qt::Key_Enter, + //XK_KP_F1, Qt::Key_F1, + //XK_KP_F2, Qt::Key_F2, + //XK_KP_F3, Qt::Key_F3, + //XK_KP_F4, Qt::Key_F4, + XK_KP_Home, Qt::Key_Home, + XK_KP_Left, Qt::Key_Left, + XK_KP_Up, Qt::Key_Up, + XK_KP_Right, Qt::Key_Right, + XK_KP_Down, Qt::Key_Down, + XK_KP_Prior, Qt::Key_PageUp, + XK_KP_Next, Qt::Key_PageDown, + XK_KP_End, Qt::Key_End, + XK_KP_Begin, Qt::Key_Clear, + XK_KP_Insert, Qt::Key_Insert, + XK_KP_Delete, Qt::Key_Delete, + XK_KP_Equal, Qt::Key_Equal, + XK_KP_Multiply, Qt::Key_Asterisk, + XK_KP_Add, Qt::Key_Plus, + XK_KP_Separator, Qt::Key_Comma, + XK_KP_Subtract, Qt::Key_Minus, + XK_KP_Decimal, Qt::Key_Period, + XK_KP_Divide, Qt::Key_Slash, + + // International input method support keys + + // International & multi-key character composition + XK_ISO_Level3_Shift, Qt::Key_AltGr, + XK_Multi_key, Qt::Key_Multi_key, + XK_Codeinput, Qt::Key_Codeinput, + XK_SingleCandidate, Qt::Key_SingleCandidate, + XK_MultipleCandidate, Qt::Key_MultipleCandidate, + XK_PreviousCandidate, Qt::Key_PreviousCandidate, + + // Misc Functions + XK_Mode_switch, Qt::Key_Mode_switch, + XK_script_switch, Qt::Key_Mode_switch, + + // Japanese keyboard support + XK_Kanji, Qt::Key_Kanji, + XK_Muhenkan, Qt::Key_Muhenkan, + //XK_Henkan_Mode, Qt::Key_Henkan_Mode, + XK_Henkan_Mode, Qt::Key_Henkan, + XK_Henkan, Qt::Key_Henkan, + XK_Romaji, Qt::Key_Romaji, + XK_Hiragana, Qt::Key_Hiragana, + XK_Katakana, Qt::Key_Katakana, + XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana, + XK_Zenkaku, Qt::Key_Zenkaku, + XK_Hankaku, Qt::Key_Hankaku, + XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku, + XK_Touroku, Qt::Key_Touroku, + XK_Massyo, Qt::Key_Massyo, + XK_Kana_Lock, Qt::Key_Kana_Lock, + XK_Kana_Shift, Qt::Key_Kana_Shift, + XK_Eisu_Shift, Qt::Key_Eisu_Shift, + XK_Eisu_toggle, Qt::Key_Eisu_toggle, + //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou, + //XK_Zen_Koho, Qt::Key_Zen_Koho, + //XK_Mae_Koho, Qt::Key_Mae_Koho, + XK_Kanji_Bangou, Qt::Key_Codeinput, + XK_Zen_Koho, Qt::Key_MultipleCandidate, + XK_Mae_Koho, Qt::Key_PreviousCandidate, + +#ifdef XK_KOREAN + // Korean keyboard support + XK_Hangul, Qt::Key_Hangul, + XK_Hangul_Start, Qt::Key_Hangul_Start, + XK_Hangul_End, Qt::Key_Hangul_End, + XK_Hangul_Hanja, Qt::Key_Hangul_Hanja, + XK_Hangul_Jamo, Qt::Key_Hangul_Jamo, + XK_Hangul_Romaja, Qt::Key_Hangul_Romaja, + //XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput, + XK_Hangul_Codeinput, Qt::Key_Codeinput, + XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja, + XK_Hangul_Banja, Qt::Key_Hangul_Banja, + XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja, + XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja, + //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate, + //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate, + //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate, + XK_Hangul_SingleCandidate, Qt::Key_SingleCandidate, + XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate, + XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate, + XK_Hangul_Special, Qt::Key_Hangul_Special, + //XK_Hangul_switch, Qt::Key_Hangul_switch, + XK_Hangul_switch, Qt::Key_Mode_switch, +#endif // XK_KOREAN + + // dead keys + XK_dead_grave, Qt::Key_Dead_Grave, + XK_dead_acute, Qt::Key_Dead_Acute, + XK_dead_circumflex, Qt::Key_Dead_Circumflex, + XK_dead_tilde, Qt::Key_Dead_Tilde, + XK_dead_macron, Qt::Key_Dead_Macron, + XK_dead_breve, Qt::Key_Dead_Breve, + XK_dead_abovedot, Qt::Key_Dead_Abovedot, + XK_dead_diaeresis, Qt::Key_Dead_Diaeresis, + XK_dead_abovering, Qt::Key_Dead_Abovering, + XK_dead_doubleacute, Qt::Key_Dead_Doubleacute, + XK_dead_caron, Qt::Key_Dead_Caron, + XK_dead_cedilla, Qt::Key_Dead_Cedilla, + XK_dead_ogonek, Qt::Key_Dead_Ogonek, + XK_dead_iota, Qt::Key_Dead_Iota, + XK_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound, + XK_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound, + XK_dead_belowdot, Qt::Key_Dead_Belowdot, + XK_dead_hook, Qt::Key_Dead_Hook, + XK_dead_horn, Qt::Key_Dead_Horn, + + // Special keys from X.org - This include multimedia keys, + // wireless/bluetooth/uwb keys, special launcher keys, etc. + XF86XK_Back, Qt::Key_Back, + XF86XK_Forward, Qt::Key_Forward, + XF86XK_Stop, Qt::Key_Stop, + XF86XK_Refresh, Qt::Key_Refresh, + XF86XK_Favorites, Qt::Key_Favorites, + XF86XK_AudioMedia, Qt::Key_LaunchMedia, + XF86XK_OpenURL, Qt::Key_OpenUrl, + XF86XK_HomePage, Qt::Key_HomePage, + XF86XK_Search, Qt::Key_Search, + XF86XK_AudioLowerVolume, Qt::Key_VolumeDown, + XF86XK_AudioMute, Qt::Key_VolumeMute, + XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp, + XF86XK_AudioPlay, Qt::Key_MediaPlay, + XF86XK_AudioStop, Qt::Key_MediaStop, + XF86XK_AudioPrev, Qt::Key_MediaPrevious, + XF86XK_AudioNext, Qt::Key_MediaNext, + XF86XK_AudioRecord, Qt::Key_MediaRecord, + XF86XK_Mail, Qt::Key_LaunchMail, + XF86XK_MyComputer, Qt::Key_Launch0, // ### Qt 5: remap properly + XF86XK_Calculator, Qt::Key_Launch1, + XF86XK_Memo, Qt::Key_Memo, + XF86XK_ToDoList, Qt::Key_ToDoList, + XF86XK_Calendar, Qt::Key_Calendar, + XF86XK_PowerDown, Qt::Key_PowerDown, + XF86XK_ContrastAdjust, Qt::Key_ContrastAdjust, + XF86XK_Standby, Qt::Key_Standby, + XF86XK_MonBrightnessUp, Qt::Key_MonBrightnessUp, + XF86XK_MonBrightnessDown, Qt::Key_MonBrightnessDown, + XF86XK_KbdLightOnOff, Qt::Key_KeyboardLightOnOff, + XF86XK_KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp, + XF86XK_KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown, + XF86XK_PowerOff, Qt::Key_PowerOff, + XF86XK_WakeUp, Qt::Key_WakeUp, + XF86XK_Eject, Qt::Key_Eject, + XF86XK_ScreenSaver, Qt::Key_ScreenSaver, + XF86XK_WWW, Qt::Key_WWW, + XF86XK_Sleep, Qt::Key_Sleep, + XF86XK_LightBulb, Qt::Key_LightBulb, + XF86XK_Shop, Qt::Key_Shop, + XF86XK_History, Qt::Key_History, + XF86XK_AddFavorite, Qt::Key_AddFavorite, + XF86XK_HotLinks, Qt::Key_HotLinks, + XF86XK_BrightnessAdjust, Qt::Key_BrightnessAdjust, + XF86XK_Finance, Qt::Key_Finance, + XF86XK_Community, Qt::Key_Community, + XF86XK_AudioRewind, Qt::Key_AudioRewind, + XF86XK_BackForward, Qt::Key_BackForward, + XF86XK_ApplicationLeft, Qt::Key_ApplicationLeft, + XF86XK_ApplicationRight, Qt::Key_ApplicationRight, + XF86XK_Book, Qt::Key_Book, + XF86XK_CD, Qt::Key_CD, + XF86XK_Calculater, Qt::Key_Calculator, + XF86XK_Clear, Qt::Key_Clear, + XF86XK_ClearGrab, Qt::Key_ClearGrab, + XF86XK_Close, Qt::Key_Close, + XF86XK_Copy, Qt::Key_Copy, + XF86XK_Cut, Qt::Key_Cut, + XF86XK_Display, Qt::Key_Display, + XF86XK_DOS, Qt::Key_DOS, + XF86XK_Documents, Qt::Key_Documents, + XF86XK_Excel, Qt::Key_Excel, + XF86XK_Explorer, Qt::Key_Explorer, + XF86XK_Game, Qt::Key_Game, + XF86XK_Go, Qt::Key_Go, + XF86XK_iTouch, Qt::Key_iTouch, + XF86XK_LogOff, Qt::Key_LogOff, + XF86XK_Market, Qt::Key_Market, + XF86XK_Meeting, Qt::Key_Meeting, + XF86XK_MenuKB, Qt::Key_MenuKB, + XF86XK_MenuPB, Qt::Key_MenuPB, + XF86XK_MySites, Qt::Key_MySites, + XF86XK_News, Qt::Key_News, + XF86XK_OfficeHome, Qt::Key_OfficeHome, + XF86XK_Option, Qt::Key_Option, + XF86XK_Paste, Qt::Key_Paste, + XF86XK_Phone, Qt::Key_Phone, + XF86XK_Reply, Qt::Key_Reply, + XF86XK_Reload, Qt::Key_Reload, + XF86XK_RotateWindows, Qt::Key_RotateWindows, + XF86XK_RotationPB, Qt::Key_RotationPB, + XF86XK_RotationKB, Qt::Key_RotationKB, + XF86XK_Save, Qt::Key_Save, + XF86XK_Send, Qt::Key_Send, + XF86XK_Spell, Qt::Key_Spell, + XF86XK_SplitScreen, Qt::Key_SplitScreen, + XF86XK_Support, Qt::Key_Support, + XF86XK_TaskPane, Qt::Key_TaskPane, + XF86XK_Terminal, Qt::Key_Terminal, + XF86XK_Tools, Qt::Key_Tools, + XF86XK_Travel, Qt::Key_Travel, + XF86XK_Video, Qt::Key_Video, + XF86XK_Word, Qt::Key_Word, + XF86XK_Xfer, Qt::Key_Xfer, + XF86XK_ZoomIn, Qt::Key_ZoomIn, + XF86XK_ZoomOut, Qt::Key_ZoomOut, + XF86XK_Away, Qt::Key_Away, + XF86XK_Messenger, Qt::Key_Messenger, + XF86XK_WebCam, Qt::Key_WebCam, + XF86XK_MailForward, Qt::Key_MailForward, + XF86XK_Pictures, Qt::Key_Pictures, + XF86XK_Music, Qt::Key_Music, + XF86XK_Battery, Qt::Key_Battery, + XF86XK_Bluetooth, Qt::Key_Bluetooth, + XF86XK_WLAN, Qt::Key_WLAN, + XF86XK_UWB, Qt::Key_UWB, + XF86XK_AudioForward, Qt::Key_AudioForward, + XF86XK_AudioRepeat, Qt::Key_AudioRepeat, + XF86XK_AudioRandomPlay, Qt::Key_AudioRandomPlay, + XF86XK_Subtitle, Qt::Key_Subtitle, + XF86XK_AudioCycleTrack, Qt::Key_AudioCycleTrack, + XF86XK_Time, Qt::Key_Time, + XF86XK_Select, Qt::Key_Select, + XF86XK_View, Qt::Key_View, + XF86XK_TopMenu, Qt::Key_TopMenu, + XF86XK_Bluetooth, Qt::Key_Bluetooth, + XF86XK_Suspend, Qt::Key_Suspend, + XF86XK_Hibernate, Qt::Key_Hibernate, + XF86XK_Launch0, Qt::Key_Launch2, // ### Qt 5: remap properly + XF86XK_Launch1, Qt::Key_Launch3, + XF86XK_Launch2, Qt::Key_Launch4, + XF86XK_Launch3, Qt::Key_Launch5, + XF86XK_Launch4, Qt::Key_Launch6, + XF86XK_Launch5, Qt::Key_Launch7, + XF86XK_Launch6, Qt::Key_Launch8, + XF86XK_Launch7, Qt::Key_Launch9, + XF86XK_Launch8, Qt::Key_LaunchA, + XF86XK_Launch9, Qt::Key_LaunchB, + XF86XK_LaunchA, Qt::Key_LaunchC, + XF86XK_LaunchB, Qt::Key_LaunchD, + XF86XK_LaunchC, Qt::Key_LaunchE, + XF86XK_LaunchD, Qt::Key_LaunchF, + XF86XK_LaunchE, Qt::Key_LaunchG, + XF86XK_LaunchF, Qt::Key_LaunchH, + + // Qtopia keys + QTOPIAXK_Select, Qt::Key_Select, + QTOPIAXK_Yes, Qt::Key_Yes, + QTOPIAXK_No, Qt::Key_No, + QTOPIAXK_Cancel, Qt::Key_Cancel, + QTOPIAXK_Printer, Qt::Key_Printer, + QTOPIAXK_Execute, Qt::Key_Execute, + QTOPIAXK_Sleep, Qt::Key_Sleep, + QTOPIAXK_Play, Qt::Key_Play, + QTOPIAXK_Zoom, Qt::Key_Zoom, + QTOPIAXK_Context1, Qt::Key_Context1, + QTOPIAXK_Context2, Qt::Key_Context2, + QTOPIAXK_Context3, Qt::Key_Context3, + QTOPIAXK_Context4, Qt::Key_Context4, + QTOPIAXK_Call, Qt::Key_Call, + QTOPIAXK_Hangup, Qt::Key_Hangup, + QTOPIAXK_Flip, Qt::Key_Flip, + + 0, 0 +}; + +static const unsigned short katakanaKeysymsToUnicode[] = { + 0x0000, 0x3002, 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1, + 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, + 0x30FC, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, + 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, + 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, + 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, + 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, + 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x309B, 0x309C +}; + +static const unsigned short cyrillicKeysymsToUnicode[] = { + 0x0000, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0000, 0x045e, 0x045f, + 0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x0000, 0x040e, 0x040f, + 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, + 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a +}; + +static const unsigned short greekKeysymsToUnicode[] = { + 0x0000, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c, + 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0385, 0x2015, + 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, + 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, + 0x03a0, 0x03a1, 0x03a3, 0x0000, 0x03a4, 0x03a5, 0x03a6, 0x03a7, + 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +static const unsigned short technicalKeysymsToUnicode[] = { + 0x0000, 0x23B7, 0x250C, 0x2500, 0x2320, 0x2321, 0x2502, 0x23A1, + 0x23A3, 0x23A4, 0x23A6, 0x239B, 0x239D, 0x239E, 0x23A0, 0x23A8, + 0x23AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2264, 0x2260, 0x2265, 0x222B, + 0x2234, 0x221D, 0x221E, 0x0000, 0x0000, 0x2207, 0x0000, 0x0000, + 0x223C, 0x2243, 0x0000, 0x0000, 0x0000, 0x21D4, 0x21D2, 0x2261, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x0000, + 0x0000, 0x0000, 0x2282, 0x2283, 0x2229, 0x222A, 0x2227, 0x2228, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2202, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193, 0x0000 +}; + +static const unsigned short specialKeysymsToUnicode[] = { + 0x25C6, 0x2592, 0x2409, 0x240C, 0x240D, 0x240A, 0x0000, 0x0000, + 0x2424, 0x240B, 0x2518, 0x2510, 0x250C, 0x2514, 0x253C, 0x23BA, + 0x23BB, 0x2500, 0x23BC, 0x23BD, 0x251C, 0x2524, 0x2534, 0x252C, + 0x2502, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +static const unsigned short publishingKeysymsToUnicode[] = { + 0x0000, 0x2003, 0x2002, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009, + 0x200a, 0x2014, 0x2013, 0x0000, 0x0000, 0x0000, 0x2026, 0x2025, + 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, + 0x2105, 0x0000, 0x0000, 0x2012, 0x2329, 0x0000, 0x232a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000, + 0x0000, 0x2122, 0x2613, 0x0000, 0x25c1, 0x25b7, 0x25cb, 0x25af, + 0x2018, 0x2019, 0x201c, 0x201d, 0x211e, 0x0000, 0x2032, 0x2033, + 0x0000, 0x271d, 0x0000, 0x25ac, 0x25c0, 0x25b6, 0x25cf, 0x25ae, + 0x25e6, 0x25ab, 0x25ad, 0x25b3, 0x25bd, 0x2606, 0x2022, 0x25aa, + 0x25b2, 0x25bc, 0x261c, 0x261e, 0x2663, 0x2666, 0x2665, 0x0000, + 0x2720, 0x2020, 0x2021, 0x2713, 0x2717, 0x266f, 0x266d, 0x2642, + 0x2640, 0x260e, 0x2315, 0x2117, 0x2038, 0x201a, 0x201e, 0x0000 +}; + +static const unsigned short aplKeysymsToUnicode[] = { + 0x0000, 0x0000, 0x0000, 0x003c, 0x0000, 0x0000, 0x003e, 0x0000, + 0x2228, 0x2227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00af, 0x0000, 0x22a5, 0x2229, 0x230a, 0x0000, 0x005f, 0x0000, + 0x0000, 0x0000, 0x2218, 0x0000, 0x2395, 0x0000, 0x22a4, 0x25cb, + 0x0000, 0x0000, 0x0000, 0x2308, 0x0000, 0x0000, 0x222a, 0x0000, + 0x2283, 0x0000, 0x2282, 0x0000, 0x22a2, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x22a3, 0x0000, 0x0000, 0x0000 +}; + +static const unsigned short koreanKeysymsToUnicode[] = { + 0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, + 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, + 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, + 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, + 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, + 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, + 0x3160, 0x3161, 0x3162, 0x3163, 0x11a8, 0x11a9, 0x11aa, 0x11ab, + 0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3, + 0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb, + 0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x316d, + 0x3171, 0x3178, 0x317f, 0x3181, 0x3184, 0x3186, 0x318d, 0x318e, + 0x11eb, 0x11f0, 0x11f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9 +}; + +static QChar keysymToUnicode(unsigned char byte3, unsigned char byte4) +{ + switch (byte3) { + case 0x04: + // katakana + if (byte4 > 0xa0 && byte4 < 0xe0) + return QChar(katakanaKeysymsToUnicode[byte4 - 0xa0]); + else if (byte4 == 0x7e) + return QChar(0x203e); // Overline + break; + case 0x06: + // russian, use lookup table + if (byte4 > 0xa0) + return QChar(cyrillicKeysymsToUnicode[byte4 - 0xa0]); + break; + case 0x07: + // greek + if (byte4 > 0xa0) + return QChar(greekKeysymsToUnicode[byte4 - 0xa0]); + break; + case 0x08: + // technical + if (byte4 > 0xa0) + return QChar(technicalKeysymsToUnicode[byte4 - 0xa0]); + break; + case 0x09: + // special + if (byte4 >= 0xe0) + return QChar(specialKeysymsToUnicode[byte4 - 0xe0]); + break; + case 0x0a: + // publishing + if (byte4 > 0xa0) + return QChar(publishingKeysymsToUnicode[byte4 - 0xa0]); + break; + case 0x0b: + // APL + if (byte4 > 0xa0) + return QChar(aplKeysymsToUnicode[byte4 - 0xa0]); + break; + case 0x0e: + // Korean + if (byte4 > 0xa0) + return QChar(koreanKeysymsToUnicode[byte4 - 0xa0]); + break; + default: + break; + } + return QChar(0x0); +} + +Qt::KeyboardModifiers QTestLiteKeyboard::translateModifiers(int s) +{ + Qt::KeyboardModifiers ret = 0; + if (s & ShiftMask) + ret |= Qt::ShiftModifier; + if (s & ControlMask) + ret |= Qt::ControlModifier; + if (s & m_alt_mask) + ret |= Qt::AltModifier; + if (s & m_meta_mask) + ret |= Qt::MetaModifier; + if (s & m_mode_switch_mask) + ret |= Qt::GroupSwitchModifier; + return ret; +} + +void QTestLiteKeyboard::setMask(KeySym sym, uint mask) +{ + if (m_alt_mask == 0 + && m_meta_mask != mask + && m_super_mask != mask + && m_hyper_mask != mask + && (sym == XK_Alt_L || sym == XK_Alt_R)) { + m_alt_mask = mask; + } + if (m_meta_mask == 0 + && m_alt_mask != mask + && m_super_mask != mask + && m_hyper_mask != mask + && (sym == XK_Meta_L || sym == XK_Meta_R)) { + m_meta_mask = mask; + } + if (m_super_mask == 0 + && m_alt_mask != mask + && m_meta_mask != mask + && m_hyper_mask != mask + && (sym == XK_Super_L || sym == XK_Super_R)) { + m_super_mask = mask; + } + if (m_hyper_mask == 0 + && m_alt_mask != mask + && m_meta_mask != mask + && m_super_mask != mask + && (sym == XK_Hyper_L || sym == XK_Hyper_R)) { + m_hyper_mask = mask; + } + if (m_mode_switch_mask == 0 + && m_alt_mask != mask + && m_meta_mask != mask + && m_super_mask != mask + && m_hyper_mask != mask + && sym == XK_Mode_switch) { + m_mode_switch_mask = mask; + } + if (m_num_lock_mask == 0 + && sym == XK_Num_Lock) { + m_num_lock_mask = mask; + } +} + +int QTestLiteKeyboard::translateKeySym(uint key) const +{ + int code = -1; + int i = 0; // any other keys + while (KeyTbl[i]) { + if (key == KeyTbl[i]) { + code = (int)KeyTbl[i+1]; + break; + } + i += 2; + } + if (m_meta_mask) { + // translate Super/Hyper keys to Meta if we're using them as the MetaModifier + if (m_meta_mask == m_super_mask && (code == Qt::Key_Super_L || code == Qt::Key_Super_R)) { + code = Qt::Key_Meta; + } else if (m_meta_mask == m_hyper_mask && (code == Qt::Key_Hyper_L || code == Qt::Key_Hyper_R)) { + code = Qt::Key_Meta; + } + } + return code; +} + +QString QTestLiteKeyboard::translateKeySym(KeySym keysym, uint xmodifiers, + int &code, Qt::KeyboardModifiers &modifiers, + QByteArray &chars, int &count) +{ + // all keysyms smaller than 0xff00 are actally keys that can be mapped to unicode chars + + QTextCodec *mapper = QTextCodec::codecForLocale(); + QChar converted; + + if (/*count == 0 &&*/ keysym < 0xff00) { + unsigned char byte3 = (unsigned char)(keysym >> 8); + int mib = -1; + switch(byte3) { + case 0: // Latin 1 + case 1: // Latin 2 + case 2: //latin 3 + case 3: // latin4 + mib = byte3 + 4; break; + case 5: // arabic + mib = 82; break; + case 12: // Hebrew + mib = 85; break; + case 13: // Thai + mib = 2259; break; + case 4: // kana + case 6: // cyrillic + case 7: // greek + case 8: // technical, no mapping here at the moment + case 9: // Special + case 10: // Publishing + case 11: // APL + case 14: // Korean, no mapping + mib = -1; // manual conversion + mapper= 0; +#if !defined(QT_NO_XIM) + converted = keysymToUnicode(byte3, keysym & 0xff); +#endif + case 0x20: + // currency symbols + if (keysym >= 0x20a0 && keysym <= 0x20ac) { + mib = -1; // manual conversion + mapper = 0; + converted = (uint)keysym; + } + break; + default: + break; + } + if (mib != -1) { + mapper = QTextCodec::codecForMib(mib); + if (chars.isEmpty()) + chars.resize(1); + chars[0] = (unsigned char) (keysym & 0xff); // get only the fourth bit for conversion later + count++; + } + } else if (keysym >= 0x1000000 && keysym <= 0x100ffff) { + converted = (ushort) (keysym - 0x1000000); + mapper = 0; + } + if (count < (int)chars.size()-1) + chars[count] = '\0'; + + QString text; + if (!mapper && converted.unicode() != 0x0) { + text = converted; + } else if (!chars.isEmpty()) { + // convert chars (8bit) to text (unicode). + if (mapper) + text = mapper->toUnicode(chars.data(), count, 0); + if (text.isEmpty()) { + // no mapper, or codec couldn't convert to unicode (this + // can happen when running in the C locale or with no LANG + // set). try converting from latin-1 + text = QString::fromLatin1(chars); + } + } + + modifiers = translateModifiers(xmodifiers); + + // Commentary in X11/keysymdef says that X codes match ASCII, so it + // is safe to use the locale functions to process X codes in ISO8859-1. + // + // This is mainly for compatibility - applications should not use the + // Qt keycodes between 128 and 255, but should rather use the + // QKeyEvent::text(). + // + if (keysym < 128 || (keysym < 256 && (!mapper || mapper->mibEnum()==4))) { + // upper-case key, if known + code = isprint((int)keysym) ? toupper((int)keysym) : 0; + } else if (keysym >= XK_F1 && keysym <= XK_F35) { + // function keys + code = Qt::Key_F1 + ((int)keysym - XK_F1); + } else if (keysym >= XK_KP_Space && keysym <= XK_KP_9) { + if (keysym >= XK_KP_0) { + // numeric keypad keys + code = Qt::Key_0 + ((int)keysym - XK_KP_0); + } else { + code = translateKeySym(keysym); + } + modifiers |= Qt::KeypadModifier; + } else if (text.length() == 1 && text.unicode()->unicode() > 0x1f && text.unicode()->unicode() != 0x7f && !(keysym >= XK_dead_grave && keysym <= XK_dead_horn)) { + code = text.unicode()->toUpper().unicode(); + } else { + // any other keys + code = translateKeySym(keysym); + + if (code == Qt::Key_Tab && (modifiers & Qt::ShiftModifier)) { + // map shift+tab to shift+backtab, QShortcutMap knows about it + // and will handle it. + code = Qt::Key_Backtab; + text = QString(); + } + } + + return text; +} + +QTestLiteKeyboard::QTestLiteKeyboard(QTestLiteScreen *screen) + : m_screen(screen) + , m_alt_mask(0) + , m_super_mask(0) + , m_hyper_mask(0) + , m_meta_mask(0) +{ + changeLayout(); +} + +void QTestLiteKeyboard::changeLayout() +{ + XkbDescPtr xkbDesc = XkbGetMap(m_screen->display(), XkbAllClientInfoMask, XkbUseCoreKbd); + for (int i = xkbDesc->min_key_code; i < xkbDesc->max_key_code; ++i) { + const uint mask = xkbDesc->map->modmap ? xkbDesc->map->modmap[i] : 0; + if (mask == 0) { + // key is not bound to a modifier + continue; + } + + for (int j = 0; j < XkbKeyGroupsWidth(xkbDesc, i); ++j) { + KeySym keySym = XkbKeySym(xkbDesc, i, j); + if (keySym == NoSymbol) + continue; + setMask(keySym, mask); + } + } + XkbFreeKeyboard(xkbDesc, XkbAllComponentsMask, true); + +} + +void QTestLiteKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, XKeyEvent *ev) +{ + int qtcode = 0; + Qt::KeyboardModifiers modifiers; + QByteArray chars; + chars.resize(513); + int count = 1; + KeySym keySym; + count = XLookupString(ev,chars.data(),chars.size(),&keySym,0); + QString text = translateKeySym(keySym,ev->state,qtcode,modifiers,chars,count); + QWindowSystemInterface::handleKeyEvent(widget,ev->time,type,qtcode,modifiers,text); +} diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.h b/src/plugins/platforms/testlite/qtestlitekeyboard.h new file mode 100644 index 0000000..65ead16 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.h @@ -0,0 +1,35 @@ +#ifndef QTESTLITEKEYBOARD_H +#define QTESTLITEKEYBOARD_H + +#include "qtestliteintegration.h" + +class QTestLiteKeyboard +{ +public: + QTestLiteKeyboard(QTestLiteScreen *screen); + + void changeLayout(); + + void handleKeyEvent(QWidget *widget, QEvent::Type type, XKeyEvent *ev); + + Qt::KeyboardModifiers translateModifiers(int s); + +private: + + void setMask(KeySym sym, uint mask); + int translateKeySym(uint key) const; + QString translateKeySym(KeySym keysym, uint xmodifiers, + int &code, Qt::KeyboardModifiers &modifiers, + QByteArray &chars, int &count); + + QTestLiteScreen *m_screen; + + uint m_alt_mask; + uint m_super_mask; + uint m_hyper_mask; + uint m_meta_mask; + uint m_mode_switch_mask; + uint m_num_lock_mask; +}; + +#endif // QTESTLITEKEYBOARD_H diff --git a/src/plugins/platforms/testlite/qtestlitescreen.cpp b/src/plugins/platforms/testlite/qtestlitescreen.cpp index 919506e..c0f696d 100644 --- a/src/plugins/platforms/testlite/qtestlitescreen.cpp +++ b/src/plugins/platforms/testlite/qtestlitescreen.cpp @@ -43,6 +43,7 @@ #include "qtestlitecursor.h" #include "qtestlitewindow.h" +#include "qtestlitekeyboard.h" #include #include @@ -226,6 +227,7 @@ QTestLiteScreen::QTestLiteScreen() mWmMotifHintAtom = XInternAtom(mDisplay, "_MOTIF_WM_HINTS\0", False); mCursor = new QTestLiteCursor(this); + mKeyboard = new QTestLiteKeyboard(this); } QTestLiteScreen::~QTestLiteScreen() @@ -299,11 +301,11 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) break; case XKeyPress: - xw->handleKeyEvent(QEvent::KeyPress, &xe->xkey); + mKeyboard->handleKeyEvent(widget,QEvent::KeyPress, &xe->xkey); break; case XKeyRelease: - xw->handleKeyEvent(QEvent::KeyRelease, &xe->xkey); + mKeyboard->handleKeyEvent(widget,QEvent::KeyRelease, &xe->xkey); break; case EnterNotify: @@ -427,4 +429,9 @@ Atom QTestLiteScreen::atomForMotifWmHints() const return mWmMotifHintAtom; } +QTestLiteKeyboard * QTestLiteScreen::keyboard() const +{ + return mKeyboard; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitescreen.h b/src/plugins/platforms/testlite/qtestlitescreen.h index f8d9468..9a1a510 100644 --- a/src/plugins/platforms/testlite/qtestlitescreen.h +++ b/src/plugins/platforms/testlite/qtestlitescreen.h @@ -48,6 +48,7 @@ QT_BEGIN_NAMESPACE class QTestLiteCursor; +class QTestLiteKeyboard; class QTestLiteScreen : public QPlatformScreen { @@ -80,6 +81,7 @@ public: Atom atomForMotifWmHints() const; + QTestLiteKeyboard *keyboard() const; public slots: void eventDispatcher(); @@ -90,6 +92,7 @@ private: int mDepth; QImage::Format mFormat; QTestLiteCursor *mCursor; + QTestLiteKeyboard *mKeyboard; Display * mDisplay; int mScreen; diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index 5446615..42f2302 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -43,6 +43,7 @@ #include "qtestliteintegration.h" #include "qtestlitescreen.h" +#include "qtestlitekeyboard.h" #include #include @@ -141,26 +142,7 @@ static Qt::MouseButtons translateMouseButtons(int s) return ret; } -static Qt::KeyboardModifiers translateModifiers(int s) -{ - const uchar qt_alt_mask = Mod1Mask; - const uchar qt_meta_mask = Mod4Mask; - - Qt::KeyboardModifiers ret = 0; - if (s & ShiftMask) - ret |= Qt::ShiftModifier; - if (s & ControlMask) - ret |= Qt::ControlModifier; - if (s & qt_alt_mask) - ret |= Qt::AltModifier; - if (s & qt_meta_mask) - ret |= Qt::MetaModifier; -#if 0 - if (s & qt_mode_switch_mask) - ret |= Qt::GroupSwitchModifier; -#endif - return ret; -} + void QTestLiteWindow::handleMouseEvent(QEvent::Type type, XButtonEvent *e) { @@ -168,7 +150,7 @@ void QTestLiteWindow::handleMouseEvent(QEvent::Type type, XButtonEvent *e) Qt::MouseButton button = Qt::NoButton; Qt::MouseButtons buttons = translateMouseButtons(e->state); - Qt::KeyboardModifiers modifiers = translateModifiers(e->state); + Qt::KeyboardModifiers modifiers = mScreen->keyboard()->translateModifiers(e->state); if (type != QEvent::MouseMove) { switch (e->button) { case Button1: button = Qt::LeftButton; break; @@ -231,312 +213,7 @@ void QTestLiteWindow::handleFocusOutEvent() QWindowSystemInterface::handleWindowActivated(0); } -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Key event stuff -- not pretty either -// -// What we want to do is to port Robert's keytable code properly - -// keyboard mapping table -static const unsigned int keyTbl[] = { - - // misc keys - - XK_Escape, Qt::Key_Escape, - XK_Tab, Qt::Key_Tab, - XK_ISO_Left_Tab, Qt::Key_Backtab, - XK_BackSpace, Qt::Key_Backspace, - XK_Return, Qt::Key_Return, - XK_Insert, Qt::Key_Insert, - XK_Delete, Qt::Key_Delete, - XK_Clear, Qt::Key_Delete, - XK_Pause, Qt::Key_Pause, - XK_Print, Qt::Key_Print, - 0x1005FF60, Qt::Key_SysReq, // hardcoded Sun SysReq - 0x1007ff00, Qt::Key_SysReq, // hardcoded X386 SysReq - - // cursor movement - - XK_Home, Qt::Key_Home, - XK_End, Qt::Key_End, - XK_Left, Qt::Key_Left, - XK_Up, Qt::Key_Up, - XK_Right, Qt::Key_Right, - XK_Down, Qt::Key_Down, - XK_Prior, Qt::Key_PageUp, - XK_Next, Qt::Key_PageDown, - - // modifiers - - XK_Shift_L, Qt::Key_Shift, - XK_Shift_R, Qt::Key_Shift, - XK_Shift_Lock, Qt::Key_Shift, - XK_Control_L, Qt::Key_Control, - XK_Control_R, Qt::Key_Control, - XK_Meta_L, Qt::Key_Meta, - XK_Meta_R, Qt::Key_Meta, - XK_Alt_L, Qt::Key_Alt, - XK_Alt_R, Qt::Key_Alt, - XK_Caps_Lock, Qt::Key_CapsLock, - XK_Num_Lock, Qt::Key_NumLock, - XK_Scroll_Lock, Qt::Key_ScrollLock, - XK_Super_L, Qt::Key_Super_L, - XK_Super_R, Qt::Key_Super_R, - XK_Menu, Qt::Key_Menu, - XK_Hyper_L, Qt::Key_Hyper_L, - XK_Hyper_R, Qt::Key_Hyper_R, - XK_Help, Qt::Key_Help, - 0x1000FF74, Qt::Key_Backtab, // hardcoded HP backtab - 0x1005FF10, Qt::Key_F11, // hardcoded Sun F36 (labeled F11) - 0x1005FF11, Qt::Key_F12, // hardcoded Sun F37 (labeled F12) - - // numeric and function keypad keys - - XK_KP_Space, Qt::Key_Space, - XK_KP_Tab, Qt::Key_Tab, - XK_KP_Enter, Qt::Key_Enter, - //XK_KP_F1, Qt::Key_F1, - //XK_KP_F2, Qt::Key_F2, - //XK_KP_F3, Qt::Key_F3, - //XK_KP_F4, Qt::Key_F4, - XK_KP_Home, Qt::Key_Home, - XK_KP_Left, Qt::Key_Left, - XK_KP_Up, Qt::Key_Up, - XK_KP_Right, Qt::Key_Right, - XK_KP_Down, Qt::Key_Down, - XK_KP_Prior, Qt::Key_PageUp, - XK_KP_Next, Qt::Key_PageDown, - XK_KP_End, Qt::Key_End, - XK_KP_Begin, Qt::Key_Clear, - XK_KP_Insert, Qt::Key_Insert, - XK_KP_Delete, Qt::Key_Delete, - XK_KP_Equal, Qt::Key_Equal, - XK_KP_Multiply, Qt::Key_Asterisk, - XK_KP_Add, Qt::Key_Plus, - XK_KP_Separator, Qt::Key_Comma, - XK_KP_Subtract, Qt::Key_Minus, - XK_KP_Decimal, Qt::Key_Period, - XK_KP_Divide, Qt::Key_Slash, - - // International input method support keys - - // International & multi-key character composition - XK_ISO_Level3_Shift, Qt::Key_AltGr, - XK_Multi_key, Qt::Key_Multi_key, - XK_Codeinput, Qt::Key_Codeinput, - XK_SingleCandidate, Qt::Key_SingleCandidate, - XK_MultipleCandidate, Qt::Key_MultipleCandidate, - XK_PreviousCandidate, Qt::Key_PreviousCandidate, - - // Misc Functions - XK_Mode_switch, Qt::Key_Mode_switch, - XK_script_switch, Qt::Key_Mode_switch, - - // Japanese keyboard support - XK_Kanji, Qt::Key_Kanji, - XK_Muhenkan, Qt::Key_Muhenkan, - //XK_Henkan_Mode, Qt::Key_Henkan_Mode, - XK_Henkan_Mode, Qt::Key_Henkan, - XK_Henkan, Qt::Key_Henkan, - XK_Romaji, Qt::Key_Romaji, - XK_Hiragana, Qt::Key_Hiragana, - XK_Katakana, Qt::Key_Katakana, - XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana, - XK_Zenkaku, Qt::Key_Zenkaku, - XK_Hankaku, Qt::Key_Hankaku, - XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku, - XK_Touroku, Qt::Key_Touroku, - XK_Massyo, Qt::Key_Massyo, - XK_Kana_Lock, Qt::Key_Kana_Lock, - XK_Kana_Shift, Qt::Key_Kana_Shift, - XK_Eisu_Shift, Qt::Key_Eisu_Shift, - XK_Eisu_toggle, Qt::Key_Eisu_toggle, - //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou, - //XK_Zen_Koho, Qt::Key_Zen_Koho, - //XK_Mae_Koho, Qt::Key_Mae_Koho, - XK_Kanji_Bangou, Qt::Key_Codeinput, - XK_Zen_Koho, Qt::Key_MultipleCandidate, - XK_Mae_Koho, Qt::Key_PreviousCandidate, - -#ifdef XK_KOREAN - // Korean keyboard support - XK_Hangul, Qt::Key_Hangul, - XK_Hangul_Start, Qt::Key_Hangul_Start, - XK_Hangul_End, Qt::Key_Hangul_End, - XK_Hangul_Hanja, Qt::Key_Hangul_Hanja, - XK_Hangul_Jamo, Qt::Key_Hangul_Jamo, - XK_Hangul_Romaja, Qt::Key_Hangul_Romaja, - //XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput, - XK_Hangul_Codeinput, Qt::Key_Codeinput, - XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja, - XK_Hangul_Banja, Qt::Key_Hangul_Banja, - XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja, - XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja, - //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate, - //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate, - //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate, - XK_Hangul_SingleCandidate, Qt::Key_SingleCandidate, - XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate, - XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate, - XK_Hangul_Special, Qt::Key_Hangul_Special, - //XK_Hangul_switch, Qt::Key_Hangul_switch, - XK_Hangul_switch, Qt::Key_Mode_switch, -#endif // XK_KOREAN - - // dead keys - XK_dead_grave, Qt::Key_Dead_Grave, - XK_dead_acute, Qt::Key_Dead_Acute, - XK_dead_circumflex, Qt::Key_Dead_Circumflex, - XK_dead_tilde, Qt::Key_Dead_Tilde, - XK_dead_macron, Qt::Key_Dead_Macron, - XK_dead_breve, Qt::Key_Dead_Breve, - XK_dead_abovedot, Qt::Key_Dead_Abovedot, - XK_dead_diaeresis, Qt::Key_Dead_Diaeresis, - XK_dead_abovering, Qt::Key_Dead_Abovering, - XK_dead_doubleacute, Qt::Key_Dead_Doubleacute, - XK_dead_caron, Qt::Key_Dead_Caron, - XK_dead_cedilla, Qt::Key_Dead_Cedilla, - XK_dead_ogonek, Qt::Key_Dead_Ogonek, - XK_dead_iota, Qt::Key_Dead_Iota, - XK_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound, - XK_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound, - XK_dead_belowdot, Qt::Key_Dead_Belowdot, - XK_dead_hook, Qt::Key_Dead_Hook, - XK_dead_horn, Qt::Key_Dead_Horn, - -#if 0 - // Special multimedia keys - // currently only tested with MS internet keyboard - - // browsing keys - XF86XK_Back, Qt::Key_Back, - XF86XK_Forward, Qt::Key_Forward, - XF86XK_Stop, Qt::Key_Stop, - XF86XK_Refresh, Qt::Key_Refresh, - XF86XK_Favorites, Qt::Key_Favorites, - XF86XK_AudioMedia, Qt::Key_LaunchMedia, - XF86XK_OpenURL, Qt::Key_OpenUrl, - XF86XK_HomePage, Qt::Key_HomePage, - XF86XK_Search, Qt::Key_Search, - - // media keys - XF86XK_AudioLowerVolume, Qt::Key_VolumeDown, - XF86XK_AudioMute, Qt::Key_VolumeMute, - XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp, - XF86XK_AudioPlay, Qt::Key_MediaPlay, - XF86XK_AudioStop, Qt::Key_MediaStop, - XF86XK_AudioPrev, Qt::Key_MediaPrevious, - XF86XK_AudioNext, Qt::Key_MediaNext, - XF86XK_AudioRecord, Qt::Key_MediaRecord, - - // launch keys - XF86XK_Mail, Qt::Key_LaunchMail, - XF86XK_MyComputer, Qt::Key_Launch0, - XF86XK_Calculator, Qt::Key_Launch1, - XF86XK_Standby, Qt::Key_Standby, - - XF86XK_Launch0, Qt::Key_Launch2, - XF86XK_Launch1, Qt::Key_Launch3, - XF86XK_Launch2, Qt::Key_Launch4, - XF86XK_Launch3, Qt::Key_Launch5, - XF86XK_Launch4, Qt::Key_Launch6, - XF86XK_Launch5, Qt::Key_Launch7, - XF86XK_Launch6, Qt::Key_Launch8, - XF86XK_Launch7, Qt::Key_Launch9, - XF86XK_Launch8, Qt::Key_LaunchA, - XF86XK_Launch9, Qt::Key_LaunchB, - XF86XK_LaunchA, Qt::Key_LaunchC, - XF86XK_LaunchB, Qt::Key_LaunchD, - XF86XK_LaunchC, Qt::Key_LaunchE, - XF86XK_LaunchD, Qt::Key_LaunchF, -#endif - -#if 0 - // Qtopia keys - QTOPIAXK_Select, Qt::Key_Select, - QTOPIAXK_Yes, Qt::Key_Yes, - QTOPIAXK_No, Qt::Key_No, - QTOPIAXK_Cancel, Qt::Key_Cancel, - QTOPIAXK_Printer, Qt::Key_Printer, - QTOPIAXK_Execute, Qt::Key_Execute, - QTOPIAXK_Sleep, Qt::Key_Sleep, - QTOPIAXK_Play, Qt::Key_Play, - QTOPIAXK_Zoom, Qt::Key_Zoom, - QTOPIAXK_Context1, Qt::Key_Context1, - QTOPIAXK_Context2, Qt::Key_Context2, - QTOPIAXK_Context3, Qt::Key_Context3, - QTOPIAXK_Context4, Qt::Key_Context4, - QTOPIAXK_Call, Qt::Key_Call, - QTOPIAXK_Hangup, Qt::Key_Hangup, - QTOPIAXK_Flip, Qt::Key_Flip, -#endif - 0, 0 -}; - -static int lookupCode(unsigned int xkeycode) -{ - if (xkeycode >= XK_F1 && xkeycode <= XK_F35) - return Qt::Key_F1 + (int(xkeycode) - XK_F1); - - const unsigned int *p = keyTbl; - while (*p) { - if (*p == xkeycode) - return *++p; - p += 2; - } - - return 0; -} - -static Qt::KeyboardModifiers modifierFromKeyCode(int qtcode) -{ - switch (qtcode) { - case Qt::Key_Control: - return Qt::ControlModifier; - case Qt::Key_Alt: - return Qt::AltModifier; - case Qt::Key_Shift: - return Qt::ShiftModifier; - case Qt::Key_Meta: - return Qt::MetaModifier; - default: - return Qt::NoModifier; - } -} - -void QTestLiteWindow::handleKeyEvent(QEvent::Type type, void *ev) -{ - XKeyEvent *e = static_cast(ev); - - KeySym keySym; - QByteArray chars; - chars.resize(513); - int count = XLookupString(e, chars.data(), chars.size(), &keySym, 0); - Q_UNUSED(count); -// qDebug() << "QTLWS::handleKeyEvent" << count << hex << "XKeysym:" << keySym; -// if (count) -// qDebug() << hex << int(chars[0]) << "String:" << chars; - - Qt::KeyboardModifiers modifiers = translateModifiers(e->state); - - int qtcode = lookupCode(keySym); -// qDebug() << "lookup: " << hex << keySym << qtcode << "mod" << modifiers; - - //X11 specifies state *before*, Qt expects state *after* the event - - modifiers ^= modifierFromKeyCode(qtcode); - - if (qtcode) { - QWindowSystemInterface::handleKeyEvent(widget(), e->time, type, qtcode, modifiers); - } else if (chars[0]) { - int qtcode = chars.toUpper()[0]; //Not exactly right... - if (modifiers & Qt::ControlModifier && qtcode < ' ') - qtcode = chars[0] + '@'; - QWindowSystemInterface::handleKeyEvent(0, e->time, type, qtcode, modifiers, QString::fromLatin1(chars)); - } else { - qWarning() << "unknown X keycode" << hex << e->keycode << keySym; - } -} void QTestLiteWindow::setGeometry(const QRect &rect) { diff --git a/src/plugins/platforms/testlite/qtestlitewindow.h b/src/plugins/platforms/testlite/qtestlitewindow.h index 7e990ee..35ba677 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.h +++ b/src/plugins/platforms/testlite/qtestlitewindow.h @@ -93,7 +93,6 @@ public: void mousePressEvent(XButtonEvent*); void handleMouseEvent(QEvent::Type, XButtonEvent *ev); - void handleKeyEvent(QEvent::Type, void *); void handleCloseEvent(); void handleEnterEvent(); void handleLeaveEvent(); diff --git a/src/plugins/platforms/testlite/testlite.pro b/src/plugins/platforms/testlite/testlite.pro index ef977bf..d2f2562 100644 --- a/src/plugins/platforms/testlite/testlite.pro +++ b/src/plugins/platforms/testlite/testlite.pro @@ -9,14 +9,16 @@ SOURCES = \ qtestlitewindowsurface.cpp \ qtestlitewindow.cpp \ qtestlitecursor.cpp \ - qtestlitescreen.cpp + qtestlitescreen.cpp \ + qtestlitekeyboard.cpp HEADERS = \ qtestliteintegration.h \ qtestlitewindowsurface.h \ qtestlitewindow.h \ qtestlitecursor.h \ - qtestlitescreen.h + qtestlitescreen.h \ + qtestlitekeyboard.h LIBS += -lX11 -lXext -- cgit v0.12 From 91a438cad2139ae33f8a18c8ca8f81a41795ebe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Fri, 17 Dec 2010 08:51:53 +0100 Subject: Add basic mouse context menues to lighthouse --- src/gui/kernel/qapplication_qpa.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp index a587e8e..a164c2d 100644 --- a/src/gui/kernel/qapplication_qpa.cpp +++ b/src/gui/kernel/qapplication_qpa.cpp @@ -735,7 +735,15 @@ void QApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mouse cursor.data()->pointerEvent(ev); } + int oldOpenPopupCount = openPopupCount; QApplication::sendSpontaneousEvent(mouseWidget, &ev); + +#ifndef QT_NO_CONTEXTMENU + if (type == QEvent::MouseButtonPress && button == Qt::RightButton && (openPopupCount == oldOpenPopupCount)) { + QContextMenuEvent e(QContextMenuEvent::Mouse, localPoint, globalPoint, modifiers); + QApplication::sendSpontaneousEvent(mouseWidget, &e); + } +#endif // QT_NO_CONTEXTMENU } -- cgit v0.12 From d79b18d59cc39396f4993a294f24cfb804be728f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Mon, 20 Dec 2010 10:24:48 +0100 Subject: Make TestLite show windows in correct position --- src/plugins/platforms/testlite/qtestlitewindow.cpp | 28 +++++++++++++++++++--- src/plugins/platforms/testlite/qtestlitewindow.h | 2 ++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index 42f2302..6f9ad58 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -517,10 +517,13 @@ void QTestLiteWindow::setVisible(bool visible) #ifdef MYX11_DEBUG qDebug() << "QTestLiteWindow::setVisible" << visible << hex << x_window; #endif - if (visible) - XMapWindow(mScreen->display(), x_window); - else + if (visible) { + //ensure that the window is viewed in correct position. + doSizeHints(); + XMapWindow(mScreen->display(), x_window); + } else { XUnmapWindow(mScreen->display(), x_window); + } } void QTestLiteWindow::setCursor(const Cursor &cursor) @@ -552,4 +555,23 @@ GC QTestLiteWindow::graphicsContext() const return gc; } +void QTestLiteWindow::doSizeHints() +{ + Q_ASSERT(widget()->testAttribute(Qt::WA_WState_Created)); + XSizeHints s; + s.flags = 0; + QRect g = geometry(); + s.x = g.x(); + s.y = g.y(); + s.width = g.width(); + s.height = g.height(); + s.flags |= USPosition; + s.flags |= PPosition; + s.flags |= USSize; + s.flags |= PSize; + s.flags |= PWinGravity; + s.win_gravity = QApplication::isRightToLeft() ? NorthEastGravity : NorthWestGravity; + XSetWMNormalHints(mScreen->display(), x_window, &s); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitewindow.h b/src/plugins/platforms/testlite/qtestlitewindow.h index 35ba677..4b952dc 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.h +++ b/src/plugins/platforms/testlite/qtestlitewindow.h @@ -126,6 +126,8 @@ protected: void setMWMHints(const QtMWMHints &mwmhints); QtMWMHints getMWMHints() const; + void doSizeHints(); + private: Window x_window; GC gc; -- cgit v0.12 From a7fbc64969168fef3285901e383a044692bebfd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Mon, 20 Dec 2010 10:36:00 +0100 Subject: Lighthouse: fix keyboard problem in testlite --- src/plugins/platforms/testlite/qtestlitekeyboard.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp index c18de59..be7a686 100644 --- a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp @@ -834,7 +834,7 @@ QString QTestLiteKeyboard::translateKeySym(KeySym keysym, uint xmodifiers, if (chars.isEmpty()) chars.resize(1); chars[0] = (unsigned char) (keysym & 0xff); // get only the fourth bit for conversion later - count++; + count = 1; } } else if (keysym >= 0x1000000 && keysym <= 0x100ffff) { converted = (ushort) (keysym - 0x1000000); @@ -935,9 +935,9 @@ void QTestLiteKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, XKeyE Qt::KeyboardModifiers modifiers; QByteArray chars; chars.resize(513); - int count = 1; + int count = 0; KeySym keySym; count = XLookupString(ev,chars.data(),chars.size(),&keySym,0); QString text = translateKeySym(keySym,ev->state,qtcode,modifiers,chars,count); - QWindowSystemInterface::handleKeyEvent(widget,ev->time,type,qtcode,modifiers,text); + QWindowSystemInterface::handleKeyEvent(widget,ev->time,type,qtcode,modifiers,text.left(count)); } -- cgit v0.12 From f03d9c91d7576974d1a156749c1e159468f2451a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 28 Dec 2010 15:26:19 +0100 Subject: Initial support for WS specific clipboard support in Lighthouse default implementation in QPlatformIntegration still supports in process copy/paste --- src/gui/kernel/kernel.pri | 6 +- src/gui/kernel/qclipboard_qpa.cpp | 82 ++++------------------ src/gui/kernel/qdnd_p.h | 2 +- src/gui/kernel/qplatformclipboard_qpa.cpp | 101 ++++++++++++++++++++++++++++ src/gui/kernel/qplatformclipboard_qpa.h | 70 +++++++++++++++++++ src/gui/kernel/qplatformintegration_qpa.cpp | 18 +++++ src/gui/kernel/qplatformintegration_qpa.h | 4 +- 7 files changed, 209 insertions(+), 74 deletions(-) create mode 100644 src/gui/kernel/qplatformclipboard_qpa.cpp create mode 100644 src/gui/kernel/qplatformclipboard_qpa.h diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri index 4261e93..0ff3d88 100644 --- a/src/gui/kernel/kernel.pri +++ b/src/gui/kernel/kernel.pri @@ -222,7 +222,8 @@ qpa { kernel/qplatformglcontext_qpa.h \ kernel/qdesktopwidget_qpa_p.h \ kernel/qplatformeventloopintegration_qpa.h \ - kernel/qplatformcursor_qpa.h + kernel/qplatformcursor_qpa.h \ + kernel/qplatformclipboard_qpa.h SOURCES += \ kernel/qapplication_qpa.cpp \ @@ -244,7 +245,8 @@ qpa { kernel/qplatformwindowformat_qpa.cpp \ kernel/qplatformeventloopintegration_qpa.cpp \ kernel/qplatformglcontext_qpa.cpp \ - kernel/qplatformcursor_qpa.cpp + kernel/qplatformcursor_qpa.cpp \ + kernel/qplatformclipboard_qpa.cpp contains(QT_CONFIG, glib) { SOURCES += \ diff --git a/src/gui/kernel/qclipboard_qpa.cpp b/src/gui/kernel/qclipboard_qpa.cpp index 92b9e83..b8ce60e 100644 --- a/src/gui/kernel/qclipboard_qpa.cpp +++ b/src/gui/kernel/qclipboard_qpa.cpp @@ -44,73 +44,16 @@ #ifndef QT_NO_CLIPBOARD #include "qmimedata.h" -#include "qapplication.h" +#include "private/qapplication_p.h" +#include "qplatformclipboard_qpa.h" QT_BEGIN_NAMESPACE QT_USE_NAMESPACE - -class QClipboardData -{ -public: - QClipboardData(); - ~QClipboardData(); - - void setSource(QMimeData* s) - { - if (s == src) - return; - delete src; - src = s; - } - QMimeData* source() - { return src; } - - void clear(); - -private: - QMimeData* src; -}; - -QClipboardData::QClipboardData() -{ - src = 0; -} - -QClipboardData::~QClipboardData() -{ - delete src; -} - -void QClipboardData::clear() -{ - delete src; - src = 0; -} - - -static QClipboardData *internalCbData = 0; - -static void cleanupClipboardData() -{ - delete internalCbData; - internalCbData = 0; -} - -static QClipboardData *clipboardData() -{ - if (internalCbData == 0) { - internalCbData = new QClipboardData; - qAddPostRoutine(cleanupClipboardData); - } - return internalCbData; -} - - void QClipboard::clear(Mode mode) { - setText(QString(), mode); + setMimeData(0,mode); } @@ -121,26 +64,25 @@ bool QClipboard::event(QEvent *e) const QMimeData* QClipboard::mimeData(Mode mode) const { - if (mode != Clipboard) return 0; - - QClipboardData *d = clipboardData(); - return d->source(); + QPlatformClipboard *clipboard = QApplicationPrivate::platformIntegration()->clipboard(); + if (!clipboard->supportsMode(mode)) return 0; + return clipboard->mimeData(mode); } void QClipboard::setMimeData(QMimeData* src, Mode mode) { - if (mode != Clipboard) return; - - QClipboardData *d = clipboardData(); + QPlatformClipboard *clipboard = QApplicationPrivate::platformIntegration()->clipboard(); + if (!clipboard->supportsMode(mode)) return; - d->setSource(src); + clipboard->setMimeData(src,mode); - emitChanged(QClipboard::Clipboard); + emitChanged(mode); } bool QClipboard::supportsMode(Mode mode) const { - return (mode == Clipboard); + QPlatformClipboard *clipboard = QApplicationPrivate::platformIntegration()->clipboard(); + return clipboard->supportsMode(mode); } bool QClipboard::ownsMode(Mode mode) const diff --git a/src/gui/kernel/qdnd_p.h b/src/gui/kernel/qdnd_p.h index 598a9de..7b23630 100644 --- a/src/gui/kernel/qdnd_p.h +++ b/src/gui/kernel/qdnd_p.h @@ -76,7 +76,7 @@ class QEventLoop; #if !(defined(QT_NO_DRAGANDDROP) && defined(QT_NO_CLIPBOARD)) -class QInternalMimeData : public QMimeData +class Q_GUI_EXPORT QInternalMimeData : public QMimeData { Q_OBJECT public: diff --git a/src/gui/kernel/qplatformclipboard_qpa.cpp b/src/gui/kernel/qplatformclipboard_qpa.cpp new file mode 100644 index 0000000..fff4e19 --- /dev/null +++ b/src/gui/kernel/qplatformclipboard_qpa.cpp @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "qplatformclipboard_qpa.h" + +QT_BEGIN_NAMESPACE + +class QClipboardData +{ +public: + QClipboardData(); + ~QClipboardData(); + + void setSource(QMimeData* s) + { + if (s == src) + return; + delete src; + src = s; + } + QMimeData* source() + { return src; } + +private: + QMimeData* src; +}; + +QClipboardData::QClipboardData() +{ + src = 0; +} + +QClipboardData::~QClipboardData() +{ + delete src; +} + +Q_GLOBAL_STATIC(QClipboardData,q_clipboardData); + +QPlatformClipboard::~QPlatformClipboard() +{ + +} + +const QMimeData *QPlatformClipboard::mimeData(QClipboard::Mode mode) const +{ + //we know its clipboard + Q_UNUSED(mode); + return q_clipboardData()->source(); +} + +void QPlatformClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode) +{ + //we know its clipboard + Q_UNUSED(mode); + q_clipboardData()->setSource(data); +} + +bool QPlatformClipboard::supportsMode(QClipboard::Mode mode) const +{ + return mode == QClipboard::Clipboard; +} + +QT_END_NAMESPACE diff --git a/src/gui/kernel/qplatformclipboard_qpa.h b/src/gui/kernel/qplatformclipboard_qpa.h new file mode 100644 index 0000000..3f7bfbb --- /dev/null +++ b/src/gui/kernel/qplatformclipboard_qpa.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPLATFORMCLIPBOARD_QPA_H +#define QPLATFORMCLIPBOARD_QPA_H + +#include + +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Gui) + +class Q_GUI_EXPORT QPlatformClipboard +{ +public: + virtual ~QPlatformClipboard(); + + virtual const QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard ) const; + virtual void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard); + virtual bool supportsMode(QClipboard::Mode mode) const; +}; + +QT_END_NAMESPACE + +QT_END_HEADER + + +#endif //QPLATFORMCLIPBOARD_QPA_H diff --git a/src/gui/kernel/qplatformintegration_qpa.cpp b/src/gui/kernel/qplatformintegration_qpa.cpp index 9b6e590..0cac57d 100644 --- a/src/gui/kernel/qplatformintegration_qpa.cpp +++ b/src/gui/kernel/qplatformintegration_qpa.cpp @@ -42,6 +42,7 @@ #include "qplatformintegration_qpa.h" #include +#include QT_BEGIN_NAMESPACE @@ -94,6 +95,23 @@ QPlatformFontDatabase *QPlatformIntegration::fontDatabase() const } /*! + Accessor for the platform integrations clipboard. + + Default implementation returns a default QPlatformClipboard. + + \sa QPlatformClipboard + +*/ +QPlatformClipboard *QPlatformIntegration::clipboard() const +{ + static QPlatformClipboard *clipboard = 0; + if (!clipboard) { + clipboard = new QPlatformClipboard; + } + return clipboard; +} + +/*! \class QPlatformIntegration \since 4.8 \internal diff --git a/src/gui/kernel/qplatformintegration_qpa.h b/src/gui/kernel/qplatformintegration_qpa.h index f01b4f4..7050245 100644 --- a/src/gui/kernel/qplatformintegration_qpa.h +++ b/src/gui/kernel/qplatformintegration_qpa.h @@ -59,6 +59,7 @@ class QBlittable; class QWidget; class QPlatformEventLoopIntegration; class QPlatformFontDatabase; +class QPlatformClipboard; class Q_GUI_EXPORT QPlatformIntegration { @@ -76,8 +77,9 @@ public: virtual bool isVirtualDesktop() { return false; } virtual QPixmap grabWindow(WId window, int x, int y, int width, int height) const; -//Fontdatabase integration. +//Deeper window system integrations virtual QPlatformFontDatabase *fontDatabase() const; + virtual QPlatformClipboard *clipboard() const; // Experimental in mainthread eventloop integration // This should only be used if it is only possible to do window system event processing in -- cgit v0.12 From 1097310a4ff0bda0f3c5a0204c42ed40035e6dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 28 Dec 2010 15:27:52 +0100 Subject: Fix keyboard when using modifiers for testlite --- src/plugins/platforms/testlite/qtestlitekeyboard.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp index be7a686..93d21b3 100644 --- a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp @@ -929,15 +929,32 @@ void QTestLiteKeyboard::changeLayout() } +static Qt::KeyboardModifiers modifierFromKeyCode(int qtcode) +{ + switch (qtcode) { + case Qt::Key_Control: + return Qt::ControlModifier; + case Qt::Key_Alt: + return Qt::AltModifier; + case Qt::Key_Shift: + return Qt::ShiftModifier; + case Qt::Key_Meta: + return Qt::MetaModifier; + default: + return Qt::NoModifier; + } +} + void QTestLiteKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, XKeyEvent *ev) { int qtcode = 0; - Qt::KeyboardModifiers modifiers; + Qt::KeyboardModifiers modifiers = translateModifiers(ev->state); QByteArray chars; chars.resize(513); int count = 0; KeySym keySym; count = XLookupString(ev,chars.data(),chars.size(),&keySym,0); QString text = translateKeySym(keySym,ev->state,qtcode,modifiers,chars,count); + modifiers ^= modifierFromKeyCode(qtcode); QWindowSystemInterface::handleKeyEvent(widget,ev->time,type,qtcode,modifiers,text.left(count)); } -- cgit v0.12 From c33402ff531c1667305907963c221b88dd168691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 28 Dec 2010 15:44:47 +0100 Subject: Copy/Paste in testlite and also added QTestLiteStaticInfo which is a class to resolve atoms etc. --- .../platforms/testlite/qtestliteclipboard.cpp | 519 +++++++++++++++++++++ .../platforms/testlite/qtestliteclipboard.h | 52 +++ .../platforms/testlite/qtestliteintegration.cpp | 13 + .../platforms/testlite/qtestliteintegration.h | 4 +- src/plugins/platforms/testlite/qtestlitemime.cpp | 362 ++++++++++++++ src/plugins/platforms/testlite/qtestlitemime.h | 42 ++ src/plugins/platforms/testlite/qtestlitescreen.cpp | 133 ++++-- src/plugins/platforms/testlite/qtestlitescreen.h | 16 +- .../platforms/testlite/qtestlitestaticinfo.cpp | 417 +++++++++++++++++ .../platforms/testlite/qtestlitestaticinfo.h | 371 +++++++++++++++ src/plugins/platforms/testlite/qtestlitewindow.cpp | 36 +- src/plugins/platforms/testlite/testlite.pro | 10 +- 12 files changed, 1899 insertions(+), 76 deletions(-) create mode 100644 src/plugins/platforms/testlite/qtestliteclipboard.cpp create mode 100644 src/plugins/platforms/testlite/qtestliteclipboard.h create mode 100644 src/plugins/platforms/testlite/qtestlitemime.cpp create mode 100644 src/plugins/platforms/testlite/qtestlitemime.h create mode 100644 src/plugins/platforms/testlite/qtestlitestaticinfo.cpp create mode 100644 src/plugins/platforms/testlite/qtestlitestaticinfo.h diff --git a/src/plugins/platforms/testlite/qtestliteclipboard.cpp b/src/plugins/platforms/testlite/qtestliteclipboard.cpp new file mode 100644 index 0000000..fdd6d30 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestliteclipboard.cpp @@ -0,0 +1,519 @@ +#include "qtestliteclipboard.h" + +#include "qtestlitescreen.h" +#include "qtestlitemime.h" + +#include + +#include + +const int QTestLiteClipboard::clipboard_timeout = 5000; + +QTestLiteClipboard::QTestLiteClipboard(QTestLiteScreen *screen) + : QPlatformClipboard() + , m_screen(screen) + , m_xClipboard(0) + , m_clientClipboard(0) + , m_xSelection(0) + , m_clientSelection(0) + , m_requestor(XNone) + , m_owner(XNone) +{ +} + +const QMimeData * QTestLiteClipboard::mimeData(QClipboard::Mode mode) const +{ + if (mode == QClipboard::Clipboard) { + if (!m_xClipboard) { + QTestLiteClipboard *that = const_cast(this); + that->m_xClipboard = new QTestLiteMime(mode,that); + } + Window clipboardOwner = XGetSelectionOwner(screen()->display(),QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD)); + if (clipboardOwner == owner()) { + return m_clientClipboard; + } else { + return m_xClipboard; + } + } + return 0; +} + +void QTestLiteClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode) +{ + Atom modeAtom; + QMimeData **d; + switch (mode) { + case QClipboard::Selection: + modeAtom = XA_PRIMARY; + d = &m_clientSelection; + break; + + case QClipboard::Clipboard: + modeAtom = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD); + d = &m_clientClipboard; + break; + + default: + qWarning("QClipboard::setMimeData: unsupported mode '%d'", mode); + return; + } + + Window newOwner; + + if (! data) { // no data, clear clipboard contents + newOwner = XNone; + } else { + newOwner = owner(); + + *d = data; + } + + XSetSelectionOwner(m_screen->display(), modeAtom, newOwner, CurrentTime); + + if (XGetSelectionOwner(m_screen->display(), modeAtom) != newOwner) { +// qWarning("QClipboard::setData: Cannot set X11 selection owner for %s", +// xdndAtomToString(atom).data()); + *d = 0; + return; + } + +} + +QTestLiteScreen * QTestLiteClipboard::screen() const +{ + return m_screen; +} + +Window QTestLiteClipboard::requestor() const +{ + if (!m_requestor) { + int x = 0, y = 0, w = 3, h = 3; + QTestLiteClipboard *that = const_cast(this); + Window window = XCreateSimpleWindow(m_screen->display(), m_screen->rootWindow(), + x, y, w, h, 0 /*border_width*/, + m_screen->blackPixel(), m_screen->whitePixel()); + that->setRequestor(window); + } + return m_requestor; +} + +void QTestLiteClipboard::setRequestor(Window window) +{ + if (m_requestor != XNone) { + XDestroyWindow(m_screen->display(),m_requestor); + } + m_requestor = window; +} + +Window QTestLiteClipboard::owner() const +{ + if (!m_owner) { + int x = 0, y = 0, w = 3, h = 3; + QTestLiteClipboard *that = const_cast(this); + Window window = XCreateSimpleWindow(m_screen->display(), m_screen->rootWindow(), + x, y, w, h, 0 /*border_width*/, + m_screen->blackPixel(), m_screen->whitePixel()); + that->setOwner(window); + } + return m_owner; +} + +void QTestLiteClipboard::setOwner(Window window) +{ + if (m_owner != XNone){ + XDestroyWindow(m_screen->display(),m_owner); + } + m_owner = window; +} + +Atom QTestLiteClipboard::sendTargetsSelection(QMimeData *d, Window window, Atom property) +{ + QVector types; + QStringList formats = QInternalMimeData::formatsHelper(d); + for (int i = 0; i < formats.size(); ++i) { + QList atoms = QTestLiteMime::xdndMimeAtomsForFormat(screen()->display(),formats.at(i)); + for (int j = 0; j < atoms.size(); ++j) { + if (!types.contains(atoms.at(j))) + types.append(atoms.at(j)); + } + } + types.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TARGETS)); + types.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::MULTIPLE)); + types.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TIMESTAMP)); + types.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::SAVE_TARGETS)); + + XChangeProperty(screen()->display(), window, property, XA_ATOM, 32, + PropModeReplace, (uchar *) types.data(), types.size()); + return property; +} + +Atom QTestLiteClipboard::sendSelection(QMimeData *d, Atom target, Window window, Atom property) +{ + Atom atomFormat = target; + int dataFormat = 0; + QByteArray data; + + QString fmt = QTestLiteMime::xdndMimeAtomToString(screen()->display(), target); + if (fmt.isEmpty()) { // Not a MIME type we have + qDebug() << "QClipboard: send_selection(): converting to type '%s' is not supported" << fmt.data(); + return XNone; + } + qDebug() << "QClipboard: send_selection(): converting to type '%s'" << fmt.data(); + + if (QTestLiteMime::xdndMimeDataForAtom(screen()->display(),target, d, &data, &atomFormat, &dataFormat)) { + + // don't allow INCR transfers when using MULTIPLE or to + // Motif clients (since Motif doesn't support INCR) + static Atom motif_clip_temporary = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIP_TEMPORARY); + bool allow_incr = property != motif_clip_temporary; + + // X_ChangeProperty protocol request is 24 bytes + const int increment = (XMaxRequestSize(screen()->display()) * 4) - 24; + if (data.size() > increment && allow_incr) { + long bytes = data.size(); + XChangeProperty(screen()->display(), window, property, + QTestLiteStaticInfo::atom(QTestLiteStaticInfo::INCR), 32, PropModeReplace, (uchar *) &bytes, 1); + +// (void)new QClipboardINCRTransaction(window, property, atomFormat, dataFormat, data, increment); + qDebug() << "not implemented INCRT just YET!"; + return property; + } + + // make sure we can perform the XChangeProperty in a single request + if (data.size() > increment) + return XNone; // ### perhaps use several XChangeProperty calls w/ PropModeAppend? + int dataSize = data.size() / (dataFormat / 8); + // use a single request to transfer data + XChangeProperty(screen()->display(), window, property, atomFormat, + dataFormat, PropModeReplace, (uchar *) data.data(), + dataSize); + } + return property; +} + +void QTestLiteClipboard::handleSelectionRequest(XEvent *xevent) +{ + XSelectionRequestEvent *req = &xevent->xselectionrequest; + + if (requestor() && req->requestor == requestor()) { + qDebug() << "This should be caught before"; + return; + } + + XEvent event; + event.xselection.type = SelectionNotify; + event.xselection.display = req->display; + event.xselection.requestor = req->requestor; + event.xselection.selection = req->selection; + event.xselection.target = req->target; + event.xselection.property = XNone; + event.xselection.time = req->time; + + QMimeData *d; + if (req->selection == XA_PRIMARY) { + d = m_clientSelection; + } else if (req->selection == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD)) { + d = m_clientClipboard; + } else { + qWarning("QClipboard: Unknown selection '%lx'", req->selection); + XSendEvent(screen()->display(), req->requestor, False, NoEventMask, &event); + return; + } + + if (!d) { + qWarning("QClipboard: Cannot transfer data, no data available"); + XSendEvent(screen()->display(), req->requestor, False, NoEventMask, &event); + return; + } + + Atom xa_targets = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TARGETS); + Atom xa_multiple = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::MULTIPLE); + Atom xa_timestamp = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TIMESTAMP); + + struct AtomPair { Atom target; Atom property; } *multi = 0; + Atom multi_type = XNone; + int multi_format = 0; + int nmulti = 0; + int imulti = -1; + bool multi_writeback = false; + + if (req->target == xa_multiple) { + QByteArray multi_data; + if (req->property == XNone + || !clipboardReadProperty(req->requestor, req->property, false, &multi_data, + 0, &multi_type, &multi_format) + || multi_format != 32) { + // MULTIPLE property not formatted correctly + XSendEvent(screen()->display(), req->requestor, False, NoEventMask, &event); + return; + } + nmulti = multi_data.size()/sizeof(*multi); + multi = new AtomPair[nmulti]; + memcpy(multi,multi_data.data(),multi_data.size()); + imulti = 0; + } + + for (; imulti < nmulti; ++imulti) { + Atom target; + Atom property; + + if (multi) { + target = multi[imulti].target; + property = multi[imulti].property; + } else { + target = req->target; + property = req->property; + if (property == XNone) // obsolete client + property = target; + } + + Atom ret = XNone; + if (target == XNone || property == XNone) { + ; + } else if (target == xa_timestamp) { +// if (d->timestamp != CurrentTime) { + XChangeProperty(screen()->display(), req->requestor, property, XA_INTEGER, 32, + PropModeReplace, CurrentTime, 1); + ret = property; +// } else { +// qWarning("QClipboard: Invalid data timestamp"); +// } + } else if (target == xa_targets) { + ret = sendTargetsSelection(d, req->requestor, property); + } else { + ret = sendSelection(d, target, req->requestor, property); + } + + if (nmulti > 0) { + if (ret == XNone) { + multi[imulti].property = XNone; + multi_writeback = true; + } + } else { + event.xselection.property = ret; + break; + } + } + + if (nmulti > 0) { + if (multi_writeback) { + // according to ICCCM 2.6.2 says to put None back + // into the original property on the requestor window + XChangeProperty(screen()->display(), req->requestor, req->property, multi_type, 32, + PropModeReplace, (uchar *) multi, nmulti * 2); + } + + delete [] multi; + event.xselection.property = req->property; + } + + // send selection notify to requestor + XSendEvent(screen()->display(), req->requestor, False, NoEventMask, &event); +} + +static inline int maxSelectionIncr(Display *dpy) +{ return XMaxRequestSize(dpy) > 65536 ? 65536*4 : XMaxRequestSize(dpy)*4 - 100; } + +bool QTestLiteClipboard::clipboardReadProperty(Window win, Atom property, bool deleteProperty, QByteArray *buffer, int *size, Atom *type, int *format) const +{ + int maxsize = maxSelectionIncr(screen()->display()); + ulong bytes_left; // bytes_after + ulong length; // nitems + uchar *data; + Atom dummy_type; + int dummy_format; + int r; + + if (!type) // allow null args + type = &dummy_type; + if (!format) + format = &dummy_format; + + // Don't read anything, just get the size of the property data + r = XGetWindowProperty(screen()->display(), win, property, 0, 0, False, + AnyPropertyType, type, format, + &length, &bytes_left, &data); + if (r != Success || (type && *type == XNone)) { + buffer->resize(0); + return false; + } + XFree((char*)data); + + int offset = 0, buffer_offset = 0, format_inc = 1, proplen = bytes_left; + + switch (*format) { + case 8: + default: + format_inc = sizeof(char) / 1; + break; + + case 16: + format_inc = sizeof(short) / 2; + proplen *= sizeof(short) / 2; + break; + + case 32: + format_inc = sizeof(long) / 4; + proplen *= sizeof(long) / 4; + break; + } + + int newSize = proplen; + buffer->resize(newSize); + + bool ok = (buffer->size() == newSize); + + if (ok && newSize) { + // could allocate buffer + + while (bytes_left) { + // more to read... + + r = XGetWindowProperty(screen()->display(), win, property, offset, maxsize/4, + False, AnyPropertyType, type, format, + &length, &bytes_left, &data); + if (r != Success || (type && *type == XNone)) + break; + + offset += length / (32 / *format); + length *= format_inc * (*format) / 8; + + // Here we check if we get a buffer overflow and tries to + // recover -- this shouldn't normally happen, but it doesn't + // hurt to be defensive + if ((int)(buffer_offset + length) > buffer->size()) { + length = buffer->size() - buffer_offset; + + // escape loop + bytes_left = 0; + } + + memcpy(buffer->data() + buffer_offset, data, length); + buffer_offset += length; + + XFree((char*)data); + } + + if (*format == 8 && *type == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) { + // convert COMPOUND_TEXT to a multibyte string + XTextProperty textprop; + textprop.encoding = *type; + textprop.format = *format; + textprop.nitems = buffer_offset; + textprop.value = (unsigned char *) buffer->data(); + + char **list_ret = 0; + int count; + if (XmbTextPropertyToTextList(screen()->display(), &textprop, &list_ret, + &count) == Success && count && list_ret) { + offset = buffer_offset = strlen(list_ret[0]); + buffer->resize(offset); + memcpy(buffer->data(), list_ret[0], offset); + } + if (list_ret) XFreeStringList(list_ret); + } + } + + // correct size, not 0-term. + if (size) + *size = buffer_offset; + + if (deleteProperty) + XDeleteProperty(screen()->display(), win, property); + + XFlush(screen()->display()); + + return ok; +} + +QByteArray QTestLiteClipboard::clipboardReadIncrementalProperty(Window win, Atom property, int nbytes, bool nullterm) +{ + XEvent event; + + QByteArray buf; + QByteArray tmp_buf; + bool alloc_error = false; + int length; + int offset = 0; + + if (nbytes > 0) { + // Reserve buffer + zero-terminator (for text data) + // We want to complete the INCR transfer even if we cannot + // allocate more memory + buf.resize(nbytes+1); + alloc_error = buf.size() != nbytes+1; + } + + for (;;) { + XFlush(screen()->display()); + if (!screen()->waitForClipboardEvent(win,PropertyNotify,&event,clipboard_timeout)) + break; + if (event.xproperty.atom != property || + event.xproperty.state != PropertyNewValue) + continue; + if (clipboardReadProperty(win, property, true, &tmp_buf, &length, 0, 0)) { + if (length == 0) { // no more data, we're done + if (nullterm) { + buf.resize(offset+1); + buf[offset] = '\0'; + } else { + buf.resize(offset); + } + return buf; + } else if (!alloc_error) { + if (offset+length > (int)buf.size()) { + buf.resize(offset+length+65535); + if (buf.size() != offset+length+65535) { + alloc_error = true; + length = buf.size() - offset; + } + } + memcpy(buf.data()+offset, tmp_buf.constData(), length); + tmp_buf.resize(0); + offset += length; + } + } else { + break; + } + } + + // timed out ... create a new requestor window, otherwise the requestor + // could consider next request to be still part of this timed out request + setRequestor(0); + + return QByteArray(); +} + +QByteArray QTestLiteClipboard::getDataInFormat(Atom modeAtom, Atom fmtatom) +{ + QByteArray buf; + + Window win = requestor(); + + XSelectInput(screen()->display(), win, NoEventMask); // don't listen for any events + + XDeleteProperty(screen()->display(), win, QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_QT_SELECTION)); + XConvertSelection(screen()->display(), modeAtom, fmtatom, QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_QT_SELECTION), win, CurrentTime); + XSync(screen()->display(), false); + + XEvent xevent; + if (!screen()->waitForClipboardEvent(win,SelectionNotify,&xevent,clipboard_timeout) || + xevent.xselection.property == XNone) { + return buf; + } + + Atom type; + XSelectInput(screen()->display(), win, PropertyChangeMask); + + if (clipboardReadProperty(win, QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_QT_SELECTION), true, &buf, 0, &type, 0)) { + if (type == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::INCR)) { + int nbytes = buf.size() >= 4 ? *((int*)buf.data()) : 0; + buf = clipboardReadIncrementalProperty(win, QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_QT_SELECTION), nbytes, false); + } + } + + XSelectInput(screen()->display(), win, NoEventMask); + + + return buf; +} diff --git a/src/plugins/platforms/testlite/qtestliteclipboard.h b/src/plugins/platforms/testlite/qtestliteclipboard.h new file mode 100644 index 0000000..31e42b7 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestliteclipboard.h @@ -0,0 +1,52 @@ +#ifndef QTESTLITECLIPBOARD_H +#define QTESTLITECLIPBOARD_H + +#include +#include "qtestlitestaticinfo.h" + +class QTestLiteScreen; +class QTestLiteMime; +class QTestLiteClipboard : public QPlatformClipboard +{ +public: + QTestLiteClipboard(QTestLiteScreen *screen); + + const QMimeData *mimeData(QClipboard::Mode mode) const; + void setMimeData(QMimeData *data, QClipboard::Mode mode); + + QTestLiteScreen *screen() const; + + Window requestor() const; + void setRequestor(Window window); + + Window owner() const; + + void handleSelectionRequest(XEvent *event); + + bool clipboardReadProperty(Window win, Atom property, bool deleteProperty, QByteArray *buffer, int *size, Atom *type, int *format) const; + QByteArray clipboardReadIncrementalProperty(Window win, Atom property, int nbytes, bool nullterm); + + QByteArray getDataInFormat(Atom modeAtom, Atom fmtatom); + +private: + void setOwner(Window window); + + Atom sendTargetsSelection(QMimeData *d, Window window, Atom property); + Atom sendSelection(QMimeData *d, Atom target, Window window, Atom property); + + QTestLiteScreen *m_screen; + + QTestLiteMime *m_xClipboard; + QMimeData *m_clientClipboard; + + QTestLiteMime *m_xSelection; + QMimeData *m_clientSelection; + + Window m_requestor; + Window m_owner; + + static const int clipboard_timeout; + +}; + +#endif // QTESTLITECLIPBOARD_H diff --git a/src/plugins/platforms/testlite/qtestliteintegration.cpp b/src/plugins/platforms/testlite/qtestliteintegration.cpp index fc2a89c..537e22a 100644 --- a/src/plugins/platforms/testlite/qtestliteintegration.cpp +++ b/src/plugins/platforms/testlite/qtestliteintegration.cpp @@ -47,6 +47,7 @@ #include "qtestlitewindow.h" #include "qgenericunixfontdatabase.h" #include "qtestlitescreen.h" +#include "qtestliteclipboard.h" #ifndef QT_NO_OPENGL #include @@ -60,6 +61,7 @@ QT_BEGIN_NAMESPACE QTestLiteIntegration::QTestLiteIntegration(bool useOpenGL) : mUseOpenGL(useOpenGL) , mFontDb(new QGenericUnixFontDatabase()) + , mClipboard(0) { mPrimaryScreen = new QTestLiteScreen(); mScreens.append(mPrimaryScreen); @@ -114,6 +116,16 @@ QPlatformFontDatabase *QTestLiteIntegration::fontDatabase() const return mFontDb; } +QPlatformClipboard * QTestLiteIntegration::clipboard() const +{ + //Use lazy init since clipboard needs QTestliteScreen + if (!mClipboard) { + QTestLiteIntegration *that = const_cast(this); + that->mClipboard = new QTestLiteClipboard(mPrimaryScreen); + } + return mClipboard; +} + bool QTestLiteIntegration::hasOpenGL() const { #ifndef QT_NO_OPENGL @@ -123,4 +135,5 @@ bool QTestLiteIntegration::hasOpenGL() const return false; } + QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestliteintegration.h b/src/plugins/platforms/testlite/qtestliteintegration.h index 37d09f5..320cf00 100644 --- a/src/plugins/platforms/testlite/qtestliteintegration.h +++ b/src/plugins/platforms/testlite/qtestliteintegration.h @@ -48,7 +48,7 @@ #include #include -#include +#include "qtestlitestaticinfo.h" QT_BEGIN_NAMESPACE @@ -68,6 +68,7 @@ public: QList screens() const { return mScreens; } QPlatformFontDatabase *fontDatabase() const; + QPlatformClipboard *clipboard() const; bool hasOpenGL() const; @@ -76,6 +77,7 @@ private: QTestLiteScreen *mPrimaryScreen; QList mScreens; QPlatformFontDatabase *mFontDb; + QPlatformClipboard *mClipboard; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitemime.cpp b/src/plugins/platforms/testlite/qtestlitemime.cpp new file mode 100644 index 0000000..6261383 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitemime.cpp @@ -0,0 +1,362 @@ +#include "qtestlitemime.h" + +#include "qtestlitestaticinfo.h" +#include "qtestlitescreen.h" + +#include + +QTestLiteMime::QTestLiteMime(QClipboard::Mode mode, QTestLiteClipboard *clipboard) + : QInternalMimeData(), m_clipboard(clipboard) +{ + switch (mode) { + case QClipboard::Selection: + modeAtom = XA_PRIMARY; + break; + + case QClipboard::Clipboard: + modeAtom = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD); + break; + + default: + qWarning("QTestLiteMime: Internal error: Unsupported clipboard mode"); + break; + } +} + +QTestLiteMime::~QTestLiteMime() +{ +} + +bool QTestLiteMime::empty() const +{ + Window win = XGetSelectionOwner(m_clipboard->screen()->display(), modeAtom); + + return win == XNone; +} + +QStringList QTestLiteMime::formats_sys() const +{ + if (empty()) + return QStringList(); + + if (!formatList.count()) { + // get the list of targets from the current clipboard owner - we do this + // once so that multiple calls to this function don't require multiple + // server round trips... + + format_atoms = m_clipboard->getDataInFormat(modeAtom,QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TARGETS)); + + if (format_atoms.size() > 0) { + Atom *targets = (Atom *) format_atoms.data(); + int size = format_atoms.size() / sizeof(Atom); + + for (int i = 0; i < size; ++i) { + if (targets[i] == 0) + continue; + + QStringList formatsForAtom = xdndMimeFormatsForAtom(m_clipboard->screen()->display(),targets[i]); + for (int j = 0; j < formatsForAtom.size(); ++j) { + if (!formatList.contains(formatsForAtom.at(j))) + formatList.append(formatsForAtom.at(j)); + } + } + } + } + + return formatList; +} + +bool QTestLiteMime::hasFormat_sys(const QString &format) const +{ + QStringList list = formats(); + return list.contains(format); +} + +QVariant QTestLiteMime::retrieveData_sys(const QString &fmt, QVariant::Type requestedType) const +{ + if (fmt.isEmpty() || empty()) + return QByteArray(); + + (void)formats(); // trigger update of format list + + QList atoms; + Atom *targets = (Atom *) format_atoms.data(); + int size = format_atoms.size() / sizeof(Atom); + for (int i = 0; i < size; ++i) + atoms.append(targets[i]); + + QByteArray encoding; + Atom fmtatom = xdndMimeAtomForFormat(m_clipboard->screen()->display(),fmt, requestedType, atoms, &encoding); + + if (fmtatom == 0) + return QVariant(); + + return xdndMimeConvertToFormat(m_clipboard->screen()->display(),fmtatom, m_clipboard->getDataInFormat(modeAtom,fmtatom), fmt, requestedType, encoding); +} + + +QString QTestLiteMime::xdndMimeAtomToString(Display *display, Atom a) +{ + if (!a) return 0; + + if (a == XA_STRING || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING)) { + return "text/plain"; // some Xdnd clients are dumb + } + char *atom = XGetAtomName(display, a); + QString result = QString::fromLatin1(atom); + XFree(atom); + return result; +} + +Atom QTestLiteMime::xdndMimeStringToAtom(Display *display, const QString &mimeType) +{ + if (mimeType.isEmpty()) + return 0; + return XInternAtom(display, mimeType.toLatin1().constData(), False); +} + +QStringList QTestLiteMime::xdndMimeFormatsForAtom(Display *display, Atom a) +{ + QStringList formats; + if (a) { + QString atomName = xdndMimeAtomToString(display, a); + formats.append(atomName); + + // special cases for string type + if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING) + || a == XA_STRING + || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT) + || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) + formats.append(QLatin1String("text/plain")); + + // special cases for uris + if (atomName == QLatin1String("text/x-moz-url")) + formats.append(QLatin1String("text/uri-list")); + + // special case for images + if (a == XA_PIXMAP) + formats.append(QLatin1String("image/ppm")); + } + return formats; +} + +bool QTestLiteMime::xdndMimeDataForAtom(Display *display, Atom a, QMimeData *mimeData, QByteArray *data, Atom *atomFormat, int *dataFormat) +{ + bool ret = false; + *atomFormat = a; + *dataFormat = 8; + QString atomName = xdndMimeAtomToString(display, a); + if (QInternalMimeData::hasFormatHelper(atomName, mimeData)) { + *data = QInternalMimeData::renderDataHelper(atomName, mimeData); + if (atomName == QLatin1String("application/x-color")) + *dataFormat = 16; + ret = true; + } else { + if ((a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING) + || a == XA_STRING + || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT) + || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) + && QInternalMimeData::hasFormatHelper(QLatin1String("text/plain"), mimeData)) { + if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING)){ + *data = QInternalMimeData::renderDataHelper(QLatin1String("text/plain"), mimeData); + ret = true; + } else if (a == XA_STRING) { + *data = QString::fromUtf8(QInternalMimeData::renderDataHelper( + QLatin1String("text/plain"), mimeData)).toLocal8Bit(); + ret = true; + } else if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT) + || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) { + // the ICCCM states that TEXT and COMPOUND_TEXT are in the + // encoding of choice, so we choose the encoding of the locale + QByteArray strData = QString::fromUtf8(QInternalMimeData::renderDataHelper( + QLatin1String("text/plain"), mimeData)).toLocal8Bit(); + char *list[] = { strData.data(), NULL }; + + XICCEncodingStyle style = (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) + ? XCompoundTextStyle : XStdICCTextStyle; + XTextProperty textprop; + if (list[0] != NULL + && XmbTextListToTextProperty(display, list, 1, style, + &textprop) == Success) { + *atomFormat = textprop.encoding; + *dataFormat = textprop.format; + *data = QByteArray((const char *) textprop.value, textprop.nitems * textprop.format / 8); + ret = true; + + XFree(textprop.value); + } + } + } else if (atomName == QLatin1String("text/x-moz-url") && + QInternalMimeData::hasFormatHelper(QLatin1String("text/uri-list"), mimeData)) { + QByteArray uri = QInternalMimeData::renderDataHelper( + QLatin1String("text/uri-list"), mimeData).split('\n').first(); + QString mozUri = QString::fromLatin1(uri, uri.size()); + mozUri += QLatin1Char('\n'); + *data = QByteArray(reinterpret_cast(mozUri.utf16()), mozUri.length() * 2); + ret = true; + } else if ((a == XA_PIXMAP || a == XA_BITMAP) && mimeData->hasImage()) { + QPixmap pm = qvariant_cast(mimeData->imageData()); + if (a == XA_BITMAP && pm.depth() != 1) { + QImage img = pm.toImage(); + img = img.convertToFormat(QImage::Format_MonoLSB); + pm = QPixmap::fromImage(img); + } +// QDragManager *dm = QDragManager::self(); +// if (dm) { +// Pixmap handle = pm.handle(); +// *data = QByteArray((const char *) &handle, sizeof(Pixmap)); +// dm->xdndMimeTransferedPixmap[dm->xdndMimeTransferedPixmapIndex] = pm; +// dm->xdndMimeTransferedPixmapIndex = +// (dm->xdndMimeTransferedPixmapIndex + 1) % 2; +// ret = true; +// } + } + } + return ret && data != 0; +} + +QList QTestLiteMime::xdndMimeAtomsForFormat(Display *display, const QString &format) +{ + QList atoms; + atoms.append(xdndMimeStringToAtom(display, format)); + + // special cases for strings + if (format == QLatin1String("text/plain")) { + atoms.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING)); + atoms.append(XA_STRING); + atoms.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT)); + atoms.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)); + } + + // special cases for uris + if (format == QLatin1String("text/uri-list")) { + atoms.append(xdndMimeStringToAtom(display,QLatin1String("text/x-moz-url"))); + } + + //special cases for images + if (format == QLatin1String("image/ppm")) + atoms.append(XA_PIXMAP); + if (format == QLatin1String("image/pbm")) + atoms.append(XA_BITMAP); + + return atoms; +} + +QVariant QTestLiteMime::xdndMimeConvertToFormat(Display *display, Atom a, const QByteArray &data, const QString &format, QVariant::Type requestedType, const QByteArray &encoding) +{ + QString atomName = xdndMimeAtomToString(display,a); + if (atomName == format) + return data; + + if (!encoding.isEmpty() + && atomName == format + QLatin1String(";charset=") + QString::fromLatin1(encoding)) { + + if (requestedType == QVariant::String) { + QTextCodec *codec = QTextCodec::codecForName(encoding); + if (codec) + return codec->toUnicode(data); + } + + return data; + } + + // special cases for string types + if (format == QLatin1String("text/plain")) { + if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING)) + return QString::fromUtf8(data); + if (a == XA_STRING) + return QString::fromLatin1(data); + if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT) + || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) + // #### might be wrong for COMPUND_TEXT + return QString::fromLocal8Bit(data, data.size()); + } + + // special case for uri types + if (format == QLatin1String("text/uri-list")) { + if (atomName == QLatin1String("text/x-moz-url")) { + // we expect this as utf16 + // the first part is a url that should only contain ascci char + // so it should be safe to check that the second char is 0 + // to verify that it is utf16 + if (data.size() > 1 && data.at(1) == 0) + return QString::fromRawData((const QChar *)data.constData(), + data.size() / 2).split(QLatin1Char('\n')).first().toLatin1(); + } + } + + // special cas for images + if (format == QLatin1String("image/ppm")) { + if (a == XA_PIXMAP && data.size() == sizeof(Pixmap)) { +// Pixmap xpm = *((Pixmap*)data.data()); +// if (!xpm) +// return QByteArray(); +// QPixmap qpm = QPixmap::fromX11Pixmap(xpm); +// QImageWriter imageWriter; +// imageWriter.setFormat("PPMRAW"); +// QImage imageToWrite = qpm.toImage(); +// QBuffer buf; +// buf.open(QIODevice::WriteOnly); +// imageWriter.setDevice(&buf); +// imageWriter.write(imageToWrite); +// return buf.buffer(); + return QVariant(); + } + } + return QVariant(); +} + +Atom QTestLiteMime::xdndMimeAtomForFormat(Display *display, const QString &format, QVariant::Type requestedType, const QList<Atom> &atoms, QByteArray *requestedEncoding) +{ + requestedEncoding->clear(); + + // find matches for string types + if (format == QLatin1String("text/plain")) { + if (atoms.contains(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING))) + return QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING); + if (atoms.contains(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT))) + return QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT); + if (atoms.contains(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT))) + return QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT); + if (atoms.contains(XA_STRING)) + return XA_STRING; + } + + // find matches for uri types + if (format == QLatin1String("text/uri-list")) { + Atom a = xdndMimeStringToAtom(display,format); + if (a && atoms.contains(a)) + return a; + a = xdndMimeStringToAtom(display,QLatin1String("text/x-moz-url")); + if (a && atoms.contains(a)) + return a; + } + + // find match for image + if (format == QLatin1String("image/ppm")) { + if (atoms.contains(XA_PIXMAP)) + return XA_PIXMAP; + } + + // for string/text requests try to use a format with a well-defined charset + // first to avoid encoding problems + if (requestedType == QVariant::String + && format.startsWith(QLatin1String("text/")) + && !format.contains(QLatin1String("charset="))) { + + QString formatWithCharset = format; + formatWithCharset.append(QLatin1String(";charset=utf-8")); + + Atom a = xdndMimeStringToAtom(display,formatWithCharset); + if (a && atoms.contains(a)) { + *requestedEncoding = "utf-8"; + return a; + } + } + + Atom a = xdndMimeStringToAtom(display,format); + if (a && atoms.contains(a)) + return a; + + return 0; +} diff --git a/src/plugins/platforms/testlite/qtestlitemime.h b/src/plugins/platforms/testlite/qtestlitemime.h new file mode 100644 index 0000000..e5ed7b0 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitemime.h @@ -0,0 +1,42 @@ +#ifndef QTESTLITEMIME_H +#define QTESTLITEMIME_H + +#include <private/qdnd_p.h> + +#include <QtGui/QClipboard> + +#include "qtestliteintegration.h" +#include "qtestliteclipboard.h" + +class QTestLiteMime : public QInternalMimeData { + Q_OBJECT +public: + QTestLiteMime(QClipboard::Mode mode, QTestLiteClipboard *clipboard); + ~QTestLiteMime(); + bool empty() const; + + static QList<Atom> xdndMimeAtomsForFormat(Display *display, const QString &format); + static QString xdndMimeAtomToString(Display *display, Atom a); + static bool xdndMimeDataForAtom(Display *display, Atom a, QMimeData *mimeData, QByteArray *data, Atom *atomFormat, int *dataFormat); + static QStringList xdndMimeFormatsForAtom(Display *display, Atom a); + static Atom xdndMimeStringToAtom(Display *display, const QString &mimeType); + + static QVariant xdndMimeConvertToFormat(Display *display, Atom a, const QByteArray &data, const QString &format, QVariant::Type requestedType, const QByteArray &encoding); + static Atom xdndMimeAtomForFormat(Display *display, const QString &format, QVariant::Type requestedType, const QList<Atom> &atoms, QByteArray *requestedEncoding); + + +protected: + virtual bool hasFormat_sys(const QString &mimetype) const; + virtual QStringList formats_sys() const; + + QVariant retrieveData_sys(const QString &mimetype, QVariant::Type type) const; + + +private: + QTestLiteClipboard *m_clipboard; + Atom modeAtom; + mutable QStringList formatList; + mutable QByteArray format_atoms; +}; + +#endif // QTESTLITEMIME_H diff --git a/src/plugins/platforms/testlite/qtestlitescreen.cpp b/src/plugins/platforms/testlite/qtestlitescreen.cpp index c0f696d..2ae7028 100644 --- a/src/plugins/platforms/testlite/qtestlitescreen.cpp +++ b/src/plugins/platforms/testlite/qtestlitescreen.cpp @@ -44,9 +44,16 @@ #include "qtestlitecursor.h" #include "qtestlitewindow.h" #include "qtestlitekeyboard.h" +#include "qtestlitestaticinfo.h" +#include "qtestliteclipboard.h" #include <QtCore/QDebug> #include <QtCore/QSocketNotifier> +#include <QtCore/QElapsedTimer> + +#include <private/qapplication_p.h> + +#include <X11/extensions/Xfixes.h> QT_BEGIN_NAMESPACE @@ -183,11 +190,10 @@ qDebug() << "qt_x_errhandler" << err->error_code; QTestLiteScreen::QTestLiteScreen() : mFormat(QImage::Format_RGB32) - , mWmProtocolsAtom(0) - , mWmDeleteWindowAtom(0) { char *display_name = getenv("DISPLAY"); mDisplay = XOpenDisplay(display_name); + mDisplayName = QString::fromLocal8Bit(display_name); if (!mDisplay) { fprintf(stderr, "Cannot connect to X server: %s\n", display_name); @@ -204,6 +210,7 @@ QTestLiteScreen::QTestLiteScreen() XSynchronize(mDisplay, true); mScreen = DefaultScreen(mDisplay); + XSelectInput(mDisplay,rootWindow(), KeymapStateMask | EnterWindowMask | LeaveWindowMask | PropertyChangeMask); int width = DisplayWidth(mDisplay, mScreen); int height = DisplayHeight(mDisplay, mScreen); mGeometry = QRect(0,0,width,height); @@ -221,11 +228,6 @@ QTestLiteScreen::QTestLiteScreen() QSocketNotifier *sock = new QSocketNotifier(xSocketNumber, QSocketNotifier::Read, this); connect(sock, SIGNAL(activated(int)), this, SLOT(eventDispatcher())); - mWmProtocolsAtom = XInternAtom (mDisplay, "WM_PROTOCOLS", False); - mWmDeleteWindowAtom = XInternAtom (mDisplay, "WM_DELETE_WINDOW", False); - - mWmMotifHintAtom = XInternAtom(mDisplay, "_MOTIF_WM_HINTS\0", False); - mCursor = new QTestLiteCursor(this); mKeyboard = new QTestLiteKeyboard(this); } @@ -243,9 +245,6 @@ QTestLiteScreen::~QTestLiteScreen() #undef KeyRelease #endif -//Q_GUI_EXPORT extern Atom wmProtocolsAtom; -//Q_GUI_EXPORT extern Atom wmDeleteWindowAtom; - bool QTestLiteScreen::handleEvent(XEvent *xe) { int quit = false; @@ -254,28 +253,17 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) if (widget) { xw = static_cast<QTestLiteWindow *>(widget->platformWindow()); } - if (!xw) { -#ifdef MYX11_DEBUG - qWarning() << "Unknown window" << hex << xe->xany.window << "received event" << xe->type; -#endif - return quit; - } + Atom wmProtocolsAtom = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::WM_PROTOCOLS); + Atom wmDeleteWindowAtom = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::WM_DELETE_WINDOW); switch (xe->type) { case ClientMessage: - if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom()) { + if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom) { Atom a = xe->xclient.data.l[0]; - if (a == wmDeleteWindowAtom()) + if (a == wmDeleteWindowAtom) xw->handleCloseEvent(); -#ifdef MYX11_DEBUG - qDebug() << "ClientMessage WM_PROTOCOLS" << a; -#endif } -#ifdef MYX11_DEBUG - else - qDebug() << "ClientMessage" << xe->xclient.format << xe->xclient.message_type; -#endif break; case Expose: @@ -289,15 +277,18 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) break; case ButtonPress: - xw->mousePressEvent(&xe->xbutton); + if (xw) + xw->mousePressEvent(&xe->xbutton); break; case ButtonRelease: - xw->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton); + if (xw) + xw->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton); break; case MotionNotify: - xw->handleMouseEvent(QEvent::MouseMove, &xe->xbutton); + if (xw) + xw->handleMouseEvent(QEvent::MouseMove, &xe->xbutton); break; case XKeyPress: @@ -309,20 +300,39 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) break; case EnterNotify: - xw->handleEnterEvent(); + if (xw) + xw->handleEnterEvent(); break; case LeaveNotify: - xw->handleLeaveEvent(); + if (xw) + xw->handleLeaveEvent(); break; case XFocusIn: - xw->handleFocusInEvent(); + if (xw) + xw->handleFocusInEvent(); break; case XFocusOut: - xw->handleFocusOutEvent(); + if (xw) + xw->handleFocusOutEvent(); + break; + + case PropertyNotify: + break; + + case SelectionClear: + qDebug() << "Selection Clear!!!"; + break; + case SelectionRequest: + handleSelectionRequest(xe); break; + case SelectionNotify: + qDebug() << "Selection Notify!!!!"; + + break; + default: #ifdef MYX11_DEBUG @@ -330,9 +340,43 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) #endif break; } + return quit; } +static Bool checkForClipboardEvents(Display *, XEvent *e, XPointer) +{ + Atom clipboard = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD); + return ((e->type == SelectionRequest && (e->xselectionrequest.selection == XA_PRIMARY + || e->xselectionrequest.selection == clipboard)) + || (e->type == SelectionClear && (e->xselectionclear.selection == XA_PRIMARY + || e->xselectionclear.selection == clipboard))); +} + +bool QTestLiteScreen::waitForClipboardEvent(Window win, int type, XEvent *event, int timeout) +{ + QElapsedTimer timer; + timer.start(); + do { + if (XCheckTypedWindowEvent(mDisplay,win,type,event)) + return true; + + // process other clipboard events, since someone is probably requesting data from us + XEvent e; + if (XCheckIfEvent(mDisplay, &e, checkForClipboardEvents, 0)) + handleEvent(&e); + + XFlush(mDisplay); + + // sleep 50 ms, so we don't use up CPU cycles all the time. + struct timeval usleep_tv; + usleep_tv.tv_sec = 0; + usleep_tv.tv_usec = 50000; + select(0, 0, 0, 0, &usleep_tv); + } while (timer.elapsed() < timeout); + return false; +} + void QTestLiteScreen::eventDispatcher() { ulong marker = XNextRequest(mDisplay); @@ -409,29 +453,16 @@ int QTestLiteScreen::xScreenNumber() const return mScreen; } -Atom QTestLiteScreen::wmProtocolsAtom() const -{ - return mWmProtocolsAtom; -} - -Atom QTestLiteScreen::wmDeleteWindowAtom() const -{ - return mWmDeleteWindowAtom; -} - -void QTestLiteScreen::setWmDeleteWindowAtom(Atom newDeleteWindowAtom) -{ - mWmDeleteWindowAtom = newDeleteWindowAtom; -} - -Atom QTestLiteScreen::atomForMotifWmHints() const +QTestLiteKeyboard * QTestLiteScreen::keyboard() const { - return mWmMotifHintAtom; + return mKeyboard; } -QTestLiteKeyboard * QTestLiteScreen::keyboard() const +void QTestLiteScreen::handleSelectionRequest(XEvent *event) { - return mKeyboard; + QPlatformIntegration *integration = QApplicationPrivate::platformIntegration(); + QTestLiteClipboard *clipboard = static_cast<QTestLiteClipboard *>(integration->clipboard()); + clipboard->handleSelectionRequest(event); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitescreen.h b/src/plugins/platforms/testlite/qtestlitescreen.h index 9a1a510..860a67c 100644 --- a/src/plugins/platforms/testlite/qtestlitescreen.h +++ b/src/plugins/platforms/testlite/qtestlitescreen.h @@ -58,6 +58,8 @@ public: ~QTestLiteScreen(); + QString displayName() const { return mDisplayName; } + QRect geometry() const { return mGeometry; } int depth() const { return mDepth; } QImage::Format format() const { return mFormat; } @@ -68,6 +70,8 @@ public: unsigned long whitePixel() { return WhitePixel(mDisplay, mScreen); } bool handleEvent(XEvent *xe); + bool waitForClipboardEvent(Window win, int type, XEvent *event, int timeout); + QImage grabWindow(Window window, int x, int y, int w, int h); static QTestLiteScreen *testLiteScreenForWidget(QWidget *widget); @@ -75,18 +79,15 @@ public: Display *display() const; int xScreenNumber() const; - Atom wmProtocolsAtom() const; - Atom wmDeleteWindowAtom() const; - void setWmDeleteWindowAtom(Atom newDeleteWindowAtom); - - Atom atomForMotifWmHints() const; - QTestLiteKeyboard *keyboard() const; public slots: void eventDispatcher(); private: + + void handleSelectionRequest(XEvent *event); + QString mDisplayName; QRect mGeometry; QSize mPhysicalSize; int mDepth; @@ -96,9 +97,6 @@ private: Display * mDisplay; int mScreen; - Atom mWmProtocolsAtom; - Atom mWmDeleteWindowAtom; - Atom mWmMotifHintAtom; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp b/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp new file mode 100644 index 0000000..20d73a2 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp @@ -0,0 +1,417 @@ +#include "qtestlitestaticinfo.h" +#include "qtestlitescreen.h" + +#include <qplatformdefs.h> + +#include <QtGui/private/qapplication_p.h> +#include <QtCore/QBuffer> +#include <QtCore/QLibrary> + +#include <QDebug> + +#ifndef QT_NO_XFIXES +#include <X11/extensions/Xfixes.h> +#endif // QT_NO_XFIXES + +static const char * x11_atomnames = { + // window-manager <-> client protocols + "WM_PROTOCOLS\0" + "WM_DELETE_WINDOW\0" + "WM_TAKE_FOCUS\0" + "_NET_WM_PING\0" + "_NET_WM_CONTEXT_HELP\0" + "_NET_WM_SYNC_REQUEST\0" + "_NET_WM_SYNC_REQUEST_COUNTER\0" + + // ICCCM window state + "WM_STATE\0" + "WM_CHANGE_STATE\0" + + // Session management + "WM_CLIENT_LEADER\0" + "WM_WINDOW_ROLE\0" + "SM_CLIENT_ID\0" + + // Clipboard + "CLIPBOARD\0" + "INCR\0" + "TARGETS\0" + "MULTIPLE\0" + "TIMESTAMP\0" + "SAVE_TARGETS\0" + "CLIP_TEMPORARY\0" + "_QT_SELECTION\0" + "_QT_CLIPBOARD_SENTINEL\0" + "_QT_SELECTION_SENTINEL\0" + "CLIPBOARD_MANAGER\0" + + "RESOURCE_MANAGER\0" + + "_XSETROOT_ID\0" + + "_QT_SCROLL_DONE\0" + "_QT_INPUT_ENCODING\0" + + "_MOTIF_WM_HINTS\0" + + "DTWM_IS_RUNNING\0" + "ENLIGHTENMENT_DESKTOP\0" + "_DT_SAVE_MODE\0" + "_SGI_DESKS_MANAGER\0" + + // EWMH (aka NETWM) + "_NET_SUPPORTED\0" + "_NET_VIRTUAL_ROOTS\0" + "_NET_WORKAREA\0" + + "_NET_MOVERESIZE_WINDOW\0" + "_NET_WM_MOVERESIZE\0" + + "_NET_WM_NAME\0" + "_NET_WM_ICON_NAME\0" + "_NET_WM_ICON\0" + + "_NET_WM_PID\0" + + "_NET_WM_WINDOW_OPACITY\0" + + "_NET_WM_STATE\0" + "_NET_WM_STATE_ABOVE\0" + "_NET_WM_STATE_BELOW\0" + "_NET_WM_STATE_FULLSCREEN\0" + "_NET_WM_STATE_MAXIMIZED_HORZ\0" + "_NET_WM_STATE_MAXIMIZED_VERT\0" + "_NET_WM_STATE_MODAL\0" + "_NET_WM_STATE_STAYS_ON_TOP\0" + "_NET_WM_STATE_DEMANDS_ATTENTION\0" + + "_NET_WM_USER_TIME\0" + "_NET_WM_USER_TIME_WINDOW\0" + "_NET_WM_FULL_PLACEMENT\0" + + "_NET_WM_WINDOW_TYPE\0" + "_NET_WM_WINDOW_TYPE_DESKTOP\0" + "_NET_WM_WINDOW_TYPE_DOCK\0" + "_NET_WM_WINDOW_TYPE_TOOLBAR\0" + "_NET_WM_WINDOW_TYPE_MENU\0" + "_NET_WM_WINDOW_TYPE_UTILITY\0" + "_NET_WM_WINDOW_TYPE_SPLASH\0" + "_NET_WM_WINDOW_TYPE_DIALOG\0" + "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU\0" + "_NET_WM_WINDOW_TYPE_POPUP_MENU\0" + "_NET_WM_WINDOW_TYPE_TOOLTIP\0" + "_NET_WM_WINDOW_TYPE_NOTIFICATION\0" + "_NET_WM_WINDOW_TYPE_COMBO\0" + "_NET_WM_WINDOW_TYPE_DND\0" + "_NET_WM_WINDOW_TYPE_NORMAL\0" + "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE\0" + + "_KDE_NET_WM_FRAME_STRUT\0" + + "_NET_STARTUP_INFO\0" + "_NET_STARTUP_INFO_BEGIN\0" + + "_NET_SUPPORTING_WM_CHECK\0" + + "_NET_WM_CM_S0\0" + + "_NET_SYSTEM_TRAY_VISUAL\0" + + "_NET_ACTIVE_WINDOW\0" + + // Property formats + "COMPOUND_TEXT\0" + "TEXT\0" + "UTF8_STRING\0" + + // xdnd + "XdndEnter\0" + "XdndPosition\0" + "XdndStatus\0" + "XdndLeave\0" + "XdndDrop\0" + "XdndFinished\0" + "XdndTypeList\0" + "XdndActionList\0" + + "XdndSelection\0" + + "XdndAware\0" + "XdndProxy\0" + + "XdndActionCopy\0" + "XdndActionLink\0" + "XdndActionMove\0" + "XdndActionPrivate\0" + + // Motif DND + "_MOTIF_DRAG_AND_DROP_MESSAGE\0" + "_MOTIF_DRAG_INITIATOR_INFO\0" + "_MOTIF_DRAG_RECEIVER_INFO\0" + "_MOTIF_DRAG_WINDOW\0" + "_MOTIF_DRAG_TARGETS\0" + + "XmTRANSFER_SUCCESS\0" + "XmTRANSFER_FAILURE\0" + + // Xkb + "_XKB_RULES_NAMES\0" + + // XEMBED + "_XEMBED\0" + "_XEMBED_INFO\0" + + // Wacom old. (before version 0.10) + "Wacom Stylus\0" + "Wacom Cursor\0" + "Wacom Eraser\0" + + // Tablet + "STYLUS\0" + "ERASER\0" +}; + +/*! + \internal + Try to resolve a \a symbol from \a library with the version specified + by \a vernum. + + Note that, in the case of the Xfixes library, \a vernum is not the same as + \c XFIXES_MAJOR - it is a part of soname and may differ from the Xfixes + version. +*/ +static void* qt_load_library_runtime(const char *library, int vernum, + int highestVernum, const char *symbol) +{ + QList<int> versions; + // we try to load in the following order: + // explicit version -> the default one -> (from the highest (highestVernum) to the lowest (vernum) ) + if (vernum != -1) + versions << vernum; + versions << -1; + if (vernum != -1) { + for(int i = highestVernum; i > vernum; --i) + versions << i; + } + Q_FOREACH(int version, versions) { + QLatin1String libName(library); + QLibrary xfixesLib(libName, version); + void *ptr = xfixesLib.resolve(symbol); + if (ptr) + return ptr; + } + return 0; +} + +# define XFIXES_LOAD_RUNTIME(vernum, symbol, symbol_type) \ + (symbol_type)qt_load_library_runtime("libXfixes", vernum, 4, #symbol); +# define XFIXES_LOAD_V1(symbol) \ + XFIXES_LOAD_RUNTIME(1, symbol, Ptr##symbol) +# define XFIXES_LOAD_V2(symbol) \ + XFIXES_LOAD_RUNTIME(2, symbol, Ptr##symbol) + + +class QTestLiteStaticInfoPrivate +{ +public: + QTestLiteStaticInfoPrivate() + : use_xfixes(false) + , xfixes_major(0) + , xfixes_eventbase(0) + , xfixes_errorbase(0) + { + QTestLiteScreen *screen = qobject_cast<QTestLiteScreen *> (QApplicationPrivate::platformIntegration()->screens().at(0)); + Q_ASSERT(screen); + + initializeAllAtoms(screen); + initializeSupportedAtoms(screen); + + resolveXFixes(screen); + } + + bool isSupportedByWM(Atom atom) + { + if (!m_supportedAtoms) + return false; + + bool supported = false; + int i = 0; + while (m_supportedAtoms[i] != 0) { + if (m_supportedAtoms[i++] == atom) { + supported = true; + break; + } + } + + return supported; + } + + Atom atom(QTestLiteStaticInfo::X11Atom atom) + { + return m_allAtoms[atom]; + } + + bool useXFixes() const { return use_xfixes; } + + int xFixesEventBase() const {return xfixes_eventbase; } + + PtrXFixesSelectSelectionInput xFixesSelectSelectionInput() const + { + return ptrXFixesSelectSelectionInput; + } + +private: + + void initializeAllAtoms(QTestLiteScreen *screen) { + const char *names[QTestLiteStaticInfo::NAtoms]; + const char *ptr = x11_atomnames; + + int i = 0; + while (*ptr) { + names[i++] = ptr; + while (*ptr) + ++ptr; + ++ptr; + } + + Q_ASSERT(i == QTestLiteStaticInfo::NPredefinedAtoms); + + QByteArray settings_atom_name("_QT_SETTINGS_TIMESTAMP_"); + settings_atom_name += XDisplayName(qPrintable(screen->displayName())); + names[i++] = settings_atom_name; + + Q_ASSERT(i == QTestLiteStaticInfo::NAtoms); + #if 0//defined(XlibSpecificationRelease) && (XlibSpecificationRelease >= 6) + XInternAtoms(screen->display(), (char **)names, i, False, m_allAtoms); + #else + for (i = 0; i < QTestLiteStaticInfo::NAtoms; ++i) + m_allAtoms[i] = XInternAtom(screen->display(), (char *)names[i], False); + #endif + } + + void initializeSupportedAtoms(QTestLiteScreen *screen) + { + Atom type; + int format; + long offset = 0; + unsigned long nitems, after; + unsigned char *data = 0; + + int e = XGetWindowProperty(screen->display(), screen->rootWindow(), + this->atom(QTestLiteStaticInfo::_NET_SUPPORTED), 0, 0, + False, XA_ATOM, &type, &format, &nitems, &after, &data); + if (data) + XFree(data); + + if (e == Success && type == XA_ATOM && format == 32) { + QBuffer ts; + ts.open(QIODevice::WriteOnly); + + while (after > 0) { + XGetWindowProperty(screen->display(), screen->rootWindow(), + this->atom(QTestLiteStaticInfo::_NET_SUPPORTED), offset, 1024, + False, XA_ATOM, &type, &format, &nitems, &after, &data); + + if (type == XA_ATOM && format == 32) { + ts.write(reinterpret_cast<char *>(data), nitems * sizeof(long)); + offset += nitems; + } else + after = 0; + if (data) + XFree(data); + } + + // compute nitems + QByteArray buffer(ts.buffer()); + nitems = buffer.size() / sizeof(Atom); + m_supportedAtoms = new Atom[nitems + 1]; + Atom *a = (Atom *) buffer.data(); + uint i; + for (i = 0; i < nitems; i++) + m_supportedAtoms[i] = a[i]; + m_supportedAtoms[nitems] = 0; + + } + } + + void resolveXFixes(QTestLiteScreen *screen) + { +#ifndef QT_NO_XFIXES + // See if Xfixes is supported on the connected display + if (XQueryExtension(screen->display(), "XFIXES", &xfixes_major, + &xfixes_eventbase, &xfixes_errorbase)) { + ptrXFixesQueryExtension = XFIXES_LOAD_V1(XFixesQueryExtension); + ptrXFixesQueryVersion = XFIXES_LOAD_V1(XFixesQueryVersion); + ptrXFixesSetCursorName = XFIXES_LOAD_V2(XFixesSetCursorName); + ptrXFixesSelectSelectionInput = XFIXES_LOAD_V2(XFixesSelectSelectionInput); + + if(ptrXFixesQueryExtension && ptrXFixesQueryVersion + && ptrXFixesQueryExtension(screen->display(), &xfixes_eventbase, + &xfixes_errorbase)) { + // Xfixes is supported. + // Note: the XFixes protocol version is negotiated using QueryVersion. + // We supply the highest version we support, the X server replies with + // the highest version it supports, but no higher than the version we + // asked for. The version sent back is the protocol version the X server + // will use to talk us. If this call is removed, the behavior of the + // X server when it receives an XFixes request is undefined. + int major = 3; + int minor = 0; + ptrXFixesQueryVersion(screen->display(), &major, &minor); + use_xfixes = (major >= 1); + xfixes_major = major; + } + } +#endif // QT_NO_XFIXES + + } + + Atom *m_supportedAtoms; + Atom m_allAtoms[QTestLiteStaticInfo::NAtoms]; + +#ifndef QT_NO_XFIXES + PtrXFixesQueryExtension ptrXFixesQueryExtension; + PtrXFixesQueryVersion ptrXFixesQueryVersion; + PtrXFixesSetCursorName ptrXFixesSetCursorName; + PtrXFixesSelectSelectionInput ptrXFixesSelectSelectionInput; +#endif + + bool use_xfixes; + int xfixes_major; + int xfixes_eventbase; + int xfixes_errorbase; + +}; +Q_GLOBAL_STATIC(QTestLiteStaticInfoPrivate, qTestLiteStaticInfoPrivate); + + +Atom QTestLiteStaticInfo::atom(QTestLiteStaticInfo::X11Atom atom) +{ + return qTestLiteStaticInfoPrivate()->atom(atom); +} + +bool QTestLiteStaticInfo::isSupportedByWM(Atom atom) +{ + return qTestLiteStaticInfoPrivate()->isSupportedByWM(atom); +} + +bool QTestLiteStaticInfo::useXFixes() +{ + return qTestLiteStaticInfoPrivate()->useXFixes(); +} + +int QTestLiteStaticInfo::xFixesEventBase() +{ + return qTestLiteStaticInfoPrivate()->xFixesEventBase(); +} + +#ifndef QT_NO_XFIXES +PtrXFixesSelectSelectionInput QTestLiteStaticInfo::xFixesSelectSelectionInput() +{ + qDebug() << qTestLiteStaticInfoPrivate()->useXFixes(); + if (!qTestLiteStaticInfoPrivate()->useXFixes()) + return 0; + + return qTestLiteStaticInfoPrivate()->xFixesSelectSelectionInput(); +} +#endif //QT_NO_XFIXES diff --git a/src/plugins/platforms/testlite/qtestlitestaticinfo.h b/src/plugins/platforms/testlite/qtestlitestaticinfo.h new file mode 100644 index 0000000..ed0f7bd --- /dev/null +++ b/src/plugins/platforms/testlite/qtestlitestaticinfo.h @@ -0,0 +1,371 @@ +#ifndef QTESTLITESTATICINFO_H +#define QTESTLITESTATICINFO_H + +#include <QtCore/QTextStream> +#include <QtCore/QDataStream> +#include <QtCore/QMetaType> +#include <QtCore/QVariant> + +#if defined(_XLIB_H_) // crude hack, but... +#error "cannot include <X11/Xlib.h> before this file" +#endif +#define XRegisterIMInstantiateCallback qt_XRegisterIMInstantiateCallback +#define XUnregisterIMInstantiateCallback qt_XUnregisterIMInstantiateCallback +#define XSetIMValues qt_XSetIMValues +#include <X11/Xlib.h> +#undef XRegisterIMInstantiateCallback +#undef XUnregisterIMInstantiateCallback +#undef XSetIMValues + +#include <X11/Xutil.h> +#include <X11/Xos.h> +#ifdef index +# undef index +#endif +#ifdef rindex +# undef rindex +#endif +#ifdef Q_OS_VXWORS +# ifdef open +# undef open +# endif +# ifdef getpid +# undef getpid +# endif +#endif // Q_OS_VXWORKS +#include <X11/Xatom.h> + +//#define QT_NO_SHAPE +#ifdef QT_NO_SHAPE +# define XShapeCombineRegion(a,b,c,d,e,f,g) +# define XShapeCombineMask(a,b,c,d,e,f,g) +#else +# include <X11/extensions/shape.h> +#endif // QT_NO_SHAPE + + +#if !defined (QT_NO_TABLET) +# include <X11/extensions/XInput.h> +#if defined (Q_OS_IRIX) +# include <X11/extensions/SGIMisc.h> +# include <wacom.h> +#endif +#endif // QT_NO_TABLET + + +// #define QT_NO_XINERAMA +#ifndef QT_NO_XINERAMA +// XFree86 does not C++ify Xinerama (at least up to XFree86 4.0.3). +extern "C" { +# include <X11/extensions/Xinerama.h> +} +#endif // QT_NO_XINERAMA + +// #define QT_NO_XRANDR +#ifndef QT_NO_XRANDR +# include <X11/extensions/Xrandr.h> +#endif // QT_NO_XRANDR + +// #define QT_NO_XRENDER +#ifndef QT_NO_XRENDER +# include <X11/extensions/Xrender.h> +#endif // QT_NO_XRENDER + +#ifndef QT_NO_XSYNC +extern "C" { +# include "X11/extensions/sync.h" +} +#endif + +// #define QT_NO_XKB +#ifndef QT_NO_XKB +# include <X11/XKBlib.h> +#endif // QT_NO_XKB + + +#if !defined(XlibSpecificationRelease) +# define X11R4 +typedef char *XPointer; +#else +# undef X11R4 +#endif + +#ifndef QT_NO_XFIXES +typedef Bool (*PtrXFixesQueryExtension)(Display *, int *, int *); +typedef Status (*PtrXFixesQueryVersion)(Display *, int *, int *); +typedef void (*PtrXFixesSetCursorName)(Display *dpy, Cursor cursor, const char *name); +typedef void (*PtrXFixesSelectSelectionInput)(Display *dpy, Window win, Atom selection, unsigned long eventMask); +#endif // QT_NO_XFIXES + +#ifndef QT_NO_XCURSOR +#include <X11/Xcursor/Xcursor.h> +typedef Cursor (*PtrXcursorLibraryLoadCursor)(Display *, const char *); +#endif // QT_NO_XCURSOR + +#ifndef QT_NO_XINERAMA +typedef Bool (*PtrXineramaQueryExtension)(Display *dpy, int *event_base, int *error_base); +typedef Bool (*PtrXineramaIsActive)(Display *dpy); +typedef XineramaScreenInfo *(*PtrXineramaQueryScreens)(Display *dpy, int *number); +#endif // QT_NO_XINERAMA + +#ifndef QT_NO_XRANDR +typedef void (*PtrXRRSelectInput)(Display *, Window, int); +typedef int (*PtrXRRUpdateConfiguration)(XEvent *); +typedef int (*PtrXRRRootToScreen)(Display *, Window); +typedef Bool (*PtrXRRQueryExtension)(Display *, int *, int *); +#endif // QT_NO_XRANDR + +#ifndef QT_NO_XINPUT +typedef int (*PtrXCloseDevice)(Display *, XDevice *); +typedef XDeviceInfo* (*PtrXListInputDevices)(Display *, int *); +typedef XDevice* (*PtrXOpenDevice)(Display *, XID); +typedef void (*PtrXFreeDeviceList)(XDeviceInfo *); +typedef int (*PtrXSelectExtensionEvent)(Display *, Window, XEventClass *, int); +#endif // QT_NO_XINPUT + +/* + * Solaris patch 108652-47 and higher fixes crases in + * XRegisterIMInstantiateCallback, but the function doesn't seem to + * work. + * + * Instead, we disabled R6 input, and open the input method + * immediately at application start. + */ + +//######### XFree86 has wrong declarations for XRegisterIMInstantiateCallback +//######### and XUnregisterIMInstantiateCallback in at least version 3.3.2. +//######### Many old X11R6 header files lack XSetIMValues. +//######### Therefore, we have to declare these functions ourselves. + +extern "C" Bool XRegisterIMInstantiateCallback( + Display*, + struct _XrmHashBucketRec*, + char*, + char*, + XIMProc, //XFree86 has XIDProc, which has to be wrong + XPointer +); + +extern "C" Bool XUnregisterIMInstantiateCallback( + Display*, + struct _XrmHashBucketRec*, + char*, + char*, + XIMProc, //XFree86 has XIDProc, which has to be wrong + XPointer +); + +#ifndef X11R4 +# include <X11/Xlocale.h> +#endif // X11R4 + + +#ifndef QT_NO_MITSHM +# include <X11/extensions/XShm.h> +#endif // QT_NO_MITSHM + +// rename a couple of X defines to get rid of name clashes +// resolve the conflict between X11's FocusIn and QEvent::FocusIn +enum { + XFocusOut = FocusOut, + XFocusIn = FocusIn, + XKeyPress = KeyPress, + XKeyRelease = KeyRelease, + XNone = None, + XRevertToParent = RevertToParent, + XGrayScale = GrayScale, + XCursorShape = CursorShape +}; +#undef FocusOut +#undef FocusIn +#undef KeyPress +#undef KeyRelease +#undef None +#undef RevertToParent +#undef GrayScale +#undef CursorShape + +#ifdef FontChange +#undef FontChange +#endif + + +class QTestLiteStaticInfo +{ +public: + enum X11Atom { + // window-manager <-> client protocols + WM_PROTOCOLS, + WM_DELETE_WINDOW, + WM_TAKE_FOCUS, + _NET_WM_PING, + _NET_WM_CONTEXT_HELP, + _NET_WM_SYNC_REQUEST, + _NET_WM_SYNC_REQUEST_COUNTER, + + // ICCCM window state + WM_STATE, + WM_CHANGE_STATE, + + // Session management + WM_CLIENT_LEADER, + WM_WINDOW_ROLE, + SM_CLIENT_ID, + + // Clipboard + CLIPBOARD, + INCR, + TARGETS, + MULTIPLE, + TIMESTAMP, + SAVE_TARGETS, + CLIP_TEMPORARY, + _QT_SELECTION, + _QT_CLIPBOARD_SENTINEL, + _QT_SELECTION_SENTINEL, + CLIPBOARD_MANAGER, + + RESOURCE_MANAGER, + + _XSETROOT_ID, + + _QT_SCROLL_DONE, + _QT_INPUT_ENCODING, + + _MOTIF_WM_HINTS, + + DTWM_IS_RUNNING, + ENLIGHTENMENT_DESKTOP, + _DT_SAVE_MODE, + _SGI_DESKS_MANAGER, + + // EWMH (aka NETWM) + _NET_SUPPORTED, + _NET_VIRTUAL_ROOTS, + _NET_WORKAREA, + + _NET_MOVERESIZE_WINDOW, + _NET_WM_MOVERESIZE, + + _NET_WM_NAME, + _NET_WM_ICON_NAME, + _NET_WM_ICON, + + _NET_WM_PID, + + _NET_WM_WINDOW_OPACITY, + + _NET_WM_STATE, + _NET_WM_STATE_ABOVE, + _NET_WM_STATE_BELOW, + _NET_WM_STATE_FULLSCREEN, + _NET_WM_STATE_MAXIMIZED_HORZ, + _NET_WM_STATE_MAXIMIZED_VERT, + _NET_WM_STATE_MODAL, + _NET_WM_STATE_STAYS_ON_TOP, + _NET_WM_STATE_DEMANDS_ATTENTION, + + _NET_WM_USER_TIME, + _NET_WM_USER_TIME_WINDOW, + _NET_WM_FULL_PLACEMENT, + + _NET_WM_WINDOW_TYPE, + _NET_WM_WINDOW_TYPE_DESKTOP, + _NET_WM_WINDOW_TYPE_DOCK, + _NET_WM_WINDOW_TYPE_TOOLBAR, + _NET_WM_WINDOW_TYPE_MENU, + _NET_WM_WINDOW_TYPE_UTILITY, + _NET_WM_WINDOW_TYPE_SPLASH, + _NET_WM_WINDOW_TYPE_DIALOG, + _NET_WM_WINDOW_TYPE_DROPDOWN_MENU, + _NET_WM_WINDOW_TYPE_POPUP_MENU, + _NET_WM_WINDOW_TYPE_TOOLTIP, + _NET_WM_WINDOW_TYPE_NOTIFICATION, + _NET_WM_WINDOW_TYPE_COMBO, + _NET_WM_WINDOW_TYPE_DND, + _NET_WM_WINDOW_TYPE_NORMAL, + _KDE_NET_WM_WINDOW_TYPE_OVERRIDE, + + _KDE_NET_WM_FRAME_STRUT, + + _NET_STARTUP_INFO, + _NET_STARTUP_INFO_BEGIN, + + _NET_SUPPORTING_WM_CHECK, + + _NET_WM_CM_S0, + + _NET_SYSTEM_TRAY_VISUAL, + + _NET_ACTIVE_WINDOW, + + // Property formats + COMPOUND_TEXT, + TEXT, + UTF8_STRING, + + // Xdnd + XdndEnter, + XdndPosition, + XdndStatus, + XdndLeave, + XdndDrop, + XdndFinished, + XdndTypelist, + XdndActionList, + + XdndSelection, + + XdndAware, + XdndProxy, + + XdndActionCopy, + XdndActionLink, + XdndActionMove, + XdndActionPrivate, + + // Motif DND + _MOTIF_DRAG_AND_DROP_MESSAGE, + _MOTIF_DRAG_INITIATOR_INFO, + _MOTIF_DRAG_RECEIVER_INFO, + _MOTIF_DRAG_WINDOW, + _MOTIF_DRAG_TARGETS, + + XmTRANSFER_SUCCESS, + XmTRANSFER_FAILURE, + + // Xkb + _XKB_RULES_NAMES, + + // XEMBED + _XEMBED, + _XEMBED_INFO, + + XWacomStylus, + XWacomCursor, + XWacomEraser, + + XTabletStylus, + XTabletEraser, + + NPredefinedAtoms, + + _QT_SETTINGS_TIMESTAMP = NPredefinedAtoms, + NAtoms + }; + + static Atom atom(X11Atom atom); + static bool isSupportedByWM(Atom atom); + + static bool useXFixes(); + static int xFixesEventBase(); + + #ifndef QT_NO_XFIXES + static PtrXFixesSelectSelectionInput xFixesSelectSelectionInput(); + #endif //QT_NO_XFIXES + + + +}; + +#endif // QTESTLITESTATICINFO_H diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index 6f9ad58..71232ac 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -44,6 +44,7 @@ #include "qtestliteintegration.h" #include "qtestlitescreen.h" #include "qtestlitekeyboard.h" +#include "qtestlitestaticinfo.h" #include <QtGui/QWindowSystemInterface> #include <QSocketNotifier> @@ -101,19 +102,26 @@ QTestLiteWindow::QTestLiteWindow(QWidget *window) XSetWindowBackgroundPixmap(mScreen->display(), x_window, XNone); - XSelectInput(mScreen->display(), x_window, ExposureMask | KeyPressMask | KeyReleaseMask | + XSelectInput(mScreen->display(), x_window, + ExposureMask | KeyPressMask | KeyReleaseMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask | - PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | + PointerMotionMask | ButtonPressMask | ButtonReleaseMask | + ButtonMotionMask | PropertyChangeMask | StructureNotifyMask); gc = createGC(); - Atom wmDeleteWindowAtom = mScreen->wmDeleteWindowAtom(); - XChangeProperty (mScreen->display(), x_window, - mScreen->wmProtocolsAtom(), - XA_ATOM, 32, PropModeAppend, - (unsigned char *) &wmDeleteWindowAtom, 1); - mScreen->setWmDeleteWindowAtom(wmDeleteWindowAtom); + Atom protocols[5]; + int n = 0; + protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::WM_DELETE_WINDOW); // support del window protocol + protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::WM_TAKE_FOCUS); // support take focus window protocol + protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_NET_WM_PING); // support _NET_WM_PING protocol +#ifndef QT_NO_XSYNC + protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_NET_WM_SYNC_REQUEST); // support _NET_WM_SYNC_REQUEST protocol +#endif // QT_NO_XSYNC + if (window->windowFlags() & Qt::WindowContextHelpButtonHint) + protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_NET_WM_CONTEXT_HELP); + XSetWMProtocols(mScreen->display(), x_window, protocols, n); } @@ -336,10 +344,11 @@ QtMWMHints QTestLiteWindow::getMWMHints() const int format; ulong nitems, bytesLeft; uchar *data = 0; - if ((XGetWindowProperty(mScreen->display(), x_window, mScreen->atomForMotifWmHints(), 0, 5, false, - mScreen->atomForMotifWmHints(), &type, &format, &nitems, &bytesLeft, + Atom atomForMotifWmHints = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_MOTIF_WM_HINTS); + if ((XGetWindowProperty(mScreen->display(), x_window, atomForMotifWmHints, 0, 5, false, + atomForMotifWmHints, &type, &format, &nitems, &bytesLeft, &data) == Success) - && (type == mScreen->atomForMotifWmHints() + && (type == atomForMotifWmHints && format == 32 && nitems >= 5)) { mwmhints = *(reinterpret_cast<QtMWMHints *>(data)); @@ -359,12 +368,13 @@ QtMWMHints QTestLiteWindow::getMWMHints() const void QTestLiteWindow::setMWMHints(const QtMWMHints &mwmhints) { + Atom atomForMotifWmHints = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_MOTIF_WM_HINTS); if (mwmhints.flags != 0l) { XChangeProperty(mScreen->display(), x_window, - mScreen->atomForMotifWmHints(), mScreen->atomForMotifWmHints(), 32, + atomForMotifWmHints, atomForMotifWmHints, 32, PropModeReplace, (unsigned char *) &mwmhints, 5); } else { - XDeleteProperty(mScreen->display(), x_window, mScreen->atomForMotifWmHints()); + XDeleteProperty(mScreen->display(), x_window, atomForMotifWmHints); } } diff --git a/src/plugins/platforms/testlite/testlite.pro b/src/plugins/platforms/testlite/testlite.pro index d2f2562..9f8075c 100644 --- a/src/plugins/platforms/testlite/testlite.pro +++ b/src/plugins/platforms/testlite/testlite.pro @@ -10,7 +10,10 @@ SOURCES = \ qtestlitewindow.cpp \ qtestlitecursor.cpp \ qtestlitescreen.cpp \ - qtestlitekeyboard.cpp + qtestlitekeyboard.cpp \ + qtestliteclipboard.cpp \ + qtestlitemime.cpp \ + qtestlitestaticinfo.cpp HEADERS = \ qtestliteintegration.h \ @@ -18,7 +21,10 @@ HEADERS = \ qtestlitewindow.h \ qtestlitecursor.h \ qtestlitescreen.h \ - qtestlitekeyboard.h + qtestlitekeyboard.h \ + qtestliteclipboard.h \ + qtestlitemime.h \ + qtestlitestaticinfo.h LIBS += -lX11 -lXext -- cgit v0.12 From afc9371b68d7db91c0874b3923a376224656e4c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Mon, 3 Jan 2011 16:28:29 +0100 Subject: Renamed QTestLiteStaticInfo to QTestLiteStatic --- .../platforms/testlite/qtestliteclipboard.cpp | 38 +++++------ src/plugins/platforms/testlite/qtestlitemime.cpp | 46 ++++++------- src/plugins/platforms/testlite/qtestlitescreen.cpp | 8 +-- .../platforms/testlite/qtestlitestaticinfo.cpp | 79 ++++++++++++++++++---- .../platforms/testlite/qtestlitestaticinfo.h | 3 +- src/plugins/platforms/testlite/qtestlitewindow.cpp | 14 ++-- 6 files changed, 121 insertions(+), 67 deletions(-) diff --git a/src/plugins/platforms/testlite/qtestliteclipboard.cpp b/src/plugins/platforms/testlite/qtestliteclipboard.cpp index fdd6d30..9e1b387 100644 --- a/src/plugins/platforms/testlite/qtestliteclipboard.cpp +++ b/src/plugins/platforms/testlite/qtestliteclipboard.cpp @@ -28,7 +28,7 @@ const QMimeData * QTestLiteClipboard::mimeData(QClipboard::Mode mode) const QTestLiteClipboard *that = const_cast<QTestLiteClipboard *>(this); that->m_xClipboard = new QTestLiteMime(mode,that); } - Window clipboardOwner = XGetSelectionOwner(screen()->display(),QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD)); + Window clipboardOwner = XGetSelectionOwner(screen()->display(),QTestLiteStatic::atom(QTestLiteStatic::CLIPBOARD)); if (clipboardOwner == owner()) { return m_clientClipboard; } else { @@ -49,7 +49,7 @@ void QTestLiteClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode) break; case QClipboard::Clipboard: - modeAtom = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD); + modeAtom = QTestLiteStatic::atom(QTestLiteStatic::CLIPBOARD); d = &m_clientClipboard; break; @@ -131,16 +131,16 @@ Atom QTestLiteClipboard::sendTargetsSelection(QMimeData *d, Window window, Atom QVector<Atom> types; QStringList formats = QInternalMimeData::formatsHelper(d); for (int i = 0; i < formats.size(); ++i) { - QList<Atom> atoms = QTestLiteMime::xdndMimeAtomsForFormat(screen()->display(),formats.at(i)); + QList<Atom> atoms = QTestLiteMime::mimeAtomsForFormat(screen()->display(),formats.at(i)); for (int j = 0; j < atoms.size(); ++j) { if (!types.contains(atoms.at(j))) types.append(atoms.at(j)); } } - types.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TARGETS)); - types.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::MULTIPLE)); - types.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TIMESTAMP)); - types.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::SAVE_TARGETS)); + types.append(QTestLiteStatic::atom(QTestLiteStatic::TARGETS)); + types.append(QTestLiteStatic::atom(QTestLiteStatic::MULTIPLE)); + types.append(QTestLiteStatic::atom(QTestLiteStatic::TIMESTAMP)); + types.append(QTestLiteStatic::atom(QTestLiteStatic::SAVE_TARGETS)); XChangeProperty(screen()->display(), window, property, XA_ATOM, 32, PropModeReplace, (uchar *) types.data(), types.size()); @@ -164,7 +164,7 @@ Atom QTestLiteClipboard::sendSelection(QMimeData *d, Atom target, Window window, // don't allow INCR transfers when using MULTIPLE or to // Motif clients (since Motif doesn't support INCR) - static Atom motif_clip_temporary = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIP_TEMPORARY); + static Atom motif_clip_temporary = QTestLiteStatic::atom(QTestLiteStatic::CLIP_TEMPORARY); bool allow_incr = property != motif_clip_temporary; // X_ChangeProperty protocol request is 24 bytes @@ -172,7 +172,7 @@ Atom QTestLiteClipboard::sendSelection(QMimeData *d, Atom target, Window window, if (data.size() > increment && allow_incr) { long bytes = data.size(); XChangeProperty(screen()->display(), window, property, - QTestLiteStaticInfo::atom(QTestLiteStaticInfo::INCR), 32, PropModeReplace, (uchar *) &bytes, 1); + QTestLiteStatic::atom(QTestLiteStatic::INCR), 32, PropModeReplace, (uchar *) &bytes, 1); // (void)new QClipboardINCRTransaction(window, property, atomFormat, dataFormat, data, increment); qDebug() << "not implemented INCRT just YET!"; @@ -212,7 +212,7 @@ void QTestLiteClipboard::handleSelectionRequest(XEvent *xevent) QMimeData *d; if (req->selection == XA_PRIMARY) { d = m_clientSelection; - } else if (req->selection == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD)) { + } else if (req->selection == QTestLiteStatic::atom(QTestLiteStatic::CLIPBOARD)) { d = m_clientClipboard; } else { qWarning("QClipboard: Unknown selection '%lx'", req->selection); @@ -226,9 +226,9 @@ void QTestLiteClipboard::handleSelectionRequest(XEvent *xevent) return; } - Atom xa_targets = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TARGETS); - Atom xa_multiple = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::MULTIPLE); - Atom xa_timestamp = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TIMESTAMP); + Atom xa_targets = QTestLiteStatic::atom(QTestLiteStatic::TARGETS); + Atom xa_multiple = QTestLiteStatic::atom(QTestLiteStatic::MULTIPLE); + Atom xa_timestamp = QTestLiteStatic::atom(QTestLiteStatic::TIMESTAMP); struct AtomPair { Atom target; Atom property; } *multi = 0; Atom multi_type = XNone; @@ -394,7 +394,7 @@ bool QTestLiteClipboard::clipboardReadProperty(Window win, Atom property, bool d XFree((char*)data); } - if (*format == 8 && *type == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) { + if (*format == 8 && *type == QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT)) { // convert COMPOUND_TEXT to a multibyte string XTextProperty textprop; textprop.encoding = *type; @@ -492,8 +492,8 @@ QByteArray QTestLiteClipboard::getDataInFormat(Atom modeAtom, Atom fmtatom) XSelectInput(screen()->display(), win, NoEventMask); // don't listen for any events - XDeleteProperty(screen()->display(), win, QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_QT_SELECTION)); - XConvertSelection(screen()->display(), modeAtom, fmtatom, QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_QT_SELECTION), win, CurrentTime); + XDeleteProperty(screen()->display(), win, QTestLiteStatic::atom(QTestLiteStatic::_QT_SELECTION)); + XConvertSelection(screen()->display(), modeAtom, fmtatom, QTestLiteStatic::atom(QTestLiteStatic::_QT_SELECTION), win, CurrentTime); XSync(screen()->display(), false); XEvent xevent; @@ -505,10 +505,10 @@ QByteArray QTestLiteClipboard::getDataInFormat(Atom modeAtom, Atom fmtatom) Atom type; XSelectInput(screen()->display(), win, PropertyChangeMask); - if (clipboardReadProperty(win, QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_QT_SELECTION), true, &buf, 0, &type, 0)) { - if (type == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::INCR)) { + if (clipboardReadProperty(win, QTestLiteStatic::atom(QTestLiteStatic::_QT_SELECTION), true, &buf, 0, &type, 0)) { + if (type == QTestLiteStatic::atom(QTestLiteStatic::INCR)) { int nbytes = buf.size() >= 4 ? *((int*)buf.data()) : 0; - buf = clipboardReadIncrementalProperty(win, QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_QT_SELECTION), nbytes, false); + buf = clipboardReadIncrementalProperty(win, QTestLiteStatic::atom(QTestLiteStatic::_QT_SELECTION), nbytes, false); } } diff --git a/src/plugins/platforms/testlite/qtestlitemime.cpp b/src/plugins/platforms/testlite/qtestlitemime.cpp index 6261383..6a08b8c 100644 --- a/src/plugins/platforms/testlite/qtestlitemime.cpp +++ b/src/plugins/platforms/testlite/qtestlitemime.cpp @@ -99,7 +99,7 @@ QString QTestLiteMime::xdndMimeAtomToString(Display *display, Atom a) { if (!a) return 0; - if (a == XA_STRING || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING)) { + if (a == XA_STRING || a == QTestLiteStatic::atom(QTestLiteStatic::UTF8_STRING)) { return "text/plain"; // some Xdnd clients are dumb } char *atom = XGetAtomName(display, a); @@ -123,10 +123,10 @@ QStringList QTestLiteMime::xdndMimeFormatsForAtom(Display *display, Atom a) formats.append(atomName); // special cases for string type - if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING) + if (a == QTestLiteStatic::atom(QTestLiteStatic::UTF8_STRING) || a == XA_STRING - || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT) - || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) + || a == QTestLiteStatic::atom(QTestLiteStatic::TEXT) + || a == QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT)) formats.append(QLatin1String("text/plain")); // special cases for uris @@ -152,27 +152,27 @@ bool QTestLiteMime::xdndMimeDataForAtom(Display *display, Atom a, QMimeData *mim *dataFormat = 16; ret = true; } else { - if ((a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING) + if ((a == QTestLiteStatic::atom(QTestLiteStatic::UTF8_STRING) || a == XA_STRING - || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT) - || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) + || a == QTestLiteStatic::atom(QTestLiteStatic::TEXT) + || a == QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT)) && QInternalMimeData::hasFormatHelper(QLatin1String("text/plain"), mimeData)) { - if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING)){ + if (a == QTestLiteStatic::atom(QTestLiteStatic::UTF8_STRING)){ *data = QInternalMimeData::renderDataHelper(QLatin1String("text/plain"), mimeData); ret = true; } else if (a == XA_STRING) { *data = QString::fromUtf8(QInternalMimeData::renderDataHelper( QLatin1String("text/plain"), mimeData)).toLocal8Bit(); ret = true; - } else if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT) - || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) { + } else if (a == QTestLiteStatic::atom(QTestLiteStatic::TEXT) + || a == QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT)) { // the ICCCM states that TEXT and COMPOUND_TEXT are in the // encoding of choice, so we choose the encoding of the locale QByteArray strData = QString::fromUtf8(QInternalMimeData::renderDataHelper( QLatin1String("text/plain"), mimeData)).toLocal8Bit(); char *list[] = { strData.data(), NULL }; - XICCEncodingStyle style = (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) + XICCEncodingStyle style = (a == QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT)) ? XCompoundTextStyle : XStdICCTextStyle; XTextProperty textprop; if (list[0] != NULL @@ -222,10 +222,10 @@ QList<Atom> QTestLiteMime::xdndMimeAtomsForFormat(Display *display, const QStrin // special cases for strings if (format == QLatin1String("text/plain")) { - atoms.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING)); + atoms.append(QTestLiteStatic::atom(QTestLiteStatic::UTF8_STRING)); atoms.append(XA_STRING); - atoms.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT)); - atoms.append(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)); + atoms.append(QTestLiteStatic::atom(QTestLiteStatic::TEXT)); + atoms.append(QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT)); } // special cases for uris @@ -262,12 +262,12 @@ QVariant QTestLiteMime::xdndMimeConvertToFormat(Display *display, Atom a, const // special cases for string types if (format == QLatin1String("text/plain")) { - if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING)) + if (a == QTestLiteStatic::atom(QTestLiteStatic::UTF8_STRING)) return QString::fromUtf8(data); if (a == XA_STRING) return QString::fromLatin1(data); - if (a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT) - || a == QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT)) + if (a == QTestLiteStatic::atom(QTestLiteStatic::TEXT) + || a == QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT)) // #### might be wrong for COMPUND_TEXT return QString::fromLocal8Bit(data, data.size()); } @@ -312,12 +312,12 @@ Atom QTestLiteMime::xdndMimeAtomForFormat(Display *display, const QString &forma // find matches for string types if (format == QLatin1String("text/plain")) { - if (atoms.contains(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING))) - return QTestLiteStaticInfo::atom(QTestLiteStaticInfo::UTF8_STRING); - if (atoms.contains(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT))) - return QTestLiteStaticInfo::atom(QTestLiteStaticInfo::COMPOUND_TEXT); - if (atoms.contains(QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT))) - return QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TEXT); + if (atoms.contains(QTestLiteStatic::atom(QTestLiteStatic::UTF8_STRING))) + return QTestLiteStatic::atom(QTestLiteStatic::UTF8_STRING); + if (atoms.contains(QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT))) + return QTestLiteStatic::atom(QTestLiteStatic::COMPOUND_TEXT); + if (atoms.contains(QTestLiteStatic::atom(QTestLiteStatic::TEXT))) + return QTestLiteStatic::atom(QTestLiteStatic::TEXT); if (atoms.contains(XA_STRING)) return XA_STRING; } diff --git a/src/plugins/platforms/testlite/qtestlitescreen.cpp b/src/plugins/platforms/testlite/qtestlitescreen.cpp index 2ae7028..82dab9a 100644 --- a/src/plugins/platforms/testlite/qtestlitescreen.cpp +++ b/src/plugins/platforms/testlite/qtestlitescreen.cpp @@ -248,14 +248,14 @@ QTestLiteScreen::~QTestLiteScreen() bool QTestLiteScreen::handleEvent(XEvent *xe) { int quit = false; - QTestLiteWindow *xw = 0; + QTestLiteWindow *platformWindow = 0; QWidget *widget = QWidget::find(xe->xany.window); if (widget) { xw = static_cast<QTestLiteWindow *>(widget->platformWindow()); } - Atom wmProtocolsAtom = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::WM_PROTOCOLS); - Atom wmDeleteWindowAtom = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::WM_DELETE_WINDOW); + Atom wmProtocolsAtom = QTestLiteStatic::atom(QTestLiteStatic::WM_PROTOCOLS); + Atom wmDeleteWindowAtom = QTestLiteStatic::atom(QTestLiteStatic::WM_DELETE_WINDOW); switch (xe->type) { case ClientMessage: @@ -346,7 +346,7 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) static Bool checkForClipboardEvents(Display *, XEvent *e, XPointer) { - Atom clipboard = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD); + Atom clipboard = QTestLiteStatic::atom(QTestLiteStatic::CLIPBOARD); return ((e->type == SelectionRequest && (e->xselectionrequest.selection == XA_PRIMARY || e->xselectionrequest.selection == clipboard)) || (e->type == SelectionClear && (e->xselectionclear.selection == XA_PRIMARY diff --git a/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp b/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp index 20d73a2..875ac9e 100644 --- a/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp +++ b/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp @@ -246,7 +246,7 @@ public: return supported; } - Atom atom(QTestLiteStaticInfo::X11Atom atom) + Atom atom(QTestLiteStatic::X11Atom atom) { return m_allAtoms[atom]; } @@ -260,10 +260,58 @@ public: return ptrXFixesSelectSelectionInput; } + QImage qimageFromXImage(XImage *xi) + { + QImage::Format format = QImage::Format_ARGB32_Premultiplied; + if (xi->depth == 24) + format = QImage::Format_RGB32; + else if (xi->depth == 16) + format = QImage::Format_RGB16; + + QImage image = QImage((uchar *)xi->data, xi->width, xi->height, xi->bytes_per_line, format).copy(); + + // we may have to swap the byte order + if ((QSysInfo::ByteOrder == QSysInfo::LittleEndian && xi->byte_order == MSBFirst) + || (QSysInfo::ByteOrder == QSysInfo::BigEndian && xi->byte_order == LSBFirst)) + { + for (int i=0; i < image.height(); i++) { + if (xi->depth == 16) { + ushort *p = (ushort*)image.scanLine(i); + ushort *end = p + image.width(); + while (p < end) { + *p = ((*p << 8) & 0xff00) | ((*p >> 8) & 0x00ff); + p++; + } + } else { + uint *p = (uint*)image.scanLine(i); + uint *end = p + image.width(); + while (p < end) { + *p = ((*p << 24) & 0xff000000) | ((*p << 8) & 0x00ff0000) + | ((*p >> 8) & 0x0000ff00) | ((*p >> 24) & 0x000000ff); + p++; + } + } + } + } + + // fix-up alpha channel + if (format == QImage::Format_RGB32) { + QRgb *p = (QRgb *)image.bits(); + for (int y = 0; y < xi->height; ++y) { + for (int x = 0; x < xi->width; ++x) + p[x] |= 0xff000000; + p += xi->bytes_per_line / 4; + } + } + + return image; + } + + private: void initializeAllAtoms(QTestLiteScreen *screen) { - const char *names[QTestLiteStaticInfo::NAtoms]; + const char *names[QTestLiteStatic::NAtoms]; const char *ptr = x11_atomnames; int i = 0; @@ -274,17 +322,17 @@ private: ++ptr; } - Q_ASSERT(i == QTestLiteStaticInfo::NPredefinedAtoms); + Q_ASSERT(i == QTestLiteStatic::NPredefinedAtoms); QByteArray settings_atom_name("_QT_SETTINGS_TIMESTAMP_"); settings_atom_name += XDisplayName(qPrintable(screen->displayName())); names[i++] = settings_atom_name; - Q_ASSERT(i == QTestLiteStaticInfo::NAtoms); + Q_ASSERT(i == QTestLiteStatic::NAtoms); #if 0//defined(XlibSpecificationRelease) && (XlibSpecificationRelease >= 6) XInternAtoms(screen->display(), (char **)names, i, False, m_allAtoms); #else - for (i = 0; i < QTestLiteStaticInfo::NAtoms; ++i) + for (i = 0; i < QTestLiteStatic::NAtoms; ++i) m_allAtoms[i] = XInternAtom(screen->display(), (char *)names[i], False); #endif } @@ -298,7 +346,7 @@ private: unsigned char *data = 0; int e = XGetWindowProperty(screen->display(), screen->rootWindow(), - this->atom(QTestLiteStaticInfo::_NET_SUPPORTED), 0, 0, + this->atom(QTestLiteStatic::_NET_SUPPORTED), 0, 0, False, XA_ATOM, &type, &format, &nitems, &after, &data); if (data) XFree(data); @@ -309,7 +357,7 @@ private: while (after > 0) { XGetWindowProperty(screen->display(), screen->rootWindow(), - this->atom(QTestLiteStaticInfo::_NET_SUPPORTED), offset, 1024, + this->atom(QTestLiteStatic::_NET_SUPPORTED), offset, 1024, False, XA_ATOM, &type, &format, &nitems, &after, &data); if (type == XA_ATOM && format == 32) { @@ -367,7 +415,7 @@ private: } Atom *m_supportedAtoms; - Atom m_allAtoms[QTestLiteStaticInfo::NAtoms]; + Atom m_allAtoms[QTestLiteStatic::NAtoms]; #ifndef QT_NO_XFIXES PtrXFixesQueryExtension ptrXFixesQueryExtension; @@ -385,28 +433,28 @@ private: Q_GLOBAL_STATIC(QTestLiteStaticInfoPrivate, qTestLiteStaticInfoPrivate); -Atom QTestLiteStaticInfo::atom(QTestLiteStaticInfo::X11Atom atom) +Atom QTestLiteStatic::atom(QTestLiteStatic::X11Atom atom) { return qTestLiteStaticInfoPrivate()->atom(atom); } -bool QTestLiteStaticInfo::isSupportedByWM(Atom atom) +bool QTestLiteStatic::isSupportedByWM(Atom atom) { return qTestLiteStaticInfoPrivate()->isSupportedByWM(atom); } -bool QTestLiteStaticInfo::useXFixes() +bool QTestLiteStatic::useXFixes() { return qTestLiteStaticInfoPrivate()->useXFixes(); } -int QTestLiteStaticInfo::xFixesEventBase() +int QTestLiteStatic::xFixesEventBase() { return qTestLiteStaticInfoPrivate()->xFixesEventBase(); } #ifndef QT_NO_XFIXES -PtrXFixesSelectSelectionInput QTestLiteStaticInfo::xFixesSelectSelectionInput() +PtrXFixesSelectSelectionInput QTestLiteStatic::xFixesSelectSelectionInput() { qDebug() << qTestLiteStaticInfoPrivate()->useXFixes(); if (!qTestLiteStaticInfoPrivate()->useXFixes()) @@ -414,4 +462,9 @@ PtrXFixesSelectSelectionInput QTestLiteStaticInfo::xFixesSelectSelectionInput() return qTestLiteStaticInfoPrivate()->xFixesSelectSelectionInput(); } + +QImage QTestLiteStatic::qimageFromXImage(XImage *xi) +{ + return qTestLiteStaticInfoPrivate()->qimageFromXImage(xi); +} #endif //QT_NO_XFIXES diff --git a/src/plugins/platforms/testlite/qtestlitestaticinfo.h b/src/plugins/platforms/testlite/qtestlitestaticinfo.h index ed0f7bd..328de60 100644 --- a/src/plugins/platforms/testlite/qtestlitestaticinfo.h +++ b/src/plugins/platforms/testlite/qtestlitestaticinfo.h @@ -190,7 +190,7 @@ enum { #endif -class QTestLiteStaticInfo +class QTestLiteStatic { public: enum X11Atom { @@ -364,6 +364,7 @@ public: static PtrXFixesSelectSelectionInput xFixesSelectSelectionInput(); #endif //QT_NO_XFIXES + static QImage qimageFromXImage(XImage *xi); }; diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index 71232ac..e8d40d7 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -113,14 +113,14 @@ QTestLiteWindow::QTestLiteWindow(QWidget *window) Atom protocols[5]; int n = 0; - protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::WM_DELETE_WINDOW); // support del window protocol - protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::WM_TAKE_FOCUS); // support take focus window protocol - protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_NET_WM_PING); // support _NET_WM_PING protocol + protocols[n++] = QTestLiteStatic::atom(QTestLiteStatic::WM_DELETE_WINDOW); // support del window protocol + protocols[n++] = QTestLiteStatic::atom(QTestLiteStatic::WM_TAKE_FOCUS); // support take focus window protocol + protocols[n++] = QTestLiteStatic::atom(QTestLiteStatic::_NET_WM_PING); // support _NET_WM_PING protocol #ifndef QT_NO_XSYNC - protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_NET_WM_SYNC_REQUEST); // support _NET_WM_SYNC_REQUEST protocol + protocols[n++] = QTestLiteStatic::atom(QTestLiteStatic::_NET_WM_SYNC_REQUEST); // support _NET_WM_SYNC_REQUEST protocol #endif // QT_NO_XSYNC if (window->windowFlags() & Qt::WindowContextHelpButtonHint) - protocols[n++] = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_NET_WM_CONTEXT_HELP); + protocols[n++] = QTestLiteStatic::atom(QTestLiteStatic::_NET_WM_CONTEXT_HELP); XSetWMProtocols(mScreen->display(), x_window, protocols, n); } @@ -344,7 +344,7 @@ QtMWMHints QTestLiteWindow::getMWMHints() const int format; ulong nitems, bytesLeft; uchar *data = 0; - Atom atomForMotifWmHints = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_MOTIF_WM_HINTS); + Atom atomForMotifWmHints = QTestLiteStatic::atom(QTestLiteStatic::_MOTIF_WM_HINTS); if ((XGetWindowProperty(mScreen->display(), x_window, atomForMotifWmHints, 0, 5, false, atomForMotifWmHints, &type, &format, &nitems, &bytesLeft, &data) == Success) @@ -368,7 +368,7 @@ QtMWMHints QTestLiteWindow::getMWMHints() const void QTestLiteWindow::setMWMHints(const QtMWMHints &mwmhints) { - Atom atomForMotifWmHints = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::_MOTIF_WM_HINTS); + Atom atomForMotifWmHints = QTestLiteStatic::atom(QTestLiteStatic::_MOTIF_WM_HINTS); if (mwmhints.flags != 0l) { XChangeProperty(mScreen->display(), x_window, atomForMotifWmHints, atomForMotifWmHints, 32, -- cgit v0.12 From 6138bcd3543ac605731c9626191e7914f0995858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Mon, 3 Jan 2011 16:30:32 +0100 Subject: Renamed variable name in TestLite event handling --- src/plugins/platforms/testlite/qtestlitescreen.cpp | 40 +++++++++++----------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/plugins/platforms/testlite/qtestlitescreen.cpp b/src/plugins/platforms/testlite/qtestlitescreen.cpp index 82dab9a..c211ee6 100644 --- a/src/plugins/platforms/testlite/qtestlitescreen.cpp +++ b/src/plugins/platforms/testlite/qtestlitescreen.cpp @@ -251,7 +251,7 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) QTestLiteWindow *platformWindow = 0; QWidget *widget = QWidget::find(xe->xany.window); if (widget) { - xw = static_cast<QTestLiteWindow *>(widget->platformWindow()); + platformWindow = static_cast<QTestLiteWindow *>(widget->platformWindow()); } Atom wmProtocolsAtom = QTestLiteStatic::atom(QTestLiteStatic::WM_PROTOCOLS); @@ -262,33 +262,33 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom) { Atom a = xe->xclient.data.l[0]; if (a == wmDeleteWindowAtom) - xw->handleCloseEvent(); + platformWindow->handleCloseEvent(); } break; case Expose: - if (xw) + if (platformWindow) if (xe->xexpose.count == 0) - xw->paintEvent(); + platformWindow->paintEvent(); break; case ConfigureNotify: - if (xw) - xw->resizeEvent(&xe->xconfigure); + if (platformWindow) + platformWindow->resizeEvent(&xe->xconfigure); break; case ButtonPress: - if (xw) - xw->mousePressEvent(&xe->xbutton); + if (platformWindow) + platformWindow->mousePressEvent(&xe->xbutton); break; case ButtonRelease: - if (xw) - xw->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton); + if (platformWindow) + platformWindow->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton); break; case MotionNotify: - if (xw) - xw->handleMouseEvent(QEvent::MouseMove, &xe->xbutton); + if (platformWindow) + platformWindow->handleMouseEvent(QEvent::MouseMove, &xe->xbutton); break; case XKeyPress: @@ -300,23 +300,23 @@ bool QTestLiteScreen::handleEvent(XEvent *xe) break; case EnterNotify: - if (xw) - xw->handleEnterEvent(); + if (platformWindow) + platformWindow->handleEnterEvent(); break; case LeaveNotify: - if (xw) - xw->handleLeaveEvent(); + if (platformWindow) + platformWindow->handleLeaveEvent(); break; case XFocusIn: - if (xw) - xw->handleFocusInEvent(); + if (platformWindow) + platformWindow->handleFocusInEvent(); break; case XFocusOut: - if (xw) - xw->handleFocusOutEvent(); + if (platformWindow) + platformWindow->handleFocusOutEvent(); break; case PropertyNotify: -- cgit v0.12 From 0ceed999bbf25d19b3ded8a1b300cf0c6129f775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Mon, 3 Jan 2011 16:31:44 +0100 Subject: Create clearer sepperation between TestLiteMime and QTestliteClipboard --- .../platforms/testlite/qtestliteclipboard.cpp | 130 +++++++++++++++- .../platforms/testlite/qtestliteclipboard.h | 7 +- src/plugins/platforms/testlite/qtestlitemime.cpp | 173 ++++++--------------- src/plugins/platforms/testlite/qtestlitemime.h | 32 +--- 4 files changed, 181 insertions(+), 161 deletions(-) diff --git a/src/plugins/platforms/testlite/qtestliteclipboard.cpp b/src/plugins/platforms/testlite/qtestliteclipboard.cpp index 9e1b387..25c16ea 100644 --- a/src/plugins/platforms/testlite/qtestliteclipboard.cpp +++ b/src/plugins/platforms/testlite/qtestliteclipboard.cpp @@ -7,6 +7,104 @@ #include <QtCore/QDebug> +class QTestLiteClipboardMime : public QTestLiteMime +{ + Q_OBJECT +public: + QTestLiteClipboardMime(QClipboard::Mode mode, QTestLiteClipboard *clipboard) + : QTestLiteMime() + , m_clipboard(clipboard) + { + switch (mode) { + case QClipboard::Selection: + modeAtom = XA_PRIMARY; + break; + + case QClipboard::Clipboard: + modeAtom = QTestLiteStatic::atom(QTestLiteStatic::CLIPBOARD); + break; + + default: + qWarning("QTestLiteMime: Internal error: Unsupported clipboard mode"); + break; + } + } + +protected: + QStringList formats_sys() const + { + if (empty()) + return QStringList(); + + if (!formatList.count()) { + QTestLiteClipboardMime *that = const_cast<QTestLiteClipboardMime *>(this); + // get the list of targets from the current clipboard owner - we do this + // once so that multiple calls to this function don't require multiple + // server round trips... + that->format_atoms = m_clipboard->getDataInFormat(modeAtom,QTestLiteStatic::atom(QTestLiteStatic::TARGETS)); + + if (format_atoms.size() > 0) { + Atom *targets = (Atom *) format_atoms.data(); + int size = format_atoms.size() / sizeof(Atom); + + for (int i = 0; i < size; ++i) { + if (targets[i] == 0) + continue; + + QStringList formatsForAtom = mimeFormatsForAtom(m_clipboard->screen()->display(),targets[i]); + for (int j = 0; j < formatsForAtom.size(); ++j) { + if (!formatList.contains(formatsForAtom.at(j))) + that->formatList.append(formatsForAtom.at(j)); + } + } + } + } + + return formatList; + } + + bool hasFormat_sys(const QString &format) const + { + QStringList list = formats(); + return list.contains(format); + } + + QVariant retrieveData_sys(const QString &fmt, QVariant::Type requestedType) const + { + if (fmt.isEmpty() || empty()) + return QByteArray(); + + (void)formats(); // trigger update of format list + + QList<Atom> atoms; + Atom *targets = (Atom *) format_atoms.data(); + int size = format_atoms.size() / sizeof(Atom); + for (int i = 0; i < size; ++i) + atoms.append(targets[i]); + + QByteArray encoding; + Atom fmtatom = mimeAtomForFormat(m_clipboard->screen()->display(),fmt, requestedType, atoms, &encoding); + + if (fmtatom == 0) + return QVariant(); + + return mimeConvertToFormat(m_clipboard->screen()->display(),fmtatom, m_clipboard->getDataInFormat(modeAtom,fmtatom), fmt, requestedType, encoding); + } +private: + bool empty() const + { + Window win = XGetSelectionOwner(m_clipboard->screen()->display(), modeAtom); + + return win == XNone; + } + + + Atom modeAtom; + QTestLiteClipboard *m_clipboard; + QStringList formatList; + QByteArray format_atoms; +}; + const int QTestLiteClipboard::clipboard_timeout = 5000; QTestLiteClipboard::QTestLiteClipboard(QTestLiteScreen *screen) @@ -26,7 +124,7 @@ const QMimeData * QTestLiteClipboard::mimeData(QClipboard::Mode mode) const if (mode == QClipboard::Clipboard) { if (!m_xClipboard) { QTestLiteClipboard *that = const_cast<QTestLiteClipboard *>(this); - that->m_xClipboard = new QTestLiteMime(mode,that); + that->m_xClipboard = new QTestLiteClipboardMime(mode,that); } Window clipboardOwner = XGetSelectionOwner(screen()->display(),QTestLiteStatic::atom(QTestLiteStatic::CLIPBOARD)); if (clipboardOwner == owner()) { @@ -34,6 +132,17 @@ const QMimeData * QTestLiteClipboard::mimeData(QClipboard::Mode mode) const } else { return m_xClipboard; } + } else if (mode == QClipboard::Selection) { + if (!m_xSelection) { + QTestLiteClipboard *that = const_cast<QTestLiteClipboard *>(this); + that->m_xSelection = new QTestLiteClipboardMime(mode,that); + } + Window clipboardOwner = XGetSelectionOwner(screen()->display(),XA_PRIMARY); + if (clipboardOwner == owner()) { + return m_clientSelection; + } else { + return m_xSelection; + } } return 0; } @@ -71,14 +180,19 @@ void QTestLiteClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode) XSetSelectionOwner(m_screen->display(), modeAtom, newOwner, CurrentTime); if (XGetSelectionOwner(m_screen->display(), modeAtom) != newOwner) { -// qWarning("QClipboard::setData: Cannot set X11 selection owner for %s", -// xdndAtomToString(atom).data()); - *d = 0; - return; + qWarning("QClipboard::setData: Cannot set X11 selection owner"); } } +bool QTestLiteClipboard::supportsMode(QClipboard::Mode mode) const +{ + if (mode == QClipboard::Clipboard || mode == QClipboard::Selection) + return true; + return false; +} + + QTestLiteScreen * QTestLiteClipboard::screen() const { return m_screen; @@ -153,14 +267,14 @@ Atom QTestLiteClipboard::sendSelection(QMimeData *d, Atom target, Window window, int dataFormat = 0; QByteArray data; - QString fmt = QTestLiteMime::xdndMimeAtomToString(screen()->display(), target); + QString fmt = QTestLiteMime::mimeAtomToString(screen()->display(), target); if (fmt.isEmpty()) { // Not a MIME type we have qDebug() << "QClipboard: send_selection(): converting to type '%s' is not supported" << fmt.data(); return XNone; } qDebug() << "QClipboard: send_selection(): converting to type '%s'" << fmt.data(); - if (QTestLiteMime::xdndMimeDataForAtom(screen()->display(),target, d, &data, &atomFormat, &dataFormat)) { + if (QTestLiteMime::mimeDataForAtom(screen()->display(),target, d, &data, &atomFormat, &dataFormat)) { // don't allow INCR transfers when using MULTIPLE or to // Motif clients (since Motif doesn't support INCR) @@ -517,3 +631,5 @@ QByteArray QTestLiteClipboard::getDataInFormat(Atom modeAtom, Atom fmtatom) return buf; } + +#include "qtestliteclipboard.moc" diff --git a/src/plugins/platforms/testlite/qtestliteclipboard.h b/src/plugins/platforms/testlite/qtestliteclipboard.h index 31e42b7..22d3734 100644 --- a/src/plugins/platforms/testlite/qtestliteclipboard.h +++ b/src/plugins/platforms/testlite/qtestliteclipboard.h @@ -5,7 +5,6 @@ #include "qtestlitestaticinfo.h" class QTestLiteScreen; -class QTestLiteMime; class QTestLiteClipboard : public QPlatformClipboard { public: @@ -14,6 +13,8 @@ public: const QMimeData *mimeData(QClipboard::Mode mode) const; void setMimeData(QMimeData *data, QClipboard::Mode mode); + bool supportsMode(QClipboard::Mode mode) const; + QTestLiteScreen *screen() const; Window requestor() const; @@ -36,10 +37,10 @@ private: QTestLiteScreen *m_screen; - QTestLiteMime *m_xClipboard; + QMimeData *m_xClipboard; QMimeData *m_clientClipboard; - QTestLiteMime *m_xSelection; + QMimeData *m_xSelection; QMimeData *m_clientSelection; Window m_requestor; diff --git a/src/plugins/platforms/testlite/qtestlitemime.cpp b/src/plugins/platforms/testlite/qtestlitemime.cpp index 6a08b8c..32cacce 100644 --- a/src/plugins/platforms/testlite/qtestlitemime.cpp +++ b/src/plugins/platforms/testlite/qtestlitemime.cpp @@ -4,98 +4,21 @@ #include "qtestlitescreen.h" #include <QtCore/QTextCodec> +#include <QtGui/QImageWriter> +#include <QtCore/QBuffer> -QTestLiteMime::QTestLiteMime(QClipboard::Mode mode, QTestLiteClipboard *clipboard) - : QInternalMimeData(), m_clipboard(clipboard) -{ - switch (mode) { - case QClipboard::Selection: - modeAtom = XA_PRIMARY; - break; - - case QClipboard::Clipboard: - modeAtom = QTestLiteStaticInfo::atom(QTestLiteStaticInfo::CLIPBOARD); - break; - - default: - qWarning("QTestLiteMime: Internal error: Unsupported clipboard mode"); - break; - } -} +QTestLiteMime::QTestLiteMime() + : QInternalMimeData() +{ } QTestLiteMime::~QTestLiteMime() -{ -} +{} -bool QTestLiteMime::empty() const -{ - Window win = XGetSelectionOwner(m_clipboard->screen()->display(), modeAtom); - - return win == XNone; -} -QStringList QTestLiteMime::formats_sys() const -{ - if (empty()) - return QStringList(); - if (!formatList.count()) { - // get the list of targets from the current clipboard owner - we do this - // once so that multiple calls to this function don't require multiple - // server round trips... - format_atoms = m_clipboard->getDataInFormat(modeAtom,QTestLiteStaticInfo::atom(QTestLiteStaticInfo::TARGETS)); - if (format_atoms.size() > 0) { - Atom *targets = (Atom *) format_atoms.data(); - int size = format_atoms.size() / sizeof(Atom); - - for (int i = 0; i < size; ++i) { - if (targets[i] == 0) - continue; - - QStringList formatsForAtom = xdndMimeFormatsForAtom(m_clipboard->screen()->display(),targets[i]); - for (int j = 0; j < formatsForAtom.size(); ++j) { - if (!formatList.contains(formatsForAtom.at(j))) - formatList.append(formatsForAtom.at(j)); - } - } - } - } - - return formatList; -} - -bool QTestLiteMime::hasFormat_sys(const QString &format) const -{ - QStringList list = formats(); - return list.contains(format); -} - -QVariant QTestLiteMime::retrieveData_sys(const QString &fmt, QVariant::Type requestedType) const -{ - if (fmt.isEmpty() || empty()) - return QByteArray(); - - (void)formats(); // trigger update of format list - - QList<Atom> atoms; - Atom *targets = (Atom *) format_atoms.data(); - int size = format_atoms.size() / sizeof(Atom); - for (int i = 0; i < size; ++i) - atoms.append(targets[i]); - - QByteArray encoding; - Atom fmtatom = xdndMimeAtomForFormat(m_clipboard->screen()->display(),fmt, requestedType, atoms, &encoding); - - if (fmtatom == 0) - return QVariant(); - - return xdndMimeConvertToFormat(m_clipboard->screen()->display(),fmtatom, m_clipboard->getDataInFormat(modeAtom,fmtatom), fmt, requestedType, encoding); -} - - -QString QTestLiteMime::xdndMimeAtomToString(Display *display, Atom a) +QString QTestLiteMime::mimeAtomToString(Display *display, Atom a) { if (!a) return 0; @@ -108,18 +31,18 @@ QString QTestLiteMime::xdndMimeAtomToString(Display *display, Atom a) return result; } -Atom QTestLiteMime::xdndMimeStringToAtom(Display *display, const QString &mimeType) +Atom QTestLiteMime::mimeStringToAtom(Display *display, const QString &mimeType) { if (mimeType.isEmpty()) return 0; return XInternAtom(display, mimeType.toLatin1().constData(), False); } -QStringList QTestLiteMime::xdndMimeFormatsForAtom(Display *display, Atom a) +QStringList QTestLiteMime::mimeFormatsForAtom(Display *display, Atom a) { QStringList formats; if (a) { - QString atomName = xdndMimeAtomToString(display, a); + QString atomName = mimeAtomToString(display, a); formats.append(atomName); // special cases for string type @@ -140,12 +63,12 @@ QStringList QTestLiteMime::xdndMimeFormatsForAtom(Display *display, Atom a) return formats; } -bool QTestLiteMime::xdndMimeDataForAtom(Display *display, Atom a, QMimeData *mimeData, QByteArray *data, Atom *atomFormat, int *dataFormat) +bool QTestLiteMime::mimeDataForAtom(Display *display, Atom a, QMimeData *mimeData, QByteArray *data, Atom *atomFormat, int *dataFormat) { bool ret = false; *atomFormat = a; *dataFormat = 8; - QString atomName = xdndMimeAtomToString(display, a); + QString atomName = mimeAtomToString(display, a); if (QInternalMimeData::hasFormatHelper(atomName, mimeData)) { *data = QInternalMimeData::renderDataHelper(atomName, mimeData); if (atomName == QLatin1String("application/x-color")) @@ -195,30 +118,16 @@ bool QTestLiteMime::xdndMimeDataForAtom(Display *display, Atom a, QMimeData *mim *data = QByteArray(reinterpret_cast<const char *>(mozUri.utf16()), mozUri.length() * 2); ret = true; } else if ((a == XA_PIXMAP || a == XA_BITMAP) && mimeData->hasImage()) { - QPixmap pm = qvariant_cast<QPixmap>(mimeData->imageData()); - if (a == XA_BITMAP && pm.depth() != 1) { - QImage img = pm.toImage(); - img = img.convertToFormat(QImage::Format_MonoLSB); - pm = QPixmap::fromImage(img); - } -// QDragManager *dm = QDragManager::self(); -// if (dm) { -// Pixmap handle = pm.handle(); -// *data = QByteArray((const char *) &handle, sizeof(Pixmap)); -// dm->xdndMimeTransferedPixmap[dm->xdndMimeTransferedPixmapIndex] = pm; -// dm->xdndMimeTransferedPixmapIndex = -// (dm->xdndMimeTransferedPixmapIndex + 1) % 2; -// ret = true; -// } + ret = true; } } return ret && data != 0; } -QList<Atom> QTestLiteMime::xdndMimeAtomsForFormat(Display *display, const QString &format) +QList<Atom> QTestLiteMime::mimeAtomsForFormat(Display *display, const QString &format) { QList<Atom> atoms; - atoms.append(xdndMimeStringToAtom(display, format)); + atoms.append(mimeStringToAtom(display, format)); // special cases for strings if (format == QLatin1String("text/plain")) { @@ -230,7 +139,7 @@ QList<Atom> QTestLiteMime::xdndMimeAtomsForFormat(Display *display, const QStrin // special cases for uris if (format == QLatin1String("text/uri-list")) { - atoms.append(xdndMimeStringToAtom(display,QLatin1String("text/x-moz-url"))); + atoms.append(mimeStringToAtom(display,QLatin1String("text/x-moz-url"))); } //special cases for images @@ -242,9 +151,9 @@ QList<Atom> QTestLiteMime::xdndMimeAtomsForFormat(Display *display, const QStrin return atoms; } -QVariant QTestLiteMime::xdndMimeConvertToFormat(Display *display, Atom a, const QByteArray &data, const QString &format, QVariant::Type requestedType, const QByteArray &encoding) +QVariant QTestLiteMime::mimeConvertToFormat(Display *display, Atom a, const QByteArray &data, const QString &format, QVariant::Type requestedType, const QByteArray &encoding) { - QString atomName = xdndMimeAtomToString(display,a); + QString atomName = mimeAtomToString(display,a); if (atomName == format) return data; @@ -288,25 +197,35 @@ QVariant QTestLiteMime::xdndMimeConvertToFormat(Display *display, Atom a, const // special cas for images if (format == QLatin1String("image/ppm")) { if (a == XA_PIXMAP && data.size() == sizeof(Pixmap)) { -// Pixmap xpm = *((Pixmap*)data.data()); -// if (!xpm) -// return QByteArray(); -// QPixmap qpm = QPixmap::fromX11Pixmap(xpm); -// QImageWriter imageWriter; -// imageWriter.setFormat("PPMRAW"); -// QImage imageToWrite = qpm.toImage(); -// QBuffer buf; -// buf.open(QIODevice::WriteOnly); -// imageWriter.setDevice(&buf); -// imageWriter.write(imageToWrite); -// return buf.buffer(); - return QVariant(); + Pixmap xpm = *((Pixmap*)data.data()); + if (!xpm) + return QByteArray(); + Window root; + int x; + int y; + uint width; + uint height; + uint border_width; + uint depth; + + XGetGeometry(display, xpm, &root, &x, &y, &width, &height, &border_width, &depth); + XImage *ximg = XGetImage(display,xpm,x,y,width,height,AllPlanes,depth==1 ? XYPixmap : ZPixmap); + QImage qimg = QTestLiteStatic::qimageFromXImage(ximg); + XDestroyImage(ximg); + + QImageWriter imageWriter; + imageWriter.setFormat("PPMRAW"); + QBuffer buf; + buf.open(QIODevice::WriteOnly); + imageWriter.setDevice(&buf); + imageWriter.write(qimg); + return buf.buffer(); } } return QVariant(); } -Atom QTestLiteMime::xdndMimeAtomForFormat(Display *display, const QString &format, QVariant::Type requestedType, const QList<Atom> &atoms, QByteArray *requestedEncoding) +Atom QTestLiteMime::mimeAtomForFormat(Display *display, const QString &format, QVariant::Type requestedType, const QList<Atom> &atoms, QByteArray *requestedEncoding) { requestedEncoding->clear(); @@ -324,10 +243,10 @@ Atom QTestLiteMime::xdndMimeAtomForFormat(Display *display, const QString &forma // find matches for uri types if (format == QLatin1String("text/uri-list")) { - Atom a = xdndMimeStringToAtom(display,format); + Atom a = mimeStringToAtom(display,format); if (a && atoms.contains(a)) return a; - a = xdndMimeStringToAtom(display,QLatin1String("text/x-moz-url")); + a = mimeStringToAtom(display,QLatin1String("text/x-moz-url")); if (a && atoms.contains(a)) return a; } @@ -347,14 +266,14 @@ Atom QTestLiteMime::xdndMimeAtomForFormat(Display *display, const QString &forma QString formatWithCharset = format; formatWithCharset.append(QLatin1String(";charset=utf-8")); - Atom a = xdndMimeStringToAtom(display,formatWithCharset); + Atom a = mimeStringToAtom(display,formatWithCharset); if (a && atoms.contains(a)) { *requestedEncoding = "utf-8"; return a; } } - Atom a = xdndMimeStringToAtom(display,format); + Atom a = mimeStringToAtom(display,format); if (a && atoms.contains(a)) return a; diff --git a/src/plugins/platforms/testlite/qtestlitemime.h b/src/plugins/platforms/testlite/qtestlitemime.h index e5ed7b0..449bbf3 100644 --- a/src/plugins/platforms/testlite/qtestlitemime.h +++ b/src/plugins/platforms/testlite/qtestlitemime.h @@ -11,32 +11,16 @@ class QTestLiteMime : public QInternalMimeData { Q_OBJECT public: - QTestLiteMime(QClipboard::Mode mode, QTestLiteClipboard *clipboard); + QTestLiteMime(); ~QTestLiteMime(); - bool empty() const; - static QList<Atom> xdndMimeAtomsForFormat(Display *display, const QString &format); - static QString xdndMimeAtomToString(Display *display, Atom a); - static bool xdndMimeDataForAtom(Display *display, Atom a, QMimeData *mimeData, QByteArray *data, Atom *atomFormat, int *dataFormat); - static QStringList xdndMimeFormatsForAtom(Display *display, Atom a); - static Atom xdndMimeStringToAtom(Display *display, const QString &mimeType); - - static QVariant xdndMimeConvertToFormat(Display *display, Atom a, const QByteArray &data, const QString &format, QVariant::Type requestedType, const QByteArray &encoding); - static Atom xdndMimeAtomForFormat(Display *display, const QString &format, QVariant::Type requestedType, const QList<Atom> &atoms, QByteArray *requestedEncoding); - - -protected: - virtual bool hasFormat_sys(const QString &mimetype) const; - virtual QStringList formats_sys() const; - - QVariant retrieveData_sys(const QString &mimetype, QVariant::Type type) const; - - -private: - QTestLiteClipboard *m_clipboard; - Atom modeAtom; - mutable QStringList formatList; - mutable QByteArray format_atoms; + static QList<Atom> mimeAtomsForFormat(Display *display, const QString &format); + static QString mimeAtomToString(Display *display, Atom a); + static bool mimeDataForAtom(Display *display, Atom a, QMimeData *mimeData, QByteArray *data, Atom *atomFormat, int *dataFormat); + static QStringList mimeFormatsForAtom(Display *display, Atom a); + static Atom mimeStringToAtom(Display *display, const QString &mimeType); + static QVariant mimeConvertToFormat(Display *display, Atom a, const QByteArray &data, const QString &format, QVariant::Type requestedType, const QByteArray &encoding); + static Atom mimeAtomForFormat(Display *display, const QString &format, QVariant::Type requestedType, const QList<Atom> &atoms, QByteArray *requestedEncoding); }; #endif // QTESTLITEMIME_H -- cgit v0.12 From 06568ff89c48dee8aab278b8b0538c331aa84595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Mon, 6 Dec 2010 16:05:55 +0100 Subject: Add styleHint to fallback api for fontdatabases in Lighthouse --- src/gui/text/qfont_qpa.cpp | 2 +- src/gui/text/qfontdatabase_qpa.cpp | 12 ++++++---- src/gui/text/qplatformfontdatabase_qpa.cpp | 3 ++- src/gui/text/qplatformfontdatabase_qpa.h | 2 +- .../fontconfig/qfontconfigdatabase.cpp | 27 +++++++++++++++++++++- .../fontdatabases/fontconfig/qfontconfigdatabase.h | 2 +- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/gui/text/qfont_qpa.cpp b/src/gui/text/qfont_qpa.cpp index 5fed18b..7b09b59 100644 --- a/src/gui/text/qfont_qpa.cpp +++ b/src/gui/text/qfont_qpa.cpp @@ -90,7 +90,7 @@ QString QFont::defaultFamily() const familyName = QString::fromLatin1("helvetica"); } - QStringList list = QApplicationPrivate::platformIntegration()->fontDatabase()->fallbacksForFamily(familyName,QFont::StyleNormal,QUnicodeTables::Common); + QStringList list = QApplicationPrivate::platformIntegration()->fontDatabase()->fallbacksForFamily(familyName,QFont::StyleNormal,QFont::StyleHint(d->request.styleHint),QUnicodeTables::Common); if (list.size()) { familyName = list.at(0); } diff --git a/src/gui/text/qfontdatabase_qpa.cpp b/src/gui/text/qfontdatabase_qpa.cpp index e54093c..e6d99c6 100644 --- a/src/gui/text/qfontdatabase_qpa.cpp +++ b/src/gui/text/qfontdatabase_qpa.cpp @@ -80,9 +80,9 @@ Q_GUI_EXPORT void qt_registerFont(const QString &familyName, const QString &fou size->handle = handle; } -static QStringList fallbackFamilies(const QString &family, const QFont::Style &style, const QUnicodeTables::Script &script) +static QStringList fallbackFamilies(const QString &family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) { - QStringList retList = QApplicationPrivate::platformIntegration()->fontDatabase()->fallbacksForFamily(family,style,script); + QStringList retList = QApplicationPrivate::platformIntegration()->fontDatabase()->fallbacksForFamily(family,style,styleHint,script); QFontDatabasePrivate *db = privateDb(); QStringList::iterator i; @@ -177,7 +177,11 @@ QFontEngine *loadEngine(int script, const QFontDef &request, && !(request.styleStrategy & QFont::NoFontMerging) && !engine->symbol ) { if (family && !family->askedForFallback) { - family->fallbackFamilies = fallbackFamilies(family->name,QFont::Style(style->key.style),QUnicodeTables::Script(script)); + QFont::Style fontStyle = QFont::Style(style->key.style); + QFont::StyleHint styleHint = QFont::StyleHint(request.styleHint); + if (styleHint == QFont::AnyStyle && request.fixedPitch) + styleHint = QFont::TypeWriter; + family->fallbackFamilies = fallbackFamilies(family->name,fontStyle,styleHint,QUnicodeTables::Script(script)); family->askedForFallback = true; } @@ -287,7 +291,7 @@ QFontDatabase::findFont(int script, const QFontPrivate *fp, if (!engine) { if (!request.family.isEmpty()) { - QStringList fallbacks = fallbackFamilies(request.family,QFont::Style(request.style),QUnicodeTables::Script(script)); + QStringList fallbacks = fallbackFamilies(request.family,QFont::Style(request.style),QFont::StyleHint(request.styleHint),QUnicodeTables::Script(script)); for (int i = 0; i < fallbacks.size(); i++) { QFontDef def = request; def.family = fallbacks.at(i); diff --git a/src/gui/text/qplatformfontdatabase_qpa.cpp b/src/gui/text/qplatformfontdatabase_qpa.cpp index d6dff41..afe762a 100644 --- a/src/gui/text/qplatformfontdatabase_qpa.cpp +++ b/src/gui/text/qplatformfontdatabase_qpa.cpp @@ -221,10 +221,11 @@ QFontEngine *QPlatformFontDatabase::fontEngine(const QFontDef &fontDef, QUnicode /*! */ -QStringList QPlatformFontDatabase::fallbacksForFamily(const QString family, const QFont::Style &style, const QUnicodeTables::Script &script) const +QStringList QPlatformFontDatabase::fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const { Q_UNUSED(family); Q_UNUSED(style); + Q_UNUSED(styleHint); Q_UNUSED(script); return QStringList(); } diff --git a/src/gui/text/qplatformfontdatabase_qpa.h b/src/gui/text/qplatformfontdatabase_qpa.h index aa465ab..a1faea9 100644 --- a/src/gui/text/qplatformfontdatabase_qpa.h +++ b/src/gui/text/qplatformfontdatabase_qpa.h @@ -88,7 +88,7 @@ class Q_GUI_EXPORT QPlatformFontDatabase public: virtual void populateFontDatabase(); virtual QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle); - virtual QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QUnicodeTables::Script &script) const; + virtual QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const; virtual QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName); virtual void releaseHandle(void *handle); diff --git a/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 92f30fc..9b9be07 100644 --- a/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -274,6 +274,25 @@ static const char *openType[] = { "nko " // N'Ko }; +static const char *getFcFamilyForStyleHint(const QFont::StyleHint style) +{ + const char *stylehint = 0; + switch (style) { + case QFont::SansSerif: + stylehint = "sans-serif"; + break; + case QFont::Serif: + stylehint = "serif"; + break; + case QFont::TypeWriter: + stylehint = "monospace"; + break; + default: + break; + } + return stylehint; +} + void QFontconfigDatabase::populateFontDatabase() { FcFontSet *fonts; @@ -522,7 +541,7 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, QUnicodeTables:: return engine; } -QStringList QFontconfigDatabase::fallbacksForFamily(const QString family, const QFont::Style &style, const QUnicodeTables::Script &script) const +QStringList QFontconfigDatabase::fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const { QStringList fallbackFamilies; FcPattern *pattern = FcPatternCreate(); @@ -550,6 +569,12 @@ QStringList QFontconfigDatabase::fallbacksForFamily(const QString family, const FcLangSetDestroy(ls); } + const char *stylehint = getFcFamilyForStyleHint(styleHint); + if (stylehint) { + value.u.s = (const FcChar8 *)stylehint; + FcPatternAddWeak(pattern, FC_FAMILY, value, FcTrue); + } + FcConfigSubstitute(0, pattern, FcMatchPattern); FcConfigSubstitute(0, pattern, FcMatchFont); diff --git a/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h b/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h index 33382dc..cf62b88 100644 --- a/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h +++ b/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h @@ -50,7 +50,7 @@ class QFontconfigDatabase : public QBasicUnixFontDatabase public: void populateFontDatabase(); QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle); - QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QUnicodeTables::Script &script) const; + QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const; }; #endif // QFONTCONFIGDATABASE_H -- cgit v0.12 From bc1e4e5bc898519c073b710f64c7a7da54062099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@nokia.com> Date: Wed, 5 Jan 2011 12:36:58 +0100 Subject: Compile on OS X. --- mkspecs/common/mac/qplatformdefs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/common/mac/qplatformdefs.h b/mkspecs/common/mac/qplatformdefs.h index 99d64ef..5d1f99a 100644 --- a/mkspecs/common/mac/qplatformdefs.h +++ b/mkspecs/common/mac/qplatformdefs.h @@ -75,7 +75,7 @@ #include <net/if.h> #endif -#include "../common/posix/qplatformdefs.h" +#include "../posix/qplatformdefs.h" #undef QT_OPEN_LARGEFILE #undef QT_SOCKLEN_T -- cgit v0.12 From 4c15dbb1eddb7bb3f3b72508be865feb97679d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@nokia.com> Date: Wed, 5 Jan 2011 14:02:58 +0100 Subject: Build on Mac OS X. --- src/plugins/platforms/testlite/testlite.pro | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/platforms/testlite/testlite.pro b/src/plugins/platforms/testlite/testlite.pro index 9f8075c..eb196c3 100644 --- a/src/plugins/platforms/testlite/testlite.pro +++ b/src/plugins/platforms/testlite/testlite.pro @@ -28,6 +28,10 @@ HEADERS = \ LIBS += -lX11 -lXext +mac { + LIBS += -L/usr/X11/lib -lz -framework Carbon +} + include (../fontdatabases/genericunix/genericunix.pri) contains(QT_CONFIG, opengl) { -- cgit v0.12 From 1462a7ba51d25a7d022eab5533885cb1ed1c4c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Wed, 5 Jan 2011 09:04:37 +0100 Subject: Lighthouse: Make testlite compile on systems where QtOpenGL is ES2 compatible. Ie. it does not have glx. Haven't made the egl integration yet for testlite --- src/plugins/platforms/testlite/qglxintegration.cpp | 3 +++ src/plugins/platforms/testlite/qglxintegration.h | 3 +++ src/plugins/platforms/testlite/qtestliteintegration.cpp | 6 ++++-- src/plugins/platforms/testlite/qtestlitewindow.cpp | 8 ++++---- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/plugins/platforms/testlite/qglxintegration.cpp b/src/plugins/platforms/testlite/qglxintegration.cpp index 1dffb3e..8023014 100644 --- a/src/plugins/platforms/testlite/qglxintegration.cpp +++ b/src/plugins/platforms/testlite/qglxintegration.cpp @@ -46,6 +46,7 @@ #include "qtestlitewindow.h" #include "qtestlitescreen.h" +#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) #include <X11/Xlib.h> #include <X11/Xutil.h> #include <GL/glx.h> @@ -371,3 +372,5 @@ QPlatformWindowFormat QGLXContext::platformWindowFormat() const } QT_END_NAMESPACE + +#endif //!defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) diff --git a/src/plugins/platforms/testlite/qglxintegration.h b/src/plugins/platforms/testlite/qglxintegration.h index 5ae0b2a..abece45 100644 --- a/src/plugins/platforms/testlite/qglxintegration.h +++ b/src/plugins/platforms/testlite/qglxintegration.h @@ -49,6 +49,7 @@ #include <QtCore/QMutex> +#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) #include <GL/glx.h> QT_BEGIN_NAMESPACE @@ -88,4 +89,6 @@ private: QT_END_NAMESPACE +#endif //!defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) + #endif diff --git a/src/plugins/platforms/testlite/qtestliteintegration.cpp b/src/plugins/platforms/testlite/qtestliteintegration.cpp index 537e22a..5dbe1e7 100644 --- a/src/plugins/platforms/testlite/qtestliteintegration.cpp +++ b/src/plugins/platforms/testlite/qtestliteintegration.cpp @@ -49,8 +49,10 @@ #include "qtestlitescreen.h" #include "qtestliteclipboard.h" -#ifndef QT_NO_OPENGL +#if !defined(QT_NO_OPENGL) +#if !defined(QT_OPENGL_ES_2) #include <GL/glx.h> +#endif //!defined(QT_OPENGL_ES_2) #include <private/qwindowsurface_gl_p.h> #include <private/qpixmapdata_gl_p.h> #endif //QT_NO_OPENGL @@ -128,7 +130,7 @@ QPlatformClipboard * QTestLiteIntegration::clipboard() const bool QTestLiteIntegration::hasOpenGL() const { -#ifndef QT_NO_OPENGL +#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) QTestLiteScreen *screen = static_cast<const QTestLiteScreen *>(mScreens.at(0)); return glXQueryExtension(screen->display(), 0, 0) != 0; #endif diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index e8d40d7..18fab4a 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -54,7 +54,7 @@ #include <QtGui/private/qwindowsurface_p.h> #include <QtGui/private/qapplication_p.h> -#ifndef QT_NO_OPENGL +#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) #include "qglxintegration.h" #endif @@ -74,7 +74,7 @@ QTestLiteWindow::QTestLiteWindow(QWidget *window) if(window->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL && QApplicationPrivate::platformIntegration()->hasOpenGL() ) { -#ifndef QT_NO_OPENGL +#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) XVisualInfo *visualInfo = QGLXContext::findVisualInfo(mScreen,window->platformWindowFormat()); Colormap cmap = XCreateColormap(mScreen->display(),mScreen->rootWindow(),visualInfo->visual,AllocNone); @@ -83,7 +83,7 @@ QTestLiteWindow::QTestLiteWindow(QWidget *window) x_window = XCreateWindow(mScreen->display(), mScreen->rootWindow(),x, y, w, h, 0, visualInfo->depth, InputOutput, visualInfo->visual, CWColormap, &a); -#endif //QT_NO_OPENGL +#endif //!defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) } else { x_window = XCreateSimpleWindow(mScreen->display(), mScreen->rootWindow(), x, y, w, h, 0 /*border_width*/, @@ -548,7 +548,7 @@ QPlatformGLContext *QTestLiteWindow::glContext() const return 0; if (!mGLContext) { QTestLiteWindow *that = const_cast<QTestLiteWindow *>(this); -#ifndef QT_NO_OPENGL +#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) that->mGLContext = new QGLXContext(x_window, mScreen,widget()->platformWindowFormat()); #endif } -- cgit v0.12 From cc8877068dc6ae8f3142ffec0b85f6fbac4a0d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Wed, 5 Jan 2011 17:14:54 +0100 Subject: Lighthouse: Adding support for EGL to testlite There is really no good way of detecting if to use EGL instead of GLX using qmake. So this is the behavior for now: if QtOpenGL is compiled with "desktop gl" then use GLX if its compiled with OpenGLES2 then use EGL. --- .../platforms/eglconvenience/qeglconvenience.cpp | 8 ++ .../platforms/eglconvenience/qeglconvenience.h | 1 + .../platforms/testlite/qtestliteeglintegration.cpp | 145 +++++++++++++++++++++ .../platforms/testlite/qtestliteeglintegration.h | 13 ++ .../platforms/testlite/qtestliteintegration.cpp | 19 ++- src/plugins/platforms/testlite/qtestlitewindow.cpp | 94 ++++++++++--- src/plugins/platforms/testlite/qtestlitewindow.h | 2 + src/plugins/platforms/testlite/testlite.pro | 37 ++++-- 8 files changed, 287 insertions(+), 32 deletions(-) create mode 100644 src/plugins/platforms/testlite/qtestliteeglintegration.cpp create mode 100644 src/plugins/platforms/testlite/qtestliteeglintegration.h diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.cpp b/src/plugins/platforms/eglconvenience/qeglconvenience.cpp index b203fe8..1612f79 100644 --- a/src/plugins/platforms/eglconvenience/qeglconvenience.cpp +++ b/src/plugins/platforms/eglconvenience/qeglconvenience.cpp @@ -313,4 +313,12 @@ QPlatformWindowFormat qt_qPlatformWindowFormatFromConfig(EGLDisplay display, con return format; } +bool q_hasEglExtension(EGLDisplay display, const char* extensionName) +{ + QList<QByteArray> extensions = + QByteArray(reinterpret_cast<const char *> + (eglQueryString(display, EGL_EXTENSIONS))).split(' '); + return extensions.contains(extensionName); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.h b/src/plugins/platforms/eglconvenience/qeglconvenience.h index 604262b..98c30b8 100644 --- a/src/plugins/platforms/eglconvenience/qeglconvenience.h +++ b/src/plugins/platforms/eglconvenience/qeglconvenience.h @@ -53,6 +53,7 @@ QVector<EGLint> q_createConfigAttributesFromFormat(const QPlatformWindowFormat & bool q_reduceConfigAttributes(QVector<EGLint> *configAttributes); EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformWindowFormat &format); QPlatformWindowFormat qt_qPlatformWindowFormatFromConfig(EGLDisplay display, const EGLConfig config); +bool q_hasEglExtension(EGLDisplay display,const char* extensionName); QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestliteeglintegration.cpp b/src/plugins/platforms/testlite/qtestliteeglintegration.cpp new file mode 100644 index 0000000..3cbcc05 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestliteeglintegration.cpp @@ -0,0 +1,145 @@ +#include "qtestliteeglintegration.h" + +static int countBits(unsigned long mask) +{ + int count = 0; + while (mask != 0) { + if (mask & 1) + ++count; + mask >>= 1; + } + return count; +} + +VisualID QTestLiteEglIntegration::getCompatibleVisualId(Display *display, EGLConfig config) +{ + VisualID visualId = 0; + EGLint eglValue = 0; + + EGLDisplay eglDisplay = eglGetDisplay(display); + + EGLint configRedSize = 0; + eglGetConfigAttrib(eglDisplay, config, EGL_RED_SIZE, &configRedSize); + + EGLint configGreenSize = 0; + eglGetConfigAttrib(eglDisplay, config, EGL_GREEN_SIZE, &configGreenSize); + + EGLint configBlueSize = 0; + eglGetConfigAttrib(eglDisplay, config, EGL_BLUE_SIZE, &configBlueSize); + + EGLint configAlphaSize = 0; + eglGetConfigAttrib(eglDisplay, config, EGL_ALPHA_SIZE, &configAlphaSize); + + eglGetConfigAttrib(eglDisplay, config, EGL_CONFIG_ID, &eglValue); + int configId = eglValue; + + // See if EGL provided a valid VisualID: + eglGetConfigAttrib(eglDisplay, config, EGL_NATIVE_VISUAL_ID, &eglValue); + visualId = (VisualID)eglValue; + if (visualId) { + // EGL has suggested a visual id, so get the rest of the visual info for that id: + XVisualInfo visualInfoTemplate; + memset(&visualInfoTemplate, 0, sizeof(XVisualInfo)); + visualInfoTemplate.visualid = visualId; + + XVisualInfo *chosenVisualInfo; + int matchingCount = 0; + chosenVisualInfo = XGetVisualInfo(display, VisualIDMask, &visualInfoTemplate, &matchingCount); + if (chosenVisualInfo) { + // Skip size checks if implementation supports non-matching visual + // and config (http://bugreports.qt.nokia.com/browse/QTBUG-9444). + if (q_hasEglExtension(eglDisplay,"EGL_NV_post_convert_rounding")) { + XFree(chosenVisualInfo); + return visualId; + } + + int visualRedSize = countBits(chosenVisualInfo->red_mask); + int visualGreenSize = countBits(chosenVisualInfo->green_mask); + int visualBlueSize = countBits(chosenVisualInfo->blue_mask); + int visualAlphaSize = -1; // Need XRender to tell us the alpha channel size + + bool visualMatchesConfig = false; + if ( visualRedSize == configRedSize && + visualGreenSize == configGreenSize && + visualBlueSize == configBlueSize ) + { + // We need XRender to check the alpha channel size of the visual. If we don't have + // the alpha size, we don't check it against the EGL config's alpha size. + if (visualAlphaSize >= 0) + visualMatchesConfig = visualAlphaSize == configAlphaSize; + else + visualMatchesConfig = true; + } + + if (!visualMatchesConfig) { + if (visualAlphaSize >= 0) { + qWarning("Warning: EGL suggested using X Visual ID %d (ARGB%d%d%d%d) for EGL config %d (ARGB%d%d%d%d), but this is incompatable", + (int)visualId, visualAlphaSize, visualRedSize, visualGreenSize, visualBlueSize, + configId, configAlphaSize, configRedSize, configGreenSize, configBlueSize); + } else { + qWarning("Warning: EGL suggested using X Visual ID %d (RGB%d%d%d) for EGL config %d (RGB%d%d%d), but this is incompatable", + (int)visualId, visualRedSize, visualGreenSize, visualBlueSize, + configId, configRedSize, configGreenSize, configBlueSize); + } + visualId = 0; + } + } else { + qWarning("Warning: EGL suggested using X Visual ID %d for EGL config %d, but that isn't a valid ID", + (int)visualId, configId); + visualId = 0; + } + XFree(chosenVisualInfo); + } +#ifdef QT_DEBUG_X11_VISUAL_SELECTION + else + qDebug("EGL did not suggest a VisualID (EGL_NATIVE_VISUAL_ID was zero) for EGLConfig %d", configId); +#endif + + if (visualId) { +#ifdef QT_DEBUG_X11_VISUAL_SELECTION + if (configAlphaSize > 0) + qDebug("Using ARGB Visual ID %d provided by EGL for config %d", (int)visualId, configId); + else + qDebug("Using Opaque Visual ID %d provided by EGL for config %d", (int)visualId, configId); +#endif + return visualId; + } + + // Finally, try to + // use XGetVisualInfo and only use the bit depths to match on: + if (!visualId) { + XVisualInfo visualInfoTemplate; + memset(&visualInfoTemplate, 0, sizeof(XVisualInfo)); + XVisualInfo *matchingVisuals; + int matchingCount = 0; + + visualInfoTemplate.depth = configRedSize + configGreenSize + configBlueSize + configAlphaSize; + matchingVisuals = XGetVisualInfo(display, + VisualDepthMask, + &visualInfoTemplate, + &matchingCount); + if (!matchingVisuals) { + // Try again without taking the alpha channel into account: + visualInfoTemplate.depth = configRedSize + configGreenSize + configBlueSize; + matchingVisuals = XGetVisualInfo(display, + VisualDepthMask, + &visualInfoTemplate, + &matchingCount); + } + + if (matchingVisuals) { + visualId = matchingVisuals[0].visualid; + XFree(matchingVisuals); + } + } + + if (visualId) { +#ifdef QT_DEBUG_X11_VISUAL_SELECTION + qDebug("Using Visual ID %d provided by XGetVisualInfo for EGL config %d", (int)visualId, configId); +#endif + return visualId; + } + + qWarning("Unable to find an X11 visual which matches EGL config %d", configId); + return (VisualID)0; +} diff --git a/src/plugins/platforms/testlite/qtestliteeglintegration.h b/src/plugins/platforms/testlite/qtestliteeglintegration.h new file mode 100644 index 0000000..3717976 --- /dev/null +++ b/src/plugins/platforms/testlite/qtestliteeglintegration.h @@ -0,0 +1,13 @@ +#ifndef QTESTLITEEGLINTEGRATION_H +#define QTESTLITEEGLINTEGRATION_H + +#include "qtestlitestaticinfo.h" +#include "../eglconvenience/qeglconvenience.h" + +class QTestLiteEglIntegration +{ +public: + static VisualID getCompatibleVisualId(Display *display, EGLConfig config); +}; + +#endif // QTESTLITEEGLINTEGRATION_H diff --git a/src/plugins/platforms/testlite/qtestliteintegration.cpp b/src/plugins/platforms/testlite/qtestliteintegration.cpp index 5dbe1e7..9b641d1 100644 --- a/src/plugins/platforms/testlite/qtestliteintegration.cpp +++ b/src/plugins/platforms/testlite/qtestliteintegration.cpp @@ -52,6 +52,8 @@ #if !defined(QT_NO_OPENGL) #if !defined(QT_OPENGL_ES_2) #include <GL/glx.h> +#else +#include <EGL/egl.h> #endif //!defined(QT_OPENGL_ES_2) #include <private/qwindowsurface_gl_p.h> #include <private/qpixmapdata_gl_p.h> @@ -59,7 +61,6 @@ QT_BEGIN_NAMESPACE - QTestLiteIntegration::QTestLiteIntegration(bool useOpenGL) : mUseOpenGL(useOpenGL) , mFontDb(new QGenericUnixFontDatabase()) @@ -130,9 +131,23 @@ QPlatformClipboard * QTestLiteIntegration::clipboard() const bool QTestLiteIntegration::hasOpenGL() const { -#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) +#if !defined(QT_NO_OPENGL) +#if !defined(QT_OPENGL_ES_2) QTestLiteScreen *screen = static_cast<const QTestLiteScreen *>(mScreens.at(0)); return glXQueryExtension(screen->display(), 0, 0) != 0; +#else + static bool eglHasbeenInitialized = false; + static bool wasEglInitialized = false; + if (!eglHasbeenInitialized) { + eglHasbeenInitialized = true; + QTestLiteScreen *screen = static_cast<const QTestLiteScreen *>(mScreens.at(0)); + EGLint major, minor; + eglBindAPI(EGL_OPENGL_ES_API); + EGLDisplay disp = eglGetDisplay(screen->display()); + wasEglInitialized = eglInitialize(disp,&major,&minor); + } + return wasEglInitialized; +#endif #endif return false; } diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp index 18fab4a..d9c69e3 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.cpp +++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp @@ -54,9 +54,15 @@ #include <QtGui/private/qwindowsurface_p.h> #include <QtGui/private/qapplication_p.h> -#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) +#if !defined(QT_NO_OPENGL) +#if !defined(QT_OPENGL_ES_2) #include "qglxintegration.h" -#endif +#else +#include "../eglconvenience/qeglconvenience.h" +#include "../eglconvenience/qeglplatformcontext.h" +#include "qtestliteeglintegration.h" +#endif //QT_OPENGL_ES_2 +#endif //QT_NO_OPENGL //#define MYX11_DEBUG @@ -74,16 +80,36 @@ QTestLiteWindow::QTestLiteWindow(QWidget *window) if(window->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL && QApplicationPrivate::platformIntegration()->hasOpenGL() ) { -#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) + #if !defined(QT_NO_OPENGL) +#if !defined(QT_OPENGL_ES_2) XVisualInfo *visualInfo = QGLXContext::findVisualInfo(mScreen,window->platformWindowFormat()); - Colormap cmap = XCreateColormap(mScreen->display(),mScreen->rootWindow(),visualInfo->visual,AllocNone); - - XSetWindowAttributes a; - a.colormap = cmap; - x_window = XCreateWindow(mScreen->display(), mScreen->rootWindow(),x, y, w, h, - 0, visualInfo->depth, InputOutput, visualInfo->visual, - CWColormap, &a); -#endif //!defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) +#else + QPlatformWindowFormat windowFormat = correctColorBuffers(window->platformWindowFormat()); + + EGLDisplay eglDisplay = eglGetDisplay(mScreen->display()); + EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,windowFormat); + VisualID id = QTestLiteEglIntegration::getCompatibleVisualId(mScreen->display(),eglConfig); + + XVisualInfo visualInfoTemplate; + memset(&visualInfoTemplate, 0, sizeof(XVisualInfo)); + visualInfoTemplate.visualid = id; + + XVisualInfo *visualInfo; + int matchingCount = 0; + visualInfo = XGetVisualInfo(mScreen->display(), VisualIDMask, &visualInfoTemplate, &matchingCount); +#endif //!defined(QT_OPENGL_ES_2) + if (visualInfo) { + Colormap cmap = XCreateColormap(mScreen->display(),mScreen->rootWindow(),visualInfo->visual,AllocNone); + + XSetWindowAttributes a; + a.colormap = cmap; + x_window = XCreateWindow(mScreen->display(), mScreen->rootWindow(),x, y, w, h, + 0, visualInfo->depth, InputOutput, visualInfo->visual, + CWColormap, &a); + } else { + qFatal("no window!"); + } +#endif //!defined(QT_NO_OPENGL) } else { x_window = XCreateSimpleWindow(mScreen->display(), mScreen->rootWindow(), x, y, w, h, 0 /*border_width*/, @@ -93,12 +119,6 @@ QTestLiteWindow::QTestLiteWindow(QWidget *window) #ifdef MYX11_DEBUG qDebug() << "QTestLiteWindow::QTestLiteWindow creating" << hex << x_window << window; #endif -// } - -// width = -1; -// height = -1; -// xpos = -1; -// ypos = -1; XSetWindowBackgroundPixmap(mScreen->display(), x_window, XNone); @@ -548,8 +568,23 @@ QPlatformGLContext *QTestLiteWindow::glContext() const return 0; if (!mGLContext) { QTestLiteWindow *that = const_cast<QTestLiteWindow *>(this); -#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) +#if !defined(QT_NO_OPENGL) +#if !defined(QT_OPENGL_ES_2) that->mGLContext = new QGLXContext(x_window, mScreen,widget()->platformWindowFormat()); +#else + EGLDisplay display = eglGetDisplay(mScreen->display()); + + QPlatformWindowFormat windowFormat = correctColorBuffers(widget()->platformWindowFormat()); + + EGLConfig config = q_configFromQPlatformWindowFormat(display,windowFormat); + QVector<EGLint> eglContextAttrs; + eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION); + eglContextAttrs.append(2); + eglContextAttrs.append(EGL_NONE); + + EGLSurface eglSurface = eglCreateWindowSurface(display,config,(EGLNativeWindowType)x_window,0); + that->mGLContext = new QEGLPlatformContext(display, config, eglContextAttrs.data(), eglSurface, EGL_OPENGL_ES_API); +#endif #endif } return mGLContext; @@ -584,4 +619,27 @@ void QTestLiteWindow::doSizeHints() XSetWMNormalHints(mScreen->display(), x_window, &s); } +QPlatformWindowFormat QTestLiteWindow::correctColorBuffers(const QPlatformWindowFormat &platformWindowFormat) const +{ + // I have only tested this setup on a dodgy intel setup, where I didn't use standard libs, + // so this might be not what we want to do :) + if ( !(platformWindowFormat.redBufferSize() == -1 && + platformWindowFormat.greenBufferSize() == -1 && + platformWindowFormat.blueBufferSize() == -1)) + return platformWindowFormat; + + QPlatformWindowFormat windowFormat = platformWindowFormat; + if (mScreen->depth() == 16) { + windowFormat.setRedBufferSize(5); + windowFormat.setGreenBufferSize(6); + windowFormat.setBlueBufferSize(5); + } else { + windowFormat.setRedBufferSize(8); + windowFormat.setGreenBufferSize(8); + windowFormat.setBlueBufferSize(8); + } + + return windowFormat; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qtestlitewindow.h b/src/plugins/platforms/testlite/qtestlitewindow.h index 4b952dc..e45c3fd 100644 --- a/src/plugins/platforms/testlite/qtestlitewindow.h +++ b/src/plugins/platforms/testlite/qtestlitewindow.h @@ -129,6 +129,8 @@ protected: void doSizeHints(); private: + QPlatformWindowFormat correctColorBuffers(const QPlatformWindowFormat &windowFormat)const; + Window x_window; GC gc; diff --git a/src/plugins/platforms/testlite/testlite.pro b/src/plugins/platforms/testlite/testlite.pro index eb196c3..7fb3304 100644 --- a/src/plugins/platforms/testlite/testlite.pro +++ b/src/plugins/platforms/testlite/testlite.pro @@ -9,22 +9,22 @@ SOURCES = \ qtestlitewindowsurface.cpp \ qtestlitewindow.cpp \ qtestlitecursor.cpp \ - qtestlitescreen.cpp \ - qtestlitekeyboard.cpp \ - qtestliteclipboard.cpp \ - qtestlitemime.cpp \ - qtestlitestaticinfo.cpp + qtestlitescreen.cpp \ + qtestlitekeyboard.cpp \ + qtestliteclipboard.cpp \ + qtestlitemime.cpp \ + qtestlitestaticinfo.cpp HEADERS = \ qtestliteintegration.h \ qtestlitewindowsurface.h \ qtestlitewindow.h \ qtestlitecursor.h \ - qtestlitescreen.h \ - qtestlitekeyboard.h \ - qtestliteclipboard.h \ - qtestlitemime.h \ - qtestlitestaticinfo.h + qtestlitescreen.h \ + qtestlitekeyboard.h \ + qtestliteclipboard.h \ + qtestlitemime.h \ + qtestlitestaticinfo.h LIBS += -lX11 -lXext @@ -36,8 +36,21 @@ include (../fontdatabases/genericunix/genericunix.pri) contains(QT_CONFIG, opengl) { QT += opengl - HEADERS += qglxintegration.h - SOURCES += qglxintegration.cpp + !contains(QT_CONFIG, opengles2) { + HEADERS += qglxintegration.h + SOURCES += qglxintegration.cpp + } else { # There is no easy way to detect if we'r suppose to use glx or not + HEADERS += \ + ../eglconvenience/qeglplatformcontext.h \ + ../eglconvenience/qeglconvenience.h \ + qtestliteeglintegration.h + + SOURCES += \ + ../eglconvenience/qeglplatformcontext.cpp \ + ../eglconvenience/qeglconvenience.cpp \ + qtestliteeglintegration.cpp + LIBS += -lEGL + } } target.path += $$[QT_INSTALL_PLUGINS]/platforms -- cgit v0.12 From e24d7c9cab4a50fe682478d43ac74e867666d48b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@nokia.com> Date: Thu, 6 Jan 2011 10:30:18 +0100 Subject: Lighthouse: Support external plugins. Add -platformpluginpath command line option that spesifies an additional directory to scan for plugins. Also read QT_QPA_PLATFORM_PLUGIN_PATH. QlatformIntegrationFacgtory::create() now tries to load the plugin from the external path first. Similarly, keys() returns the keys from the extra path in addition to the "internal" keys API changes: QPlatformIntegration::create() and keys() now take an optional const QString &platformPluginPath. New file: externalplugin.pri, contains instructions and a base setup for building external plugins. --- src/gui/kernel/qapplication_qpa.cpp | 12 ++++++--- src/gui/kernel/qplatformintegrationfactory_qpa.cpp | 27 +++++++++++++++++--- src/gui/kernel/qplatformintegrationfactory_qpa_p.h | 4 +-- src/plugins/platforms/externalplugin.pri | 29 ++++++++++++++++++++++ 4 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 src/plugins/platforms/externalplugin.pri diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp index a164c2d..fdbb931 100644 --- a/src/gui/kernel/qapplication_qpa.cpp +++ b/src/gui/kernel/qapplication_qpa.cpp @@ -444,11 +444,11 @@ void QApplication::alert(QWidget *, int) { } -static void init_platform(const QString &name) +static void init_platform(const QString &name, const QString &platformPluginPath) { - QApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name); + QApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, platformPluginPath); if (!QApplicationPrivate::platform_integration) { - QStringList keys = QPlatformIntegrationFactory::keys(); + QStringList keys = QPlatformIntegrationFactory::keys(platformPluginPath); QString fatalMessage = QString::fromLatin1("Failed to load platform plugin \"%1\". Available platforms are: \n").arg(name); foreach(QString key, keys) { @@ -513,6 +513,7 @@ void qt_init(QApplicationPrivate *priv, int type) } QList<QByteArray> pluginList; + QString platformPluginPath = QLatin1String(qgetenv("QT_QPA_PLATFORM_PLUGIN_PATH")); QString platformName = QLatin1String(qgetenv("QT_QPA_PLATFORM")); // Get command line params @@ -527,6 +528,9 @@ void qt_init(QApplicationPrivate *priv, int type) if (arg == "-fn" || arg == "-font") { if (++i < argc) appFont = QString::fromLocal8Bit(argv[i]); + } else if (arg == "-platformpluginpath") { + if (++i < argc) + platformPluginPath = QLatin1String(argv[i]); } else if (arg == "-platform") { if (++i < argc) platformName = QLatin1String(argv[i]); @@ -550,7 +554,7 @@ void qt_init(QApplicationPrivate *priv, int type) } #endif - init_platform(platformName); + init_platform(platformName, platformPluginPath); init_plugins(pluginList); QColormap::initialize(); diff --git a/src/gui/kernel/qplatformintegrationfactory_qpa.cpp b/src/gui/kernel/qplatformintegrationfactory_qpa.cpp index 9122e1a..17a130d 100644 --- a/src/gui/kernel/qplatformintegrationfactory_qpa.cpp +++ b/src/gui/kernel/qplatformintegrationfactory_qpa.cpp @@ -52,15 +52,27 @@ QT_BEGIN_NAMESPACE #if !defined(QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, (QPlatformIntegrationFactoryInterface_iid, QLatin1String("/platforms"), Qt::CaseInsensitive)) +Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, directLoader, + (QPlatformIntegrationFactoryInterface_iid, QLatin1String(""), Qt::CaseInsensitive)) #endif -QPlatformIntegration *QPlatformIntegrationFactory::create(const QString& key) +QPlatformIntegration *QPlatformIntegrationFactory::create(const QString& key, const QString &platformPluginPath) { QPlatformIntegration *ret = 0; QStringList paramList = key.split(QLatin1Char(':')); QString platform = paramList.takeFirst().toLower(); #if !defined(QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) + // Try loading the plugin from platformPluginPath first: + if (!platformPluginPath.isEmpty()) { + QCoreApplication::addLibraryPath(platformPluginPath); + if (QPlatformIntegrationFactoryInterface *factory = + qobject_cast<QPlatformIntegrationFactoryInterface*>(directLoader()->instance(platform))) + ret = factory->create(key, paramList); + + if (ret) + return ret; + } if (QPlatformIntegrationFactoryInterface *factory = qobject_cast<QPlatformIntegrationFactoryInterface*>(loader()->instance(platform))) ret = factory->create(platform, paramList); #endif @@ -74,10 +86,19 @@ QPlatformIntegration *QPlatformIntegrationFactory::create(const QString& key) \sa create() */ -QStringList QPlatformIntegrationFactory::keys() +QStringList QPlatformIntegrationFactory::keys(const QString &platformPluginPath) { #if !defined(QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) - QStringList list = loader()->keys(); + QStringList list; + + if (!platformPluginPath.isEmpty()) { + QCoreApplication::addLibraryPath(platformPluginPath); + foreach (const QString &key, directLoader()->keys()) { + list += key + QString(QLatin1String(" (from %1)")).arg(platformPluginPath); + } + } + + list += loader()->keys(); #else QStringList list; #endif diff --git a/src/gui/kernel/qplatformintegrationfactory_qpa_p.h b/src/gui/kernel/qplatformintegrationfactory_qpa_p.h index ba02d2c..77e1da1 100644 --- a/src/gui/kernel/qplatformintegrationfactory_qpa_p.h +++ b/src/gui/kernel/qplatformintegrationfactory_qpa_p.h @@ -66,8 +66,8 @@ class QPlatformIntegration; class QPlatformIntegrationFactory { public: - static QStringList keys(); - static QPlatformIntegration *create(const QString&); + static QStringList keys(const QString &platformPluginPath = QString()); + static QPlatformIntegration *create(const QString &key, const QString &platformPluginPath = QString()); }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/externalplugin.pri b/src/plugins/platforms/externalplugin.pri new file mode 100644 index 0000000..54da4d9 --- /dev/null +++ b/src/plugins/platforms/externalplugin.pri @@ -0,0 +1,29 @@ +# +# Lighthouse now has preliminarily support for building and +# loading platform plugins from outside the Qt source/build +# tree. +# +# 1) Building external plugins: +# Set QTDIR to the Qt build directory, copy this file to +# the plugin source repository and include it at the top +# of the plugin's pro file. Use QT_SOURCE_TREE if you +# want to pull in source code from Qt: +# +# include($$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri) +# +# 2) Loading external plugins: +# Specify the path to the directory containing the +# plugin on the command line, in addition to the +# platform name. +# +# ./wiggly -platformPluginPath /path/to/myPlugin -platform gullfaksA +# + +!exists($$(QTDIR)/.qmake.cache) { + error("Please set QTDIR to the Qt build directory") +} + +QT_SOURCE_TREE = $$fromfile($$(QTDIR)/.qmake.cache,QT_SOURCE_TREE) +QT_BUILD_TREE = $$fromfile($$(QTDIR)/.qmake.cache,QT_BUILD_TREE) + +include($$QT_SOURCE_TREE/src/plugins/qpluginbase.pri) -- cgit v0.12 From 30080bdcb226a5a815465299bcb0dbb6a347cb1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Fri, 7 Jan 2011 12:12:35 +0100 Subject: Lighthouse: Fix keyboard modifier handling QApplication allready knows the modifiers --- src/gui/kernel/qapplication_qpa.cpp | 8 +++--- .../platforms/testlite/qtestlitekeyboard.cpp | 29 ++++++++++++++-------- src/plugins/platforms/testlite/qtestlitekeyboard.h | 1 + 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp index fdbb931..cd76adf 100644 --- a/src/gui/kernel/qapplication_qpa.cpp +++ b/src/gui/kernel/qapplication_qpa.cpp @@ -79,7 +79,6 @@ int qt_last_x = 0; int qt_last_y = 0; QPointer<QWidget> qt_last_mouse_receiver = 0; -static Qt::KeyboardModifiers modifiers = Qt::NoModifier; static Qt::MouseButtons buttons = Qt::NoButton; static ulong mousePressTime; static Qt::MouseButton mousePressButton = Qt::NoButton; @@ -731,7 +730,7 @@ void QApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mouse // qDebug() << "sending mouse ev." << ev.type() << localPoint << globalPoint << ev.button() << ev.buttons() << mouseWidget << "mouse grabber" << implicit_mouse_grabber; - QMouseEvent ev(type, localPoint, globalPoint, button, buttons, modifiers); + QMouseEvent ev(type, localPoint, globalPoint, button, buttons, QApplication::keyboardModifiers()); QList<QWeakPointer<QPlatformCursor> > cursors = QPlatformCursorPrivate::getInstances(); foreach (QWeakPointer<QPlatformCursor> cursor, cursors) { @@ -744,7 +743,7 @@ void QApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mouse #ifndef QT_NO_CONTEXTMENU if (type == QEvent::MouseButtonPress && button == Qt::RightButton && (openPopupCount == oldOpenPopupCount)) { - QContextMenuEvent e(QContextMenuEvent::Mouse, localPoint, globalPoint, modifiers); + QContextMenuEvent e(QContextMenuEvent::Mouse, localPoint, globalPoint, QApplication::keyboardModifiers()); QApplication::sendSpontaneousEvent(mouseWidget, &e); } #endif // QT_NO_CONTEXTMENU @@ -786,7 +785,7 @@ void QApplicationPrivate::processWheelEvent(QWindowSystemInterfacePrivate::Wheel p = mouseWidget->mapFromGlobal(globalPoint); } - QWheelEvent ev(p, globalPoint, e->delta, buttons, modifiers, + QWheelEvent ev(p, globalPoint, e->delta, buttons, QApplication::keyboardModifiers(), e->orient); QApplication::sendSpontaneousEvent(mouseWidget, &ev); } @@ -817,7 +816,6 @@ void QApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyEven if (app_do_modal && !qt_try_modal(focusW, e->keyType)) return; - modifiers = e->modifiers; QKeyEvent ev(e->keyType, e->key, e->modifiers, e->unicode, e->repeat, e->repeatCount); QApplication::sendSpontaneousEvent(focusW, &ev); } diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp index 93d21b3..ca4c203 100644 --- a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp @@ -1,5 +1,7 @@ #include "qtestlitekeyboard.h" +#include <QDebug> + #include "qtestlitescreen.h" #include <QtGui/QWindowSystemInterface> @@ -710,8 +712,8 @@ Qt::KeyboardModifiers QTestLiteKeyboard::translateModifiers(int s) ret |= Qt::AltModifier; if (s & m_meta_mask) ret |= Qt::MetaModifier; - if (s & m_mode_switch_mask) - ret |= Qt::GroupSwitchModifier; +// if (s & m_mode_switch_mask) //doesn't seem to work correctly +// ret |= Qt::GroupSwitchModifier; return ret; } @@ -947,14 +949,21 @@ static Qt::KeyboardModifiers modifierFromKeyCode(int qtcode) void QTestLiteKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, XKeyEvent *ev) { - int qtcode = 0; - Qt::KeyboardModifiers modifiers = translateModifiers(ev->state); + const int xkeycode = ev->keycode; + const uint xmodifiers = ev->state; + + KeySym baseKeySym; + uint consumedModifiers; + if (!XkbLookupKeySym(m_screen->display(), xkeycode, (xmodifiers & (LockMask | m_num_lock_mask)), + &consumedModifiers, &baseKeySym)) + return; + + Qt::KeyboardModifiers baseModifiers = 0; + int baseCode = -1; QByteArray chars; - chars.resize(513); int count = 0; - KeySym keySym; - count = XLookupString(ev,chars.data(),chars.size(),&keySym,0); - QString text = translateKeySym(keySym,ev->state,qtcode,modifiers,chars,count); - modifiers ^= modifierFromKeyCode(qtcode); - QWindowSystemInterface::handleKeyEvent(widget,ev->time,type,qtcode,modifiers,text.left(count)); + QString text = translateKeySym(baseKeySym, xmodifiers, baseCode, baseModifiers, chars, count); + + QWindowSystemInterface::handleKeyEvent(widget,ev->time,type,baseCode,baseModifiers,text.left(count)); + } diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.h b/src/plugins/platforms/testlite/qtestlitekeyboard.h index 65ead16..4e9d98d 100644 --- a/src/plugins/platforms/testlite/qtestlitekeyboard.h +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.h @@ -14,6 +14,7 @@ public: Qt::KeyboardModifiers translateModifiers(int s); + enum { MaxBits = sizeof(uint) * 8 }; private: void setMask(KeySym sym, uint mask); -- cgit v0.12 From 2bc7d2af6be2b09c38e989f339ec2ee33cc204eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Fri, 7 Jan 2011 17:38:59 +0100 Subject: Lighthouse: Fix keyboard on testlite Remove code which was wrong --- .../platforms/testlite/qtestlitekeyboard.cpp | 24 +++++++--------------- src/plugins/platforms/testlite/qtestlitekeyboard.h | 1 - 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp index ca4c203..72e6d50 100644 --- a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp @@ -1,7 +1,5 @@ #include "qtestlitekeyboard.h" -#include <QDebug> - #include "qtestlitescreen.h" #include <QtGui/QWindowSystemInterface> @@ -949,21 +947,13 @@ static Qt::KeyboardModifiers modifierFromKeyCode(int qtcode) void QTestLiteKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, XKeyEvent *ev) { - const int xkeycode = ev->keycode; - const uint xmodifiers = ev->state; - - KeySym baseKeySym; - uint consumedModifiers; - if (!XkbLookupKeySym(m_screen->display(), xkeycode, (xmodifiers & (LockMask | m_num_lock_mask)), - &consumedModifiers, &baseKeySym)) - return; - - Qt::KeyboardModifiers baseModifiers = 0; - int baseCode = -1; + int qtcode = 0; + Qt::KeyboardModifiers modifiers = translateModifiers(ev->state); QByteArray chars; + chars.resize(513); int count = 0; - QString text = translateKeySym(baseKeySym, xmodifiers, baseCode, baseModifiers, chars, count); - - QWindowSystemInterface::handleKeyEvent(widget,ev->time,type,baseCode,baseModifiers,text.left(count)); - + KeySym keySym; + count = XLookupString(ev,chars.data(),chars.size(),&keySym,0); + QString text = translateKeySym(keySym,ev->state,qtcode,modifiers,chars,count); + QWindowSystemInterface::handleKeyEvent(widget,ev->time,type,qtcode,modifiers,text.left(count)); } diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.h b/src/plugins/platforms/testlite/qtestlitekeyboard.h index 4e9d98d..65ead16 100644 --- a/src/plugins/platforms/testlite/qtestlitekeyboard.h +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.h @@ -14,7 +14,6 @@ public: Qt::KeyboardModifiers translateModifiers(int s); - enum { MaxBits = sizeof(uint) * 8 }; private: void setMask(KeySym sym, uint mask); -- cgit v0.12 From d281cea3a445aa244901decceffd7d653ed829c8 Mon Sep 17 00:00:00 2001 From: Sami Merila <sami.merila@nokia.com> Date: Mon, 10 Jan 2011 10:36:41 +0200 Subject: QWidgets support for VGA screen Add pixelmetrics data for QS60Style to support VGA screensizes. Task-number: QT-4079 Reviewed-by: Miikka Heikkinen --- src/gui/styles/qs60style.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp index 040ca4f..3ba8887 100644 --- a/src/gui/styles/qs60style.cpp +++ b/src/gui/styles/qs60style.cpp @@ -96,7 +96,8 @@ const layoutHeader QS60StylePrivate::m_layoutHeaders[] = { {320,240,1,19,"QVGA Portrait"}, {360,640,1,19,"NHD Landscape"}, {640,360,1,19,"NHD Portrait"}, -{352,800,1,12,"E90 Landscape"} +{352,800,1,12,"E90 Landscape"}, +{480,640,1,19,"VGA Landscape"} // *** End of generated data *** }; const int QS60StylePrivate::m_numberOfLayouts = @@ -109,6 +110,7 @@ const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = { {7,0,-909,0,0,2,0,5,-1,25,69,46,37,37,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,44,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,3,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, {7,0,-909,0,0,2,0,5,-1,25,68,46,37,37,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,52,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,3,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, {7,0,-909,0,0,2,0,2,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1,106} +{9,0,-909,0,0,2,0,5,-1,34,99,76,51,51,25,352,-909,-909,-909,29,25,7,0,0,43,34,42,76,7,7,2,-909,-909,0,9,14,0,23,39,30,30,37,37,9,391,40,0,-909,-909,-909,-909,0,0,29,2,-909,0,0,-909,29,-909,-909,-909,-909,115,37,96,48,96,19,19,9,1,25,-909,9,101,24,9,0,7,7,7,16,7,7,-909,3,-909,-909,-909,-909,9,9,3,1,184} // *** End of generated data *** }; -- cgit v0.12 From 19b6e2b944a0d1eeef0fb707a00f567e4ee870e6 Mon Sep 17 00:00:00 2001 From: Sami Merila <sami.merila@nokia.com> Date: Mon, 10 Jan 2011 11:32:15 +0200 Subject: Build failure fix (related to QT-4079) Change d281cea3a445aa244901decceffd7d653ed829c8 caused build failure, due to missing comma (one line missing from commit). Fixed by adding the missing change. Task-number: QT-4079 Reviewed-by: Miikka Heikkinen --- src/gui/styles/qs60style.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp index 3ba8887..4a4095d 100644 --- a/src/gui/styles/qs60style.cpp +++ b/src/gui/styles/qs60style.cpp @@ -109,7 +109,7 @@ const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = { {5,0,-909,0,0,1,0,2,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,28,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1,106}, {7,0,-909,0,0,2,0,5,-1,25,69,46,37,37,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,44,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,3,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, {7,0,-909,0,0,2,0,5,-1,25,68,46,37,37,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,52,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,3,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, -{7,0,-909,0,0,2,0,2,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1,106} +{7,0,-909,0,0,2,0,2,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1,106}, {9,0,-909,0,0,2,0,5,-1,34,99,76,51,51,25,352,-909,-909,-909,29,25,7,0,0,43,34,42,76,7,7,2,-909,-909,0,9,14,0,23,39,30,30,37,37,9,391,40,0,-909,-909,-909,-909,0,0,29,2,-909,0,0,-909,29,-909,-909,-909,-909,115,37,96,48,96,19,19,9,1,25,-909,9,101,24,9,0,7,7,7,16,7,7,-909,3,-909,-909,-909,-909,9,9,3,1,184} // *** End of generated data *** }; -- cgit v0.12 From 7fbf1829e11504eca6a55f1e5dbddf2f658b5302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com> Date: Fri, 17 Dec 2010 14:41:43 +0100 Subject: Fix a bug that got revealed by 604c51f1fc5c79b7fad12cda911b06b9e6e5005f The bug has been around for a while, but change 604c51f1fc5c7 made it emerge. The problem was that stretches were combined by always *maxing* them. The values of 'stretch' can be interpreted as this: -1: (the default) it means that the items should be stretched with the stretch factor dervived from the size hints. (In practice this means that they are distributed fairly). 0: Means that the item should not be stretched >0: Means that the item should be stretch with that number as a factor. This meant that combining one item with a fixed size(0) and another item with a default stretch (-1) the combined row stretch would end up being fixed. This also fixes how stretches are combined for spanning items too. Task-number: QTBUG-13551 Reviewed-by: John Tapsell --- src/gui/graphicsview/qgridlayoutengine.cpp | 5 +++-- .../tst_qgraphicslinearlayout.cpp | 26 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/gui/graphicsview/qgridlayoutengine.cpp b/src/gui/graphicsview/qgridlayoutengine.cpp index f1055ba..a3c7ff5 100644 --- a/src/gui/graphicsview/qgridlayoutengine.cpp +++ b/src/gui/graphicsview/qgridlayoutengine.cpp @@ -194,7 +194,8 @@ void QGridLayoutRowData::distributeMultiCells(const QGridLayoutRowInfo &rowInfo) for (int k = 0; k < span; ++k) { boxes[start + k].combine(extras[k]); - stretches[start + k] = qMax(stretches[start + k], stretch); + if (stretch != 0) + stretches[start + k] = qMax(stretches[start + k], stretch); } } multiCellMap.clear(); @@ -1472,7 +1473,7 @@ void QGridLayoutEngine::fillRowData(QGridLayoutRowData *rowData, const QLayoutSt QGridLayoutBox *box; if (effectiveRowSpan == 1) { box = &rowBox; - if (!userRowStretch) + if (!userRowStretch && itemStretch != 0) rowStretch = qMax(rowStretch, itemStretch); } else { QGridLayoutMultiCellData &multiCell = diff --git a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp index 965e340..48dea0c 100644 --- a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp +++ b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp @@ -106,6 +106,7 @@ private slots: void testAlignmentInLargerLayout(); void testOffByOneInLargerLayout(); void testDefaultAlignment(); + void combineSizePolicies(); // Task specific tests void task218400_insertStretchCrash(); @@ -1583,6 +1584,31 @@ void tst_QGraphicsLinearLayout::testDefaultAlignment() QCOMPARE(w2->geometry(), QRectF(0,50,100,100)); } +void tst_QGraphicsLinearLayout::combineSizePolicies() +{ + QGraphicsWidget *widget = new QGraphicsWidget; + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Horizontal, widget); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + + QGraphicsWidget *w1 = new QGraphicsWidget; + w1->setMaximumSize(200,200); + w1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + layout->addItem(w1); + + QGraphicsWidget *w2 = new QGraphicsWidget; + w2->setPreferredSize(50,50); + w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + layout->addItem(w2); + QCOMPARE(layout->maximumHeight(), qreal(200)); + + // now remove the fixed vertical size policy, and set instead the maximum height to 50 + // this should in effect give the same maximumHeight + w2->setMaximumHeight(50); + w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + QCOMPARE(layout->maximumHeight(), qreal(200)); +} + QTEST_MAIN(tst_QGraphicsLinearLayout) #include "tst_qgraphicslinearlayout.moc" -- cgit v0.12 From 7cc615479a8abdf8b4056850daa8cdb5143f3782 Mon Sep 17 00:00:00 2001 From: John Tapsell <john.tapsell.ext@basyskom.de> Date: Mon, 20 Dec 2010 09:52:22 +0000 Subject: Some unit tests for layout explosion thingy Adds more tests for commit 7fbf1829e11504eca6a55f1e5dbddf2f658b5302 Task-number: QTBUG-13551 --- .../tst_qgraphicsgridlayout.cpp | 158 +++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp index 35ea059..baea906 100644 --- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp +++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp @@ -120,6 +120,11 @@ private slots: void avoidRecursionInInsertItem(); void styleInfoLeak(); void task236367_maxSizeHint(); + void spanningItem2x2_data(); + void spanningItem2x2(); + void spanningItem2x3_data(); + void spanningItem2x3(); + void spanningItem(); void heightForWidth(); void heightForWidthWithSpanning(); void stretchAndHeightForWidth(); @@ -2860,6 +2865,159 @@ void tst_QGraphicsGridLayout::heightForWidthWithSpanning() QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 10000)); } +Q_DECLARE_METATYPE(QSizePolicy::Policy) +void tst_QGraphicsGridLayout::spanningItem2x2_data() +{ + QTest::addColumn<QSizePolicy::Policy>("sizePolicy"); + QTest::addColumn<int>("itemHeight"); + QTest::addColumn<int>("expectedHeight"); + + QTest::newRow("A larger spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 39 << 80; + QTest::newRow("A larger spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 39 << 80; + QTest::newRow("An equally-sized spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 40 << 80; + QTest::newRow("An equally-sized spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 40 << 80; + QTest::newRow("A smaller spanning item with 2 widgets with fixed policy") << QSizePolicy::Fixed << 41 << 82; + QTest::newRow("A smaller spanning item with 2 widgets with preferred policy") << QSizePolicy::Preferred << 41 << 82; +} + +void tst_QGraphicsGridLayout::spanningItem2x2() +{ + QFETCH(QSizePolicy::Policy, sizePolicy); + QFETCH(int, itemHeight); + QFETCH(int, expectedHeight); + QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window); + QGraphicsGridLayout *layout = new QGraphicsGridLayout(form); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + + QGraphicsWidget *w1 = new QGraphicsWidget; + w1->setMinimumSize(80,80); + w1->setMaximumSize(80,80); + + QGraphicsWidget *w2 = new QGraphicsWidget; + w2->setMinimumSize(80,itemHeight); + w2->setPreferredSize(80,itemHeight); + w2->setSizePolicy(QSizePolicy::Fixed, sizePolicy); + + QGraphicsWidget *w3 = new QGraphicsWidget; + w3->setMinimumSize(80,itemHeight); + w3->setPreferredSize(80,itemHeight); + w3->setSizePolicy(QSizePolicy::Fixed, sizePolicy); + + layout->addItem(w1, 0, 0, 2, 1); + layout->addItem(w2, 0, 1); + layout->addItem(w3, 1, 1); + + QCOMPARE(layout->minimumSize(), QSizeF(160,expectedHeight)); + if(sizePolicy == QSizePolicy::Fixed) + QCOMPARE(layout->maximumSize(), QSizeF(160,expectedHeight)); + else + QCOMPARE(layout->maximumSize(), QSizeF(160,QWIDGETSIZE_MAX)); +} + +void tst_QGraphicsGridLayout::spanningItem2x3_data() +{ + QTest::addColumn<bool>("w1_fixed"); + QTest::addColumn<bool>("w2_fixed"); + QTest::addColumn<bool>("w3_fixed"); + QTest::addColumn<bool>("w4_fixed"); + QTest::addColumn<bool>("w5_fixed"); + + for(int w1 = 0; w1 < 2; w1++) + for(int w2 = 0; w2 < 2; w2++) + for(int w3 = 0; w3 < 2; w3++) + for(int w4 = 0; w4 < 2; w4++) + for(int w5 = 0; w5 < 2; w5++) { + QString description = QString("Fixed sizes:") + (w1?" w1":"") + (w2?" w2":"") + (w3?" w3":"") + (w4?" w4":"") + (w5?" w5":""); + QTest::newRow(description.toLatin1()) << (bool)w1 << (bool)w2 << (bool)w3 << (bool)w4 << (bool)w5; + } +} + +void tst_QGraphicsGridLayout::spanningItem2x3() +{ + QFETCH(bool, w1_fixed); + QFETCH(bool, w2_fixed); + QFETCH(bool, w3_fixed); + QFETCH(bool, w4_fixed); + QFETCH(bool, w5_fixed); + QGraphicsGridLayout *layout = new QGraphicsGridLayout; + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + + QGraphicsWidget *w1 = new QGraphicsWidget; + w1->setMinimumSize(80,80); + w1->setMaximumSize(80,80); + if (w1_fixed) + w1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + + QGraphicsWidget *w2 = new QGraphicsWidget; + w2->setMinimumSize(80,48); + w2->setPreferredSize(80,48); + if (w2_fixed) + w2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + + QGraphicsWidget *w3 = new QGraphicsWidget; + w3->setMinimumSize(80,30); + w3->setPreferredSize(80,30); + if (w3_fixed) + w3->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + + QGraphicsWidget *w4 = new QGraphicsWidget; + w4->setMinimumSize(80,30); + w4->setMaximumSize(80,30); + if (w4_fixed) + w4->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + + QGraphicsWidget *w5 = new QGraphicsWidget; + w5->setMinimumSize(40,24); + w5->setMaximumSize(40,24); + if (w5_fixed) + w5->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + + layout->addItem(w1, 0, 0, 2, 1); + layout->addItem(w2, 0, 1); + layout->addItem(w3, 1, 1); + layout->addItem(w4, 0, 2); + layout->addItem(w5, 1, 2); + + QCOMPARE(layout->minimumSize(), QSizeF(240,80)); + // Only w2 and w3 grow vertically, so when they have a fixed vertical size policy, + // the whole layout cannot grow vertically. + if (w2_fixed && w3_fixed) + QCOMPARE(layout->maximumSize(), QSizeF(QWIDGETSIZE_MAX,80)); + else + QCOMPARE(layout->maximumSize(), QSizeF(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX)); +} + +void tst_QGraphicsGridLayout::spanningItem() +{ + QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window); + QGraphicsGridLayout *layout = new QGraphicsGridLayout(form); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + + QGraphicsWidget *w1 = new QGraphicsWidget; + w1->setMinimumSize(80,80); + w1->setMaximumSize(80,80); + + QGraphicsWidget *w2 = new QGraphicsWidget; + w2->setMinimumSize(80,38); + w2->setPreferredSize(80,38); + w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + QGraphicsWidget *w3 = new QGraphicsWidget; + w3->setMinimumSize(80,38); + w3->setPreferredSize(80,38); + w3->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + layout->addItem(w1, 0, 0, 2, 1); + layout->addItem(w2, 0, 1); + layout->addItem(w3, 1, 1); + + QCOMPARE(layout->minimumSize(), QSizeF(160,80)); + QCOMPARE(layout->maximumSize(), QSizeF(160,80)); +} + void tst_QGraphicsGridLayout::stretchAndHeightForWidth() { QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); -- cgit v0.12 From 18ced2568f524ff38ebf610125ca9611e787abe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@nokia.com> Date: Fri, 14 Jan 2011 10:28:37 +0100 Subject: Configure: allow -no-framework for lighthouse. (configure has trouble separating host and target platforms.) --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index e8a5662..e3c0882 100755 --- a/configure +++ b/configure @@ -1525,7 +1525,7 @@ while [ "$#" -gt 0 ]; do ;; framework) - if [ "$PLATFORM_MAC" = "yes" ]; then + if [ "$PLATFORM_MAC" = "yes" ] || [ "$PLATFORM_QPA" = "yes" ]; then CFG_FRAMEWORK="$VAL" else UNKNOWN_OPT=yes -- cgit v0.12 From c9045e9f65f9fb5072825fb49e56f6db8197a917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com> Date: Fri, 14 Jan 2011 13:38:02 +0100 Subject: Revert "Add a warning about trying to release a timer ID that isn't active" This reverts commit e1955231478df8990cf8b1f80438abf957c5d6f2. In a patch release this is the best way of fixing the problem of warnings. This will be fixed properly in 4.8 Reviewed-by: Gabriel Task-number: QTBUG-16175 --- src/corelib/kernel/qeventdispatcher_unix.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp index b2ccc68..f50994c 100644 --- a/src/corelib/kernel/qeventdispatcher_unix.cpp +++ b/src/corelib/kernel/qeventdispatcher_unix.cpp @@ -501,7 +501,6 @@ bool QTimerInfoList::unregisterTimer(int timerId) } } // id not found - qWarning("Application asked to unregister timer 0x%x which is not registered in this thread. Fix application.", timerId); return false; } -- cgit v0.12 From ec4b73992eb7fb7254bb7a1524b8691ef2123b9f Mon Sep 17 00:00:00 2001 From: Shane Kearns <shane.kearns@accenture.com> Date: Wed, 5 Jan 2011 11:07:56 +0000 Subject: Workaround crash when multiple QNetworkAccessManager instances are used Instead of each QNetworkAccessManager owning a QNetworkSession, they now share a QNetworkSession if they have the same QNetworkConfiguration. QNetworkAccessManager now uses passive roaming instead of application level roaming. The state change signal (entering connected state) is used to indicate reconnection instead of being triggered when sending an ALR accept(). This preserves the previous behaviour, as QNAM always accepted the suggested access point from bearer mobility. In the case of multithreaded applications, one QNetworkSession will be created for each thread which uses QNetworkAccessManager, as QNetworkSession is not thread safe. Task-number: QT-4378 Reviewed-by: Markus Goetz Reviewed-by: juhvu --- src/network/access/qnetworkaccessmanager.cpp | 42 +++---------- src/network/access/qnetworkaccessmanager.h | 2 - src/network/access/qnetworkaccessmanager_p.h | 2 +- src/network/access/qnetworkreplyimpl.cpp | 6 +- src/network/bearer/bearer.pri | 6 +- src/network/bearer/qsharednetworksession.cpp | 90 ++++++++++++++++++++++++++++ src/network/bearer/qsharednetworksession_p.h | 81 +++++++++++++++++++++++++ 7 files changed, 188 insertions(+), 41 deletions(-) create mode 100644 src/network/bearer/qsharednetworksession.cpp create mode 100644 src/network/bearer/qsharednetworksession_p.h diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 5ceaed0..6b8dc9e 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -48,6 +48,7 @@ #include "qabstractnetworkcache.h" #include "QtNetwork/qnetworksession.h" +#include "qsharednetworksession_p.h" #include "qnetworkaccesshttpbackend_p.h" #include "qnetworkaccessftpbackend_p.h" @@ -1354,11 +1355,8 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co initializeSession = false; - if (networkSession) - delete networkSession; - if (!config.isValid()) { - networkSession = 0; + networkSession.clear(); online = false; if (networkAccessible == QNetworkAccessManager::NotAccessible) @@ -1369,18 +1367,12 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co return; } - networkSession = new QNetworkSession(config, q); + networkSession = QSharedNetworkSessionManager::getSession(config); - QObject::connect(networkSession, SIGNAL(opened()), q, SIGNAL(networkSessionConnected())); - QObject::connect(networkSession, SIGNAL(closed()), q, SLOT(_q_networkSessionClosed())); - QObject::connect(networkSession, SIGNAL(stateChanged(QNetworkSession::State)), + QObject::connect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected())); + QObject::connect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed())); + QObject::connect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)), q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State))); - QObject::connect(networkSession, SIGNAL(newConfigurationActivated()), - q, SLOT(_q_networkSessionNewConfigurationActivated())); - QObject::connect(networkSession, - SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)), - q, - SLOT(_q_networkSessionPreferredConfigurationChanged(QNetworkConfiguration,bool))); _q_networkSessionStateChanged(networkSession->state()); } @@ -1390,32 +1382,16 @@ void QNetworkAccessManagerPrivate::_q_networkSessionClosed() if (networkSession) { networkConfiguration = networkSession->configuration().identifier(); - networkSession->deleteLater(); - networkSession = 0; - } -} - -void QNetworkAccessManagerPrivate::_q_networkSessionNewConfigurationActivated() -{ - Q_Q(QNetworkAccessManager); - - if (networkSession) { - networkSession->accept(); - - emit q->networkSessionConnected(); + networkSession.clear(); } } -void QNetworkAccessManagerPrivate::_q_networkSessionPreferredConfigurationChanged(const QNetworkConfiguration &, bool) -{ - if (networkSession) - networkSession->migrate(); -} - void QNetworkAccessManagerPrivate::_q_networkSessionStateChanged(QNetworkSession::State state) { Q_Q(QNetworkAccessManager); + if (state == QNetworkSession::Connected) + emit q->networkSessionConnected(); if (online) { if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) { online = false; diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h index f3e502c..7ef009f 100644 --- a/src/network/access/qnetworkaccessmanager.h +++ b/src/network/access/qnetworkaccessmanager.h @@ -161,8 +161,6 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_replySslErrors(QList<QSslError>)) #if !defined(QT_NO_BEARERMANAGEMENT) && !defined(QT_MOBILITY_BEARER) Q_PRIVATE_SLOT(d_func(), void _q_networkSessionClosed()) - Q_PRIVATE_SLOT(d_func(), void _q_networkSessionNewConfigurationActivated()) - Q_PRIVATE_SLOT(d_func(), void _q_networkSessionPreferredConfigurationChanged(QNetworkConfiguration,bool)) Q_PRIVATE_SLOT(d_func(), void _q_networkSessionStateChanged(QNetworkSession::State)) #endif }; diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h index ee16c25..cf4d2f3 100644 --- a/src/network/access/qnetworkaccessmanager_p.h +++ b/src/network/access/qnetworkaccessmanager_p.h @@ -128,7 +128,7 @@ public: #endif #ifndef QT_NO_BEARERMANAGEMENT - QNetworkSession *networkSession; + QSharedPointer<QNetworkSession> networkSession; QString networkConfiguration; QNetworkAccessManager::NetworkAccessibility networkAccessible; bool online; diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index 53d3b11..9d7082c 100644 --- a/src/network/access/qnetworkreplyimpl.cpp +++ b/src/network/access/qnetworkreplyimpl.cpp @@ -91,7 +91,7 @@ void QNetworkReplyImplPrivate::_q_startOperation() // state changes. state = WaitingForSession; - QNetworkSession *session = manager->d_func()->networkSession; + QNetworkSession *session = manager->d_func()->networkSession.data(); if (session) { Q_Q(QNetworkReplyImpl); @@ -246,7 +246,7 @@ void QNetworkReplyImplPrivate::_q_networkSessionConnected() if (manager.isNull()) return; - QNetworkSession *session = manager->d_func()->networkSession; + QNetworkSession *session = manager->d_func()->networkSession.data(); if (!session) return; @@ -633,7 +633,7 @@ void QNetworkReplyImplPrivate::finished() if (!manager.isNull()) { #ifndef QT_NO_BEARERMANAGEMENT - QNetworkSession *session = manager->d_func()->networkSession; + QNetworkSession *session = manager->d_func()->networkSession.data(); if (session && session->state() == QNetworkSession::Roaming && state == Working && errorCode != QNetworkReply::OperationCanceledError) { // only content with a known size will fail with a temporary network failure error diff --git a/src/network/bearer/bearer.pri b/src/network/bearer/bearer.pri index 44e97fd..684e02b 100644 --- a/src/network/bearer/bearer.pri +++ b/src/network/bearer/bearer.pri @@ -7,12 +7,14 @@ HEADERS += bearer/qnetworkconfiguration.h \ bearer/qnetworkconfiguration_p.h \ bearer/qnetworksession_p.h \ bearer/qbearerengine_p.h \ - bearer/qbearerplugin_p.h + bearer/qbearerplugin_p.h \ + bearer/qsharednetworksession_p.h SOURCES += bearer/qnetworksession.cpp \ bearer/qnetworkconfigmanager.cpp \ bearer/qnetworkconfiguration.cpp \ bearer/qnetworkconfigmanager_p.cpp \ bearer/qbearerengine.cpp \ - bearer/qbearerplugin.cpp + bearer/qbearerplugin.cpp \ + bearer/qsharednetworksession.cpp diff --git a/src/network/bearer/qsharednetworksession.cpp b/src/network/bearer/qsharednetworksession.cpp new file mode 100644 index 0000000..51b3a32 --- /dev/null +++ b/src/network/bearer/qsharednetworksession.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtNetwork module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qsharednetworksession_p.h" +#include "qbearerengine_p.h" +#include <QThreadStorage> + +#ifndef QT_NO_BEARERMANAGEMENT + +QT_BEGIN_NAMESPACE + +QThreadStorage<QSharedNetworkSessionManager *> tls; + +inline QSharedNetworkSessionManager* sharedNetworkSessionManager() +{ + QSharedNetworkSessionManager* rv = tls.localData(); + if (!rv) { + rv = new QSharedNetworkSessionManager; + tls.setLocalData(rv); + } + return rv; +} + +QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(QNetworkConfiguration config) +{ + QSharedNetworkSessionManager *m(sharedNetworkSessionManager()); + //if already have a session, return it + if (m->sessions.contains(config)) { + QSharedPointer<QNetworkSession> p = m->sessions.value(config).toStrongRef(); + if (!p.isNull()) + return p; + } + //otherwise make one + QSharedPointer<QNetworkSession> session(new QNetworkSession(config)); + m->sessions[config] = session; + return session; +} + +void QSharedNetworkSessionManager::setSession(QNetworkConfiguration config, QSharedPointer<QNetworkSession> session) +{ + QSharedNetworkSessionManager *m(sharedNetworkSessionManager()); + m->sessions[config] = session; +} + +uint qHash(const QNetworkConfiguration& config) +{ + return ((uint)config.type()) | (((uint)config.bearerType()) << 8) | (((uint)config.purpose()) << 16); +} + +QT_END_NAMESPACE + +#endif // QT_NO_BEARERMANAGEMENT diff --git a/src/network/bearer/qsharednetworksession_p.h b/src/network/bearer/qsharednetworksession_p.h new file mode 100644 index 0000000..dc84166 --- /dev/null +++ b/src/network/bearer/qsharednetworksession_p.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtNetwork module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QSHAREDNETWORKSESSIONPRIVATE_H +#define QSHAREDNETWORKSESSIONPRIVATE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qnetworksession.h" +#include "qnetworkconfiguration.h" +#include <QHash> +#include <QSharedPointer> +#include <QWeakPointer> +#include <QMutex> + +#ifndef QT_NO_BEARERMANAGEMENT + +QT_BEGIN_NAMESPACE + +class QSharedNetworkSessionManager +{ +public: + static QSharedPointer<QNetworkSession> getSession(QNetworkConfiguration config); + static void setSession(QNetworkConfiguration config, QSharedPointer<QNetworkSession> session); +private: + QHash<QNetworkConfiguration, QWeakPointer<QNetworkSession> > sessions; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_BEARERMANAGEMENT + +#endif //QSHAREDNETWORKSESSIONPRIVATE_H + -- cgit v0.12 From 37faa3ba7c66d14e1ecbf75e93d9f0d27fa57a76 Mon Sep 17 00:00:00 2001 From: mread <qt-info@nokia.com> Date: Mon, 17 Jan 2011 10:52:14 +0000 Subject: QTBUG-16110 updating the softkeys when app comes to foreground When an app is in the background and creates a window with softkeys, the softkeys are not updated when the app comes to the foreground, so they look faded. This change updates the softkeys when the app comes to the forground. Task-number: QTBUG-16110 Reviewed-by: Jason Barron --- src/gui/kernel/qapplication_s60.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 789f198..ba06312 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -2016,6 +2016,9 @@ int QApplicationPrivate::symbianProcessWsEvent(const QSymbianEvent *symbianEvent S60->wsSession().SetPointerCursorMode(EPointerCursorNormal); } #endif +#ifdef QT_SOFTKEYS_ENABLED + QSoftKeyManager::updateSoftKeys(); +#endif break; case EEventFocusLost: if (callSymbianEventFilters(symbianEvent)) -- cgit v0.12 From 9b1c0992f2f26a6f1570751f39b55d8b9a3da45d Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Wed, 12 Jan 2011 16:09:03 +0100 Subject: fix typo in error messages Task-number: QTBUG-16369 --- src/declarative/qml/parser/qdeclarativejslexer.cpp | 2 +- tools/linguist/lupdate/qscript.cpp | 2 +- tools/linguist/lupdate/qscript.g | 2 +- translations/linguist_de.ts | 2 +- translations/linguist_ja.ts | 2 +- translations/linguist_ru.ts | 2 +- translations/linguist_sl.ts | 2 +- translations/linguist_uk.ts | 2 +- translations/qt_de.ts | 2 +- translations/qt_fr.ts | 2 +- translations/qt_gl.ts | 2 +- translations/qt_hu.ts | 2 +- translations/qt_ja.ts | 2 +- translations/qt_pl.ts | 2 +- translations/qt_ru.ts | 2 +- translations/qt_sl.ts | 2 +- translations/qt_uk.ts | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/declarative/qml/parser/qdeclarativejslexer.cpp b/src/declarative/qml/parser/qdeclarativejslexer.cpp index af955a4..4dfef45 100644 --- a/src/declarative/qml/parser/qdeclarativejslexer.cpp +++ b/src/declarative/qml/parser/qdeclarativejslexer.cpp @@ -619,7 +619,7 @@ int Lexer::lex() } else { setDone(Bad); err = IllegalEscapeSequence; - errmsg = QCoreApplication::translate("QDeclarativeParser", "Illegal escape squence"); + errmsg = QCoreApplication::translate("QDeclarativeParser", "Illegal escape sequence"); } } else if (current == 'x') state = InHexEscape; diff --git a/tools/linguist/lupdate/qscript.cpp b/tools/linguist/lupdate/qscript.cpp index beeec22..23fb9f6 100644 --- a/tools/linguist/lupdate/qscript.cpp +++ b/tools/linguist/lupdate/qscript.cpp @@ -1528,7 +1528,7 @@ int QScript::Lexer::lex() } else { setDone(Bad); err = IllegalEscapeSequence; - errmsg = LU::tr("Illegal escape squence"); + errmsg = LU::tr("Illegal escape sequence"); } } else if (current == 'x') state = InHexEscape; diff --git a/tools/linguist/lupdate/qscript.g b/tools/linguist/lupdate/qscript.g index 8be20d0..fb4eee7 100644 --- a/tools/linguist/lupdate/qscript.g +++ b/tools/linguist/lupdate/qscript.g @@ -859,7 +859,7 @@ int QScript::Lexer::lex() } else { setDone(Bad); err = IllegalEscapeSequence; - errmsg = LU::tr("Illegal escape squence"); + errmsg = LU::tr("Illegal escape sequence"); } } else if (current == 'x') state = InHexEscape; diff --git a/translations/linguist_de.ts b/translations/linguist_de.ts index e9b5661..cb0b36d 100644 --- a/translations/linguist_de.ts +++ b/translations/linguist_de.ts @@ -908,7 +908,7 @@ Options: <translation type="unfinished"></translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation type="unfinished"></translation> </message> <message> diff --git a/translations/linguist_ja.ts b/translations/linguist_ja.ts index 4b2cbf7..40bb778 100644 --- a/translations/linguist_ja.ts +++ b/translations/linguist_ja.ts @@ -1112,7 +1112,7 @@ Qt TS XML). 新しく追加されたり変更されたメッセージは既存 <translation>ファイルの終端までに閉じられていない文字列</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>無効なエスケープシーケンス</translation> </message> <message> diff --git a/translations/linguist_ru.ts b/translations/linguist_ru.ts index db76e72..dfda98e 100644 --- a/translations/linguist_ru.ts +++ b/translations/linguist_ru.ts @@ -1155,7 +1155,7 @@ lupdate - это один из инструментов Qt Linguist. Он изв <translation>Незавершенный текст в конце строки</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>Неверная esc-последовательность</translation> </message> <message> diff --git a/translations/linguist_sl.ts b/translations/linguist_sl.ts index 27ca8d1..4499133 100644 --- a/translations/linguist_sl.ts +++ b/translations/linguist_sl.ts @@ -912,7 +912,7 @@ Options: <translation type="unfinished"></translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation type="unfinished"></translation> </message> <message> diff --git a/translations/linguist_uk.ts b/translations/linguist_uk.ts index 56aadab..56db6ba 100644 --- a/translations/linguist_uk.ts +++ b/translations/linguist_uk.ts @@ -1146,7 +1146,7 @@ lupdate - це частина набору програм Qt Linguist. Вона <translation>Незакритий рядок в кінці файлу</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>Неприпустима керуюча послідовність</translation> </message> <message> diff --git a/translations/qt_de.ts b/translations/qt_de.ts index cd7d782..dd8147f 100644 --- a/translations/qt_de.ts +++ b/translations/qt_de.ts @@ -1947,7 +1947,7 @@ nach <translation>Zeichenkette am Zeilenende nicht abgeschlossen</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>Ungültiges Escape-Sequenz</translation> </message> <message> diff --git a/translations/qt_fr.ts b/translations/qt_fr.ts index b1ded34..eb9f1b5 100644 --- a/translations/qt_fr.ts +++ b/translations/qt_fr.ts @@ -2205,7 +2205,7 @@ en <translation>Chaîne de caractères non fermée en fin de ligne</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>Séquence d'échappement illégale</translation> </message> <message> diff --git a/translations/qt_gl.ts b/translations/qt_gl.ts index 41e338f..1f3e02e 100644 --- a/translations/qt_gl.ts +++ b/translations/qt_gl.ts @@ -2238,7 +2238,7 @@ superior, inferior nin vcenter.</translation> <translation>Cadea non pechada no fin dunha liña</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>Secuencia de escape ilegal</translation> </message> <message> diff --git a/translations/qt_hu.ts b/translations/qt_hu.ts index d9b05d1..0497477 100644 --- a/translations/qt_hu.ts +++ b/translations/qt_hu.ts @@ -2619,7 +2619,7 @@ erre: </message> <message> <location line="+26"/> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation type="unfinished"></translation> </message> <message> diff --git a/translations/qt_ja.ts b/translations/qt_ja.ts index bf31fe5..db8a917 100644 --- a/translations/qt_ja.ts +++ b/translations/qt_ja.ts @@ -1945,7 +1945,7 @@ to <translation>文字列が行末で閉じていません</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>無効なエスケープシーケンスです</translation> </message> <message> diff --git a/translations/qt_pl.ts b/translations/qt_pl.ts index 2b9a4df..37fbee1 100644 --- a/translations/qt_pl.ts +++ b/translations/qt_pl.ts @@ -1952,7 +1952,7 @@ na <translation>Niedomknięty ciąg na końcu linii</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation type="unfinished"></translation> </message> <message> diff --git a/translations/qt_ru.ts b/translations/qt_ru.ts index 299799d..e20fc0c 100644 --- a/translations/qt_ru.ts +++ b/translations/qt_ru.ts @@ -1950,7 +1950,7 @@ to <translation>Незакрытый текст в конце строки</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>Недопустимая esc-последовательность</translation> </message> <message> diff --git a/translations/qt_sl.ts b/translations/qt_sl.ts index e9e2e75..98cca91 100644 --- a/translations/qt_sl.ts +++ b/translations/qt_sl.ts @@ -1961,7 +1961,7 @@ v <translation>Nezaprt niz na koncu vrstice</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>Neveljavno ubežno zaporedje</translation> </message> <message> diff --git a/translations/qt_uk.ts b/translations/qt_uk.ts index 18bac2e..7f396ad 100644 --- a/translations/qt_uk.ts +++ b/translations/qt_uk.ts @@ -1925,7 +1925,7 @@ to <translation>Незакритий рядок в кінці файлу</translation> </message> <message> - <source>Illegal escape squence</source> + <source>Illegal escape sequence</source> <translation>Неприпустима керуюча послідовність</translation> </message> <message> -- cgit v0.12 From fc954809cae4a24ada47ff35b9ffbabe0b451835 Mon Sep 17 00:00:00 2001 From: Frederik Schwarzer <schwarzerf@gmail.com> Date: Wed, 12 Jan 2011 13:42:59 +0100 Subject: German translation fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - some entity mismatches (apos -> quot) - Boolesch -> boolesch - Hangul is translated Hangeul - schlug fehl -> ist fehlgeschlagen - unify: next; previous -> nächte[sr]; vorherige[sr] - unify: Encoding -> Kodierung ... and some various fixes more. Merge-request: 2535 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- translations/qt_de.ts | 172 +++++++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/translations/qt_de.ts b/translations/qt_de.ts index dd8147f..f56978f 100644 --- a/translations/qt_de.ts +++ b/translations/qt_de.ts @@ -128,7 +128,7 @@ Bitte überprüfen Sie Ihre GStreamer-Installation und stellen Sie sicher, dass </message> <message> <source>Plugin codec installation failed for codec: %0</source> - <translation>Die Installation des Codec-Plugins schlug fehl für: %0</translation> + <translation>Die Installation des Codec-Plugins ist fehlgeschlagen für: %0</translation> </message> <message> <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> @@ -314,7 +314,7 @@ Bitte überprüfen Sie Ihre GStreamer-Installation und stellen Sie sicher, dass </message> <message> <source>Loading clip failed</source> - <translation>Das Laden des Clips schlug fehl</translation> + <translation>Das Laden des Clips ist fehlgeschlagen</translation> </message> <message> <source>Playback complete</source> @@ -1196,7 +1196,7 @@ nach <message> <source>%1: ftok failed</source> <comment>QSystemSemaphore</comment> - <translation>%1: ftok-Aufruf schlug fehl</translation> + <translation>%1: ftok-Aufruf ist fehlgeschlagen</translation> </message> <message> <source>%1: already exists</source> @@ -1288,11 +1288,11 @@ nach <name>QDeclarativeAbstractAnimation</name> <message> <source>Cannot animate non-existent property "%1"</source> - <translation>Die Eigenschaft '%1" existiert nicht und kann daher nicht animiert werden</translation> + <translation>Die Eigenschaft "%1" existiert nicht und kann daher nicht animiert werden</translation> </message> <message> <source>Cannot animate read-only property "%1"</source> - <translation>Die Eigenschaft '%1" ist schreibgeschützt und kann daher nicht animiert werden</translation> + <translation>Die Eigenschaft "%1" ist schreibgeschützt und kann daher nicht animiert werden</translation> </message> <message> <source>Animation is an abstract class</source> @@ -1350,7 +1350,7 @@ nach </message> <message> <source>Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.</source> - <translation>Ein Baseline-Anker darf nicht mit zusammen mit weiteren Ankerangaben für oben, unten und vertikal zentriert verwendet werden.</translation> + <translation>Ein Baseline-Anker darf nicht zusammen mit weiteren Ankerangaben für oben, unten und vertikal zentriert verwendet werden.</translation> </message> <message> <source>Cannot anchor a vertical edge to a horizontal edge.</source> @@ -1375,14 +1375,14 @@ nach <name>QDeclarativeBinding</name> <message> <source>Binding loop detected for property "%1"</source> - <translation>Bei der für die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt</translation> + <translation>Bei der für die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt</translation> </message> </context> <context> <name>QDeclarativeCompiledBindings</name> <message> <source>Binding loop detected for property "%1"</source> - <translation>Bei der für die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt</translation> + <translation>Bei der für die Eigenschaft "%1" angegebenen Bindung wurde eine Endlosschleife festgestellt</translation> </message> </context> <context> @@ -1393,7 +1393,7 @@ nach </message> <message> <source>Invalid property assignment: unknown enumeration</source> - <translation>Ungültige Zuweisung bei Eigenschaft: Ungültiger Aufzählungswert</translation> + <translation>Ungültige Zuweisung bei Eigenschaft: Unbekannter Aufzählungswert</translation> </message> <message> <source>Invalid property assignment: string expected</source> @@ -1449,7 +1449,7 @@ nach </message> <message> <source>Invalid property assignment: boolean expected</source> - <translation>Ungültige Zuweisung bei Eigenschaft: Es wird ein Boolescher Wert erwartet</translation> + <translation>Ungültige Zuweisung bei Eigenschaft: Es wird ein boolescher Wert erwartet</translation> </message> <message> <source>Invalid property assignment: 3D vector expected</source> @@ -1465,7 +1465,7 @@ nach </message> <message> <source>Component elements may not contain properties other than id</source> - <translation>Komponenten dürfen außer id keine weiteren Eigenschaften enthalten.</translation> + <translation>Komponenten dürfen außer id keine weiteren Eigenschaften enthalten</translation> </message> <message> <source>Invalid component id specification</source> @@ -1525,7 +1525,7 @@ nach </message> <message> <source>Incorrectly specified signal assignment</source> - <translation></translation> + <translation>Angegebene Signalzuweisung ist nicht korrekt</translation> </message> <message> <source>Invalid property assignment: number expected</source> @@ -1573,7 +1573,7 @@ nach </message> <message> <source>Unexpected object assignment</source> - <translation>Zuweisung des Objekts nicht zulässig</translation> + <translation>Unerwartete Zuweisung des Objekts</translation> </message> <message> <source>Cannot assign object to list</source> @@ -1669,7 +1669,7 @@ nach </message> <message> <source>IDs must start with a letter or underscore</source> - <translation>Id-Werte müssen mit einem Buchstaben oder dem Zeichen '_' beginnen</translation> + <translation>Id-Werte müssen mit einem Buchstaben oder Unterstrich beginnen</translation> </message> <message> <source>IDs must contain only letters, numbers, and underscores</source> @@ -1726,7 +1726,7 @@ nach <name>QDeclarativeConnections</name> <message> <source>Cannot assign to non-existent property "%1"</source> - <translation>Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens '%1" existiert</translation> + <translation>Es kann keine Zuweisung erfolgen, da keine Eigenschaft des Namens "%1" existiert</translation> </message> <message> <source>Connections: nested objects not allowed</source> @@ -1757,7 +1757,7 @@ nach </message> <message> <source>SQL transaction failed</source> - <translation>Die SQL-Transaktion schlug fehl</translation> + <translation>Die SQL-Transaktion ist fehlgeschlagen</translation> </message> <message> <source>transaction: missing callback</source> @@ -1787,7 +1787,7 @@ nach </message> <message> <source>plugin cannot be loaded for module "%1": %2</source> - <translation>Das Plugin des Moduls "%1" konnte nicht geladen werden: %2</translation> + <translation>Das Plugin des Moduls "%1" kann nicht geladen werden: %2</translation> </message> <message> <source>module "%1" plugin "%2" not found</source> @@ -1819,7 +1819,7 @@ nach </message> <message> <source>local directory</source> - <translation>Lokales Verzeichnis'</translation> + <translation>Lokales Verzeichnis</translation> </message> <message> <source>is ambiguous. Found in %1 and in %2</source> @@ -1948,7 +1948,7 @@ nach </message> <message> <source>Illegal escape sequence</source> - <translation>Ungültiges Escape-Sequenz</translation> + <translation>Ungültige Escape-Sequenz</translation> </message> <message> <source>Illegal unicode escape sequence</source> @@ -1976,7 +1976,7 @@ nach </message> <message> <source>Unterminated regular expression backslash sequence</source> - <translation>Regulärer Ausdruck nicht abgeschlossen</translation> + <translation>Backslash-Sequenz in regulärem Ausdruck nicht abgeschlossen</translation> </message> <message> <source>Unterminated regular expression class</source> @@ -2058,7 +2058,7 @@ nach <name>QDeclarativePixmap</name> <message> <source>Error decoding: %1: %2</source> - <translation>Fehler beim Decodieren: %1: %2</translation> + <translation>Fehler beim Dekodieren: %1: %2</translation> </message> <message> <source>Failed to get image from provider: %1</source> @@ -2107,7 +2107,7 @@ nach </message> <message> <source>Cannot assign to read-only property "%1"</source> - <translation>Die Eigenschaft '%1" ist schreibgeschützt und kann daher nicht zugewiesen werden</translation> + <translation>Die Eigenschaft "%1" ist schreibgeschützt und kann daher nicht zugewiesen werden</translation> </message> </context> <context> @@ -2118,7 +2118,7 @@ nach </message> <message> <source>Could not instantiate cursor delegate</source> - <translation>Cursor-Delegate konnte angelegt werden</translation> + <translation>Cursor-Delegate konnte nicht instanziiert werden</translation> </message> </context> <context> @@ -2163,7 +2163,7 @@ nach </message> <message> <source>Cannot assign value %1 to property %2</source> - <translation>Der Wert '%1' kann nicht der Eigenschaft %2 zugewiesen werden</translation> + <translation>Der Wert '%1' kann der Eigenschaft %2 nicht zugewiesen werden</translation> </message> <message> <source>Cannot assign object type %1 with no default method</source> @@ -2979,13 +2979,13 @@ Möchten Sie die Datei trotzdem löschen?</translation> <message> <source>Connecting to host failed: %1</source> - <translation>Verbindung mit Rechner schlug fehl: + <translation>Verbindung mit Rechner ist fehlgeschlagen: %1</translation> </message> <message> <source>Login failed: %1</source> - <translation>Anmeldung schlug fehl: + <translation>Anmeldung ist fehlgeschlagen: %1</translation> </message> <message> @@ -2997,37 +2997,37 @@ Möchten Sie die Datei trotzdem löschen?</translation> <message> <source>Changing directory failed: %1</source> - <translation>Ändern des Verzeichnisses schlug fehl: + <translation>Ändern des Verzeichnisses ist fehlgeschlagen: %1</translation> </message> <message> <source>Downloading file failed: %1</source> - <translation>Herunterladen der Datei schlug fehl: + <translation>Herunterladen der Datei ist fehlgeschlagen: %1</translation> </message> <message> <source>Uploading file failed: %1</source> - <translation>Hochladen der Datei schlug fehl: + <translation>Hochladen der Datei ist fehlgeschlagen: %1</translation> </message> <message> <source>Removing file failed: %1</source> - <translation>Löschen der Datei schlug fehl: + <translation>Löschen der Datei ist fehlgeschlagen: %1</translation> </message> <message> <source>Creating directory failed: %1</source> - <translation>Erstellen des Verzeichnisses schlug fehl: + <translation>Erstellen des Verzeichnisses ist fehlgeschlagen: %1</translation> </message> <message> <source>Removing directory failed: %1</source> - <translation>Löschen des Verzeichnisses schlug fehl: + <translation>Löschen des Verzeichnisses ist fehlgeschlagen: %1</translation> </message> <message> @@ -3282,7 +3282,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>Could not allocate statement</source> - <translation>Die Allokation des Befehls schlug fehl</translation> + <translation>Die Allokation des Befehls ist fehlgeschlagen</translation> </message> <message> <source>Could not prepare statement</source> @@ -3916,7 +3916,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>Logging in to %1 failed: authentication required</source> - <translation>Die Anmeldung bei %1 schlug fehl: Es ist eine Authentifizierung erforderlich</translation> + <translation>Die Anmeldung bei %1 ist fehlgeschlagen: Es ist eine Authentifizierung erforderlich</translation> </message> <message> <source>Error while downloading %1: %2</source> @@ -3957,7 +3957,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>Temporary network failure.</source> - <translation>Das Netzwerk ist zur Zeit ausgefallen.</translation> + <translation>Das Netzwerk ist zurzeit ausgefallen.</translation> </message> </context> <context> @@ -3982,7 +3982,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>The session was aborted by the user or system.</source> - <translation>Die Verbindung wurde vom Nutzer oder vom Betriebssystem unterbrochen.</translation> + <translation>Die Verbindung wurde vom Benutzer oder vom Betriebssystem unterbrochen.</translation> </message> <message> <source>The requested operation is not supported by the system.</source> @@ -4002,7 +4002,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>Session aborted by user or system</source> - <translation>Die Verbindung wurde vom Nutzer oder vom Betriebssystem unterbrochen</translation> + <translation>Die Verbindung wurde vom Benutzer oder vom Betriebssystem unterbrochen</translation> </message> <message> <source>Unidentified Error</source> @@ -4049,7 +4049,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>Unable to alloc statement</source> - <translation>Die Allokation des Befehls schlug fehl</translation> + <translation>Die Allokation des Befehls ist fehlgeschlagen</translation> </message> <message> <source>Unable to prepare statement</source> @@ -4131,7 +4131,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>Unable to fetch previous</source> - <translation>Der vorangegangene Datensatz kann nicht abgeholt werden</translation> + <translation>Der vorherige Datensatz konnte nicht abgeholt werden</translation> </message> </context> <context> @@ -4146,7 +4146,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>PulseAudio Sound Server</source> - <translation>PulseAudio Sound Server</translation> + <translation>PulseAudio-Sound-Server</translation> </message> </context> <context> @@ -4180,7 +4180,7 @@ Möchten Sie die Datei trotzdem löschen?</translation> </message> <message> <source>Unable to subscribe</source> - <translation>Die Registrierung schlug fehl</translation> + <translation>Die Registrierung ist fehlgeschlagen</translation> </message> <message> <source>Unable to unsubscribe</source> @@ -4881,11 +4881,11 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Error reading from process</source> - <translation>Das Lesen vom Prozess schlug fehl</translation> + <translation>Das Lesen vom Prozess ist fehlgeschlagen</translation> </message> <message> <source>Error writing to process</source> - <translation>Das Schreiben zum Prozess schlug fehl</translation> + <translation>Das Schreiben zum Prozess ist fehlgeschlagen</translation> </message> <message> <source>Process crashed</source> @@ -4897,7 +4897,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Process failed to start: %1</source> - <translation>Das Starten des Prozesses schlug fehl: %1</translation> + <translation>Das Starten des Prozesses ist fehlgeschlagen: %1</translation> </message> </context> <context> @@ -5430,7 +5430,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>%1: ftok failed</source> - <translation>%1: ftok-Aufruf schlug fehl</translation> + <translation>%1: ftok-Aufruf ist fehlgeschlagen</translation> </message> <message> <source>%1: unable to make key</source> @@ -5462,7 +5462,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>%1: size query failed</source> - <translation>%1: Die Abfrage der Größe schlug fehl</translation> + <translation>%1: Die Abfrage der Größe ist fehlgeschlagen</translation> </message> <message> <source>%1: unable to set key on lock</source> @@ -5648,7 +5648,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <message> <source>Toggle Media Play/Pause</source> <extracomment>Media player button to toggle between playing and paused</extracomment> - <translation>Pause</translation> + <translation>Wiedergabe/Pause</translation> </message> <message> <source>Favorites</source> @@ -6279,51 +6279,51 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Previous Candidate</source> - <translation>Vorangegangener Vorschlag</translation> + <translation>Vorheriger Vorschlag</translation> </message> <message> <source>Hangul</source> - <translation>Hangul</translation> + <translation>Hangeul</translation> </message> <message> <source>Hangul Start</source> - <translation>Hangul Anfang</translation> + <translation>Hangeul Anfang</translation> </message> <message> <source>Hangul End</source> - <translation>Hangul Ende</translation> + <translation>Hangeul Ende</translation> </message> <message> <source>Hangul Hanja</source> - <translation>Hangul Hanja</translation> + <translation>Hangeul-Hanja</translation> </message> <message> <source>Hangul Jamo</source> - <translation>Hangul Jamo</translation> + <translation>Hangeul-Jamo</translation> </message> <message> <source>Hangul Romaja</source> - <translation>Hangul Romaja</translation> + <translation>Hangeul-Romaja</translation> </message> <message> <source>Hangul Jeonja</source> - <translation>Hangul Jeonja</translation> + <translation>Hangeul-Jeonja</translation> </message> <message> <source>Hangul Banja</source> - <translation>Hangul Banja</translation> + <translation>Hangeul-Banja</translation> </message> <message> <source>Hangul PreHanja</source> - <translation>Hangul PreHanja</translation> + <translation>Hangeul-PreHanja</translation> </message> <message> <source>Hangul PostHanja</source> - <translation>Hangul PostHanja</translation> + <translation>Hangeul-PostHanja</translation> </message> <message> <source>Hangul Special</source> - <translation>Hangul Special</translation> + <translation>Hangeul Special</translation> </message> <message> <source>Ctrl</source> @@ -6397,15 +6397,15 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Proxy authentication failed</source> - <translation>Die Authentifizierung beim Proxy-Server schlug fehl</translation> + <translation>Die Authentifizierung beim Proxy-Server ist fehlgeschlagen</translation> </message> <message> <source>Proxy authentication failed: %1</source> - <translation>Die Authentifizierung beim Proxy-Server schlug fehl: %1</translation> + <translation>Die Authentifizierung beim Proxy-Server ist fehlgeschlagen: %1</translation> </message> <message> <source>SOCKS version 5 protocol error</source> - <translation>Protokoll-Fehler (SOCKS version 5)</translation> + <translation>Protokoll-Fehler (SOCKS Version 5)</translation> </message> <message> <source>General SOCKSv5 server failure</source> @@ -7428,27 +7428,27 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Move the cursor to the next character</source> - <translation>Positionsmarke auf folgendes Zeichen setzen</translation> + <translation>Positionsmarke auf nächstes Zeichen setzen</translation> </message> <message> <source>Move the cursor to the previous character</source> - <translation>Positionsmarke auf vorangehendes Zeichen setzen</translation> + <translation>Positionsmarke auf vorheriges Zeichen setzen</translation> </message> <message> <source>Move the cursor to the next word</source> - <translation>Positionsmarke auf folgendes Wort setzen</translation> + <translation>Positionsmarke auf nächstes Wort setzen</translation> </message> <message> <source>Move the cursor to the previous word</source> - <translation>Positionsmarke auf vorangehendes Wort setzen</translation> + <translation>Positionsmarke auf vorherige Wort setzen</translation> </message> <message> <source>Move the cursor to the next line</source> - <translation>Positionsmarke auf folgende Zeile setzen</translation> + <translation>Positionsmarke auf nächste Zeile setzen</translation> </message> <message> <source>Move the cursor to the previous line</source> - <translation>Positionsmarke auf vorangehende Zeile setzen</translation> + <translation>Positionsmarke auf vorherige Zeile setzen</translation> </message> <message> <source>Move the cursor to the start of the line</source> @@ -7468,11 +7468,11 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Move the cursor to the start of the document</source> - <translation>Positionsmarke auf Anfang des Dokumentes setzen</translation> + <translation>Positionsmarke auf Anfang des Dokuments setzen</translation> </message> <message> <source>Move the cursor to the end of the document</source> - <translation>Positionsmarke auf Ende des Dokumentes setzen</translation> + <translation>Positionsmarke auf Ende des Dokuments setzen</translation> </message> <message> <source>Select all</source> @@ -7799,7 +7799,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> - <translation>fehlende Encoding-Deklaration oder Standalone-Deklaration beim Parsen der XML-Deklaration</translation> + <translation>fehlende Kodierung-Deklaration oder Standalone-Deklaration beim Parsen der XML-Deklaration</translation> </message> <message> <source>standalone declaration expected while reading the XML declaration</source> @@ -7818,7 +7818,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Unknown location</source> - <translation>unbekannt</translation> + <translation>Unbekannter Ort</translation> </message> <message> <source>Error %1 in %2, at line %3, column %4: %5</source> @@ -7833,7 +7833,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> <name>QXmlStream</name> <message> <source>Extra content at end of document.</source> - <translation>Überzähliger Inhalt nach Ende des Dokumentes.</translation> + <translation>Überzähliger Inhalt nach Ende des Dokuments.</translation> </message> <message> <source>Invalid entity value.</source> @@ -7869,11 +7869,11 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>%1 is an invalid encoding name.</source> - <translation>%1 ist kein gültiger Name für das Encoding.</translation> + <translation>%1 ist kein gültiger Name für die Kodierung.</translation> </message> <message> <source>Encoding %1 is unsupported</source> - <translation>Das Encoding %1 wird nicht unterstützt</translation> + <translation>Die Kodierung %1 wird nicht unterstützt</translation> </message> <message> <source>Standalone accepts only yes or no.</source> @@ -7965,7 +7965,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>The standalone pseudo attribute must appear after the encoding.</source> - <translation>Das Standalone-Pseudoattribut muss dem Encoding unmittelbar folgen.</translation> + <translation>Das Standalone-Pseudoattribut muss der Kodierung unmittelbar folgen.</translation> </message> <message> <source>%1 is an invalid PUBLIC identifier.</source> @@ -7988,7 +7988,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> - <translation>Der effektive Boolesche Wert einer Sequenz aus zwei oder mehreren atomaren Werten kann nicht berechnet werden.</translation> + <translation>Der effektive boolesche Wert einer Sequenz aus zwei oder mehreren atomaren Werten kann nicht berechnet werden.</translation> </message> <message> <source>The data of a processing instruction cannot contain the string %1</source> @@ -8000,7 +8000,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>%1 is not a valid XML 1.0 character.</source> - <translation>%1 ist kein gültiges XML 1.0 Zeichen.</translation> + <translation>%1 ist kein gültiges XML-1.0-Zeichen.</translation> </message> <message> <source>%1 was called.</source> @@ -8220,7 +8220,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>A value of type %1 cannot have an Effective Boolean Value.</source> - <translation>Ein Wert des Typs %1 kann keinen effektiven Booleschen Wert haben.</translation> + <translation>Ein Wert des Typs %1 kann keinen effektiven booleschen Wert haben.</translation> </message> <message> <source>Value %1 of type %2 exceeds maximum (%3).</source> @@ -8264,7 +8264,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>A comment cannot contain %1</source> - <translation>Ein Kommentar darf nicht'%1 enthalten</translation> + <translation>Ein Kommentar darf %1 nicht enthalten</translation> </message> <message> <source>A comment cannot end with a %1.</source> @@ -8284,7 +8284,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> - <translation>Werte des Typs %1 dürfen keine Prädikate sein. Für Prädikate sind nur numerische oder effektiv Boolesche Typen zulässig.</translation> + <translation>Werte des Typs %1 dürfen keine Prädikate sein. Für Prädikate sind nur numerische oder effektive boolesche Typen zulässig.</translation> </message> <message> <source>A positional predicate must evaluate to a single numeric value.</source> @@ -8292,7 +8292,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source> - <translation>Der Zielname einer Processing-Anweisung kann nicht %1 (unabhängig von Groß/Kleinschreibung sein). %2 ist daher ungültig.</translation> + <translation>Der Zielname einer Processing-Anweisung kann nicht %1 (unabhängig von Groß/Kleinschreibung) sein. %2 ist daher ungültig.</translation> </message> <message> <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> @@ -8570,15 +8570,15 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>%1 is an unsupported encoding.</source> - <translation>Das Encoding %1 wird nicht unterstützt.</translation> + <translation>Die Kodierung %1 wird nicht unterstützt.</translation> </message> <message> <source>%1 contains octets which are disallowed in the requested encoding %2.</source> - <translation>%1 enthält Oktette, die im Encoding %2 nicht zulässig sind.</translation> + <translation>%1 enthält Oktette, die in der Kodierung %2 nicht zulässig sind.</translation> </message> <message> <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> - <translation>Der Code-Punkt %1 aus %2 mit Encoding %3 ist kein gültiges XML-Zeichen.</translation> + <translation>Der Code-Punkt %1 aus %2 mit der Kodierung %3 ist kein gültiges XML-Zeichen.</translation> </message> <message> <source>Ambiguous rule match.</source> @@ -9562,7 +9562,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation> </message> <message> <source>Boolean content does not match pattern facet.</source> - <translation>Der Boolesche Wert entspricht nicht der Suchmusterfacette.</translation> + <translation>Der boolesche Wert entspricht nicht der Suchmusterfacette.</translation> </message> <message> <source>Binary content does not match the length facet.</source> -- cgit v0.12 From d7255d7bf39ba681ff46fcb95a54d25793cce756 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 11 Jan 2011 15:14:31 +0100 Subject: installation of translations is now dealt with by translations.pro Reviewed-by: mariusSO --- projects.pro | 5 ----- 1 file changed, 5 deletions(-) diff --git a/projects.pro b/projects.pro index f94e1de..2e31e9a 100644 --- a/projects.pro +++ b/projects.pro @@ -143,11 +143,6 @@ CONFIG -= qt ### installations #### -#translations -translations.path=$$[QT_INSTALL_TRANSLATIONS] -translations.files = $$QT_SOURCE_TREE/translations/*.qm -INSTALLS += translations - #qmake qmake.path=$$[QT_INSTALL_BINS] win32 { -- cgit v0.12 From 4bc1261774b8c874440e29807888b6a95cc19b1f Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Mon, 10 Jan 2011 19:58:49 +0100 Subject: don't claim declarative debugging support without having declarative Task-number: QTBUG-15228 Reviewed-by: mariusSO --- configure | 4 +++- tools/configure/configureapp.cpp | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 0394be9..128f735 100755 --- a/configure +++ b/configure @@ -8261,7 +8261,9 @@ if [ "$CFG_WEBKIT" != "no" ]; then fi fi echo "Declarative module ..... $CFG_DECLARATIVE" -echo "Declarative debugging ...$CFG_DECLARATIVE_DEBUG" +if [ "$CFG_DECLARATIVE" = "yes" ]; then + echo "Declarative debugging ...$CFG_DECLARATIVE_DEBUG" +fi echo "Support for S60 ........ $CFG_S60" echo "Symbian DEF files ...... $CFG_SYMBIAN_DEFFILES" echo "STL support ............ $CFG_STL" diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 9dda3bd..c7df09d 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -3440,8 +3440,12 @@ void Configure::displayConfig() webkit = "yes (debug)"; cout << "WebKit support.............." << webkit << endl; } - cout << "Declarative support........." << dictionary[ "DECLARATIVE" ] << endl; - cout << "Declarative debugging......." << dictionary[ "DECLARATIVE_DEBUG" ] << endl; + { + QString declarative = dictionary[ "DECLARATIVE" ]; + cout << "Declarative support........." << declarative << endl; + if (declarative == "yes") + cout << "Declarative debugging......." << dictionary[ "DECLARATIVE_DEBUG" ] << endl; + } cout << "QtScript support............" << dictionary[ "SCRIPT" ] << endl; cout << "QtScriptTools support......." << dictionary[ "SCRIPTTOOLS" ] << endl; cout << "Graphics System............." << dictionary[ "GRAPHICS_SYSTEM" ] << endl; -- cgit v0.12 From 0953ee31dba532603fb7dfbde78c99aafb048bef Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Mon, 10 Jan 2011 20:09:24 +0100 Subject: fix -enable-stdcall-fixup usage the leading "-Wl," was apparently accidentally split off to the wrong line. Task-number: QTBUG-15391 Reviewed-by: mariusSO --- mkspecs/win32-g++/qmake.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mkspecs/win32-g++/qmake.conf b/mkspecs/win32-g++/qmake.conf index ec216aa..2d9833b 100644 --- a/mkspecs/win32-g++/qmake.conf +++ b/mkspecs/win32-g++/qmake.conf @@ -52,8 +52,8 @@ QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< QMAKE_LINK = g++ QMAKE_LINK_C = gcc -QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl +QMAKE_LFLAGS = -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc +QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads QMAKE_LFLAGS_EXCEPTIONS_OFF = QMAKE_LFLAGS_RELEASE = -Wl,-s QMAKE_LFLAGS_DEBUG = -- cgit v0.12 From 7ec1c27e662dfd4393491f90bfcb9c868cc0a23f Mon Sep 17 00:00:00 2001 From: Mark Brand <mabrand@mabrand.nl> Date: Mon, 10 Jan 2011 20:21:05 +0100 Subject: Fix static build on Windows with MinGW. Q_DECL_IMPORT is still __declspec(dllimport), which is unsuitable for static code. Commit edbc656b changed Q_DECL_IMPORT_IMPORT to Q_CORE_EXPORT when declaring QtCore functions in svg. Now we change Q_DECL_IMPORT to Q_GUI_EXPORT when declaring QtGui functions into opengl and openvg. Also removed the redundant keyword "extern" from the function declarations. Merge-request: 2540 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Reviewed-by: mariusSO --- src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp | 4 ++-- src/opengl/qglframebufferobject.cpp | 4 ++-- src/opengl/qglpixelbuffer.cpp | 4 ++-- src/opengl/qglpixmapfilter.cpp | 6 +++--- src/opengl/qpaintengine_opengl.cpp | 2 +- src/opengl/qpixmapdata_gl.cpp | 4 ++-- src/openvg/qpaintengine_vg.cpp | 8 ++++---- src/openvg/qpixmapdata_vg.cpp | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index 9ab8d2e..ad2852e 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -102,7 +102,7 @@ extern Q_GUI_EXPORT bool qt_cleartype_enabled; extern bool qt_applefontsmoothing_enabled; #endif -Q_DECL_IMPORT extern QImage qt_imageForBrush(int brushStyle, bool invert); +Q_GUI_EXPORT QImage qt_imageForBrush(int brushStyle, bool invert); ////////////////////////////////// Private Methods ////////////////////////////////////////// @@ -1154,7 +1154,7 @@ void QGL2PaintEngineEx::fill(const QVectorPath &path, const QBrush &brush) d->fill(path); } -extern Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale); // qtransform.cpp +Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale); // qtransform.cpp void QGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen) diff --git a/src/opengl/qglframebufferobject.cpp b/src/opengl/qglframebufferobject.cpp index adf3ceb..6161d9b 100644 --- a/src/opengl/qglframebufferobject.cpp +++ b/src/opengl/qglframebufferobject.cpp @@ -1171,8 +1171,8 @@ void QGLFramebufferObject::drawTexture(const QPointF &point, QMacCompatGLuint te } #endif -Q_DECL_IMPORT extern int qt_defaultDpiX(); -Q_DECL_IMPORT extern int qt_defaultDpiY(); +Q_GUI_EXPORT int qt_defaultDpiX(); +Q_GUI_EXPORT int qt_defaultDpiY(); /*! \reimp */ int QGLFramebufferObject::metric(PaintDeviceMetric metric) const diff --git a/src/opengl/qglpixelbuffer.cpp b/src/opengl/qglpixelbuffer.cpp index 735590f..61bce23 100644 --- a/src/opengl/qglpixelbuffer.cpp +++ b/src/opengl/qglpixelbuffer.cpp @@ -416,8 +416,8 @@ QPaintEngine *QGLPixelBuffer::paintEngine() const #endif } -Q_DECL_IMPORT extern int qt_defaultDpiX(); -Q_DECL_IMPORT extern int qt_defaultDpiY(); +Q_GUI_EXPORT int qt_defaultDpiX(); +Q_GUI_EXPORT int qt_defaultDpiY(); /*! \reimp */ int QGLPixelBuffer::metric(PaintDeviceMetric metric) const diff --git a/src/opengl/qglpixmapfilter.cpp b/src/opengl/qglpixmapfilter.cpp index 0369d56..2187deb 100644 --- a/src/opengl/qglpixmapfilter.cpp +++ b/src/opengl/qglpixmapfilter.cpp @@ -63,8 +63,8 @@ QT_BEGIN_NAMESPACE // qpixmapfilter.cpp -Q_DECL_IMPORT void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed = 0); -Q_DECL_IMPORT QImage qt_halfScaled(const QImage &source); +Q_GUI_EXPORT void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed = 0); +Q_GUI_EXPORT QImage qt_halfScaled(const QImage &source); void QGLPixmapFilterBase::bindTexture(const QPixmap &src) const { @@ -436,7 +436,7 @@ static inline uint nextMultiple(uint x, uint multiplier) return x + multiplier - mod; } -Q_DECL_IMPORT void qt_memrotate90_gl(const quint32 *src, int srcWidth, int srcHeight, int srcStride, +Q_GUI_EXPORT void qt_memrotate90_gl(const quint32 *src, int srcWidth, int srcHeight, int srcStride, quint32 *dest, int dstStride); bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const QPixmap &src, const QRectF &) const diff --git a/src/opengl/qpaintengine_opengl.cpp b/src/opengl/qpaintengine_opengl.cpp index 2f1b8fd..2c01ac4 100644 --- a/src/opengl/qpaintengine_opengl.cpp +++ b/src/opengl/qpaintengine_opengl.cpp @@ -79,7 +79,7 @@ QT_BEGIN_NAMESPACE -Q_DECL_IMPORT extern QImage qt_imageForBrush(int brushStyle, bool invert); //in qbrush.cpp +Q_GUI_EXPORT QImage qt_imageForBrush(int brushStyle, bool invert); //in qbrush.cpp #ifdef QT_MAC_USE_COCOA extern void *qt_current_nsopengl_context(); // qgl_mac.mm #endif diff --git a/src/opengl/qpixmapdata_gl.cpp b/src/opengl/qpixmapdata_gl.cpp index 3549f9d..9980f2d 100644 --- a/src/opengl/qpixmapdata_gl.cpp +++ b/src/opengl/qpixmapdata_gl.cpp @@ -739,8 +739,8 @@ QGLTexture* QGLPixmapData::texture() const return &m_texture; } -Q_DECL_IMPORT extern int qt_defaultDpiX(); -Q_DECL_IMPORT extern int qt_defaultDpiY(); +Q_GUI_EXPORT int qt_defaultDpiX(); +Q_GUI_EXPORT int qt_defaultDpiY(); int QGLPixmapData::metric(QPaintDevice::PaintDeviceMetric metric) const { diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index 09cbc36..b90811d 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -77,8 +77,8 @@ static const qreal aliasedCoordinateDelta = 0.5 - 0.015625; #if !defined(QVG_NO_DRAW_GLYPHS) -Q_DECL_IMPORT extern int qt_defaultDpiX(); -Q_DECL_IMPORT extern int qt_defaultDpiY(); +Q_GUI_EXPORT int qt_defaultDpiX(); +Q_GUI_EXPORT int qt_defaultDpiY(); class QVGPaintEnginePrivate; @@ -526,7 +526,7 @@ void QVGPaintEnginePrivate::setTransform vgLoadMatrix(mat); } -Q_DECL_IMPORT extern bool qt_scaleForTransform(const QTransform &transform, qreal *scale); +Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale); void QVGPaintEnginePrivate::updateTransform(QPaintDevice *pdev) { @@ -994,7 +994,7 @@ VGPath QVGPaintEnginePrivate::roundedRectPath(const QRectF &rect, qreal xRadius, return vgpath; } -Q_DECL_IMPORT extern QImage qt_imageForBrush(int style, bool invert); +Q_GUI_EXPORT QImage qt_imageForBrush(int style, bool invert); static QImage colorizeBitmap(const QImage &image, const QColor &color) { diff --git a/src/openvg/qpixmapdata_vg.cpp b/src/openvg/qpixmapdata_vg.cpp index 3f768fd..e4b1d02 100644 --- a/src/openvg/qpixmapdata_vg.cpp +++ b/src/openvg/qpixmapdata_vg.cpp @@ -404,8 +404,8 @@ void QVGPixmapData::reclaimImages() destroyImages(); } -Q_DECL_IMPORT extern int qt_defaultDpiX(); -Q_DECL_IMPORT extern int qt_defaultDpiY(); +Q_GUI_EXPORT int qt_defaultDpiX(); +Q_GUI_EXPORT int qt_defaultDpiY(); int QVGPixmapData::metric(QPaintDevice::PaintDeviceMetric metric) const { -- cgit v0.12 From 60b591108cbe4550d38fa03245cb9c4653778b47 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Mon, 10 Jan 2011 20:41:48 +0100 Subject: accept -declarative-debug under unix Task-number: QTBUG-15626 Reviewed-by: mariusSO --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 128f735..b33fc14 100755 --- a/configure +++ b/configure @@ -962,7 +962,7 @@ while [ "$#" -gt 0 ]; do VAL=no ;; #Qt style yes options - -incremental|-qvfb|-profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-egl|-reduce-exports|-pch|-separate-debug-info|-stl|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-nis|-qdbus|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-qt3support|-debug-and-release|-exceptions|-cocoa|-carbon|-universal|-prefix-install|-silent|-armfpa|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-ptmalloc|-xmlpatterns|-phonon|-phonon-backend|-multimedia|-audio-backend|-svg|-declarative|-javascript-jit|-script|-scripttools|-rpath|-force-pkg-config|-s60|-usedeffiles) + -incremental|-qvfb|-profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-egl|-reduce-exports|-pch|-separate-debug-info|-stl|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-nis|-qdbus|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-qt3support|-debug-and-release|-exceptions|-cocoa|-carbon|-universal|-prefix-install|-silent|-armfpa|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-ptmalloc|-xmlpatterns|-phonon|-phonon-backend|-multimedia|-audio-backend|-svg|-declarative|-declarative-debug|-javascript-jit|-script|-scripttools|-rpath|-force-pkg-config|-s60|-usedeffiles) VAR=`echo $1 | sed "s,^-\(.*\),\1,"` VAL=yes ;; @@ -3560,7 +3560,7 @@ Usage: $relconf [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir [-no-gtkstyle] [-gtkstyle] [-no-svg] [-svg] [-no-webkit] [-webkit] [-webkit-debug] [-no-javascript-jit] [-javascript-jit] [-no-script] [-script] [-no-scripttools] [-scripttools] - [-no-declarative] [-declarative][-no-declarative-debug] [-declarative-debug] + [-no-declarative] [-declarative] [-no-declarative-debug] [-declarative-debug] [additional platform specific options (see below)] -- cgit v0.12 From 66242e0e492137e051273055f566c3edd42c07e9 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 11 Jan 2011 12:43:35 +0100 Subject: clean up platform detection logic it's pointless to check which files are present, as we only have all-platform packages now. Task-number: QTBUG-15685 Reviewed-by: mariusSO --- configure | 60 ++++++++++++------------------------------------------------ 1 file changed, 12 insertions(+), 48 deletions(-) diff --git a/configure b/configure index b33fc14..a455ad3 100755 --- a/configure +++ b/configure @@ -185,27 +185,11 @@ fi #------------------------------------------------------------------------------- PLATFORM_X11=no -PLATFORM_MAC=no -PLATFORM_QWS=no - -if [ -f "$relpath"/src/gui/kernel/qapplication_mac.mm ] && [ -d /System/Library/Frameworks/Carbon.framework ]; then - # Qt/Mac - # ~ the Carbon SDK exists - # ~ src/gui/base/qapplication_mac.cpp is present - # ~ this is the internal edition and Qt/Mac sources exist +PLATFORM_QWS=maybe +if [ -d /System/Library/Frameworks/Carbon.framework ]; then PLATFORM_MAC=maybe -elif [ -f "$relpath"/src/gui/kernel/qapplication_qws.cpp ]; then - # Qt Embedded - # ~ src/gui/base/qapplication_qws.cpp is present - # ~ this is the free or commercial edition - # ~ this is the internal edition and Qt Embedded is explicitly enabled - if [ -f "$relpath"/src/gui/kernel/qapplication_mac.mm ]; then - # This is a depot build, or an all-platforms package - PLATFORM_QWS=maybe - else - # This must be the embedded package, since the Qt/Mac source files are not present - PLATFORM_QWS=yes - fi +else + PLATFORM_MAC=no fi #----------------------------------------------------------------------------- @@ -314,16 +298,9 @@ earlyArgParse() case "$VAR" in embedded) CFG_EMBEDDED="$VAL" - if [ "$PLATFORM_QWS" != "no" ]; then - if [ "$PLATFORM_QWS" = "maybe" ]; then - PLATFORM_X11=no - PLATFORM_MAC=no - PLATFORM_QWS=yes - fi - else - echo "No license exists to enable Qt for Embedded Linux. Disabling." - CFG_EMBEDDED=no - fi + PLATFORM_X11=no + PLATFORM_MAC=no + PLATFORM_QWS=yes ;; developer-build) CFG_DEV="yes" @@ -1235,16 +1212,9 @@ while [ "$#" -gt 0 ]; do ;; embedded) CFG_EMBEDDED="$VAL" - if [ "$PLATFORM_QWS" != "no" ]; then - if [ "$PLATFORM_QWS" = "maybe" ]; then - PLATFORM_X11=no - PLATFORM_MAC=no - PLATFORM_QWS=yes - fi - else - echo "No license exists to enable Qt for Embedded Linux. Disabling." - CFG_EMBEDDED=no - fi + PLATFORM_X11=no + PLATFORM_MAC=no + PLATFORM_QWS=yes ;; sse) if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then @@ -1349,14 +1319,8 @@ while [ "$#" -gt 0 ]; do CFG_BUILD_PARTS="$CFG_BUILD_PARTS $VAL" ;; x11) - if [ "$PLATFORM_MAC" = "yes" ]; then - PLATFORM_MAC=no - elif [ "$PLATFORM_QWS" = "yes" ]; then - PLATFORM_QWS=no - fi - if [ "$CFG_FRAMEWORK" = "auto" ]; then - CFG_FRAMEWORK=no - fi + PLATFORM_MAC=no + PLATFORM_QWS=no PLATFORM_X11=yes ;; sdk) -- cgit v0.12 From a05ece41b9adbbe2f5aebd305e84e29693a39bcf Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 11 Jan 2011 13:28:40 +0100 Subject: make qtlibinfix apply to QT_INSTALL_TRANSLATIONS the unix configure already got it right Task-number: QTBUG-15978 Reviewed-by: Alessandro Portale Reviewed-by: mariusSO --- tools/configure/configureapp.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index c7df09d..d2be581 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -1031,6 +1031,8 @@ void Configure::parseCmdLine() QString("\\resource\\qt%1\\plugins").arg(dictionary[ "QT_LIBINFIX" ]); dictionary[ "QT_INSTALL_IMPORTS" ] = QString("\\resource\\qt%1\\imports").arg(dictionary[ "QT_LIBINFIX" ]); + dictionary[ "QT_INSTALL_TRANSLATIONS" ] = + QString("\\resource\\qt%1\\translations").arg(dictionary[ "QT_LIBINFIX" ]); } } else if (configCmdLine.at(i) == "-D") { ++i; -- cgit v0.12 From c8fb3f90cf3834a723ae76de95831995459ec94e Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 11 Jan 2011 13:46:36 +0100 Subject: don't ignore return code from syncqt Task-number: QTBUG-16176 Reviewed-by: mariusSO --- configure | 4 ++-- tools/configure/configureapp.cpp | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/configure b/configure index a455ad3..6c50484 100755 --- a/configure +++ b/configure @@ -4524,9 +4524,9 @@ if [ -n "$PERL" ] && [ -x "$relpath/bin/syncqt" ]; then SYNCQT_OPTS= [ "$CFG_DEV" = "yes" ] && SYNCQT_OPTS="$SYNCQT_OPTS -check-includes" if [ "$OPT_SHADOW" = "yes" ]; then - "$outpath/bin/syncqt" $SYNCQT_OPTS + "$outpath/bin/syncqt" $SYNCQT_OPTS || exit 1 elif [ "$CFG_DEV" = "yes" ] || [ ! -d $relpath/include ] || [ -d $relpath/.git ]; then - QTDIR="$relpath" perl "$outpath/bin/syncqt" $SYNCQT_OPTS + QTDIR="$relpath" perl "$outpath/bin/syncqt" $SYNCQT_OPTS || exit 1 fi fi diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index d2be581..8fa03ab 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -3578,7 +3578,11 @@ void Configure::generateHeaders() QStringList env; env += QString("QTDIR=" + sourcePath); env += QString("PATH=" + buildPath + "/bin/;" + qgetenv("PATH")); - Environment::execute(args, env, QStringList()); + int retc = Environment::execute(args, env, QStringList()); + if (retc) { + cout << "syncqt failed, return code " << retc << endl << endl; + dictionary["DONE"] = "error"; + } } } -- cgit v0.12 From b7a1c07025aa6896f6b6482feb2df7fbc00f4d32 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Thu, 13 Jan 2011 19:53:39 +0100 Subject: make sure Option::dir_sep is initialized in time querying $$DIR_SEPARATOR (possibly indirectly via $$QMAKE_DIR_SEP) may happen before querying any os scopes, so better make it initialize the host mode explicitly. loading features theoretically needs an initialized dir_sep as well (to detect relative paths), so take care of that as well. Task-number: QTBUG-10633 Reviewed-by: mariusSO --- qmake/project.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qmake/project.cpp b/qmake/project.cpp index 2cf7393..8d8d9e0 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -1642,6 +1642,7 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QMap<QString, QStringL if(flags & IncludeFlagFeature) { if(!file.endsWith(Option::prf_ext)) file += Option::prf_ext; + validateModes(); // init dir_sep if(file.indexOf(Option::dir_sep) == -1 || !QFile::exists(file)) { static QStringList *feature_roots = 0; if(!feature_roots) { @@ -2988,6 +2989,7 @@ QStringList &QMakeProject::values(const QString &_var, QMap<QString, QStringList var = ".BUILTIN." + var; place[var] = QStringList(qmake_getpwd()); } else if(var == QLatin1String("DIR_SEPARATOR")) { + validateModes(); var = ".BUILTIN." + var; place[var] = QStringList(Option::dir_sep); } else if(var == QLatin1String("DIRLIST_SEPARATOR")) { -- cgit v0.12 From 1de7a573c1f407d5126cf6ee1e25b4f92cbdda3c Mon Sep 17 00:00:00 2001 From: Shane Kearns <shane.kearns@accenture.com> Date: Mon, 17 Jan 2011 12:44:06 +0000 Subject: Fix header not found build error Task-Number: QT-4378 --- src/network/access/qnetworkaccessmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 6b8dc9e..ea18367 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -48,7 +48,7 @@ #include "qabstractnetworkcache.h" #include "QtNetwork/qnetworksession.h" -#include "qsharednetworksession_p.h" +#include "QtNetwork/private/qsharednetworksession_p.h" #include "qnetworkaccesshttpbackend_p.h" #include "qnetworkaccessftpbackend_p.h" -- cgit v0.12 From 72aa2eb43b0cf5a6eef940da05ac58f605794ffb Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Thu, 9 Dec 2010 14:10:57 +0100 Subject: Alien implementation for the Cocoa port Give Alien on Cocoa a warm welcome. --- src/gui/kernel/qapplication.cpp | 13 +- src/gui/kernel/qapplication_mac.mm | 124 ++-- src/gui/kernel/qapplication_p.h | 2 - src/gui/kernel/qcocoaapplicationdelegate_mac.mm | 21 + src/gui/kernel/qcocoapanel_mac.mm | 7 +- src/gui/kernel/qcocoapanel_mac_p.h | 9 +- src/gui/kernel/qcocoasharedwindowmethods_mac_p.h | 407 ++++++++--- src/gui/kernel/qcocoaview_mac.mm | 838 +++++++---------------- src/gui/kernel/qcocoaview_mac_p.h | 28 - src/gui/kernel/qcocoawindow_mac.mm | 2 + src/gui/kernel/qcocoawindow_mac_p.h | 10 +- src/gui/kernel/qcursor.h | 5 +- src/gui/kernel/qcursor_mac.mm | 128 +++- src/gui/kernel/qdnd_mac.mm | 4 +- src/gui/kernel/qt_cocoa_helpers_mac.mm | 446 ++++++++---- src/gui/kernel/qt_cocoa_helpers_mac_p.h | 30 +- src/gui/kernel/qwidget.cpp | 39 +- src/gui/kernel/qwidget_mac.mm | 769 +++++++++++++-------- src/gui/kernel/qwidget_p.h | 5 +- src/gui/painting/qwindowsurface_raster.cpp | 1 + src/gui/widgets/qcocoamenu_mac.mm | 3 +- src/gui/widgets/qfocusframe.cpp | 3 + src/gui/widgets/qmainwindow.cpp | 5 - src/gui/widgets/qmainwindowlayout_mac.mm | 25 +- tests/auto/qwidget/tst_qwidget.cpp | 39 +- tests/auto/qwidget/tst_qwidget_mac_helpers.h | 13 +- tests/auto/qwidget/tst_qwidget_mac_helpers.mm | 44 ++ 27 files changed, 1700 insertions(+), 1320 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index 833e803..27d34db 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -2772,7 +2772,7 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) { for (int i = 0; i < leaveList.size(); ++i) { w = leaveList.at(i); if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w, 0)) { -#if defined(Q_WS_WIN) || defined(Q_WS_X11) +#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined(Q_WS_MAC) if (leaveAfterRelease == w) leaveAfterRelease = 0; #endif @@ -3143,13 +3143,11 @@ bool QApplicationPrivate::sendMouseEvent(QWidget *receiver, QMouseEvent *event, // Dispatch enter/leave if: // 1) the mouse grabber is an alien widget // 2) the button is released on an alien widget - QWidget *enter = 0; if (nativeGuard) enter = alienGuard ? alienWidget : nativeWidget; else // The receiver is typically deleted on mouse release with drag'n'drop. enter = QApplication::widgetAt(event->globalPos()); - dispatchEnterLeave(enter, leaveAfterRelease); leaveAfterRelease = 0; lastMouseReceiver = enter; @@ -3696,15 +3694,6 @@ void QApplication::changeOverrideCursor(const QCursor &cursor) if (qApp->d_func()->cursor_list.isEmpty()) return; qApp->d_func()->cursor_list.removeFirst(); -#ifdef QT_MAC_USE_COCOA - // We use native NSCursor stacks in Cocoa. The currentCursor is the - // top of this stack. So to avoid flickering of cursor, we have to - // change the cusor instead of pop-ing the existing OverrideCursor - // and pushing the new one. - qApp->d_func()->cursor_list.prepend(cursor); - qt_cocoaChangeOverrideCursor(cursor); - return; -#endif setOverrideCursor(cursor); } #endif diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm index 3aafeb4..3bdfaf8 100644 --- a/src/gui/kernel/qapplication_mac.mm +++ b/src/gui/kernel/qapplication_mac.mm @@ -165,6 +165,7 @@ QT_BEGIN_NAMESPACE //for qt_mac.h QPaintDevice *qt_mac_safe_pdev = 0; QList<QMacWindowChangeEvent*> *QMacWindowChangeEvent::change_events = 0; +QPointer<QWidget> topLevelAt_cache = 0; /***************************************************************************** Internal variables and functions @@ -192,7 +193,6 @@ static bool qt_mac_previous_press_in_popup_mode = false; static bool qt_mac_no_click_through_mode = false; static int tablet_button_state = 0; #endif -QPointer<QWidget> qt_mouseover; #if defined(QT_DEBUG) static bool appNoGrab = false; // mouse/keyboard grabbing #endif @@ -216,11 +216,12 @@ extern bool qt_mac_can_clickThrough(const QWidget *); //qwidget_mac.cpp extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp extern OSWindowRef qt_mac_window_for(const QWidget*); //qwidget_mac.cpp extern QWidget *qt_mac_find_window(OSWindowRef); //qwidget_mac.cpp -extern void qt_mac_set_cursor(const QCursor *, const QPoint &); //qcursor_mac.cpp +extern void qt_mac_set_cursor(const QCursor *); //qcursor_mac.cpp extern bool qt_mac_is_macsheet(const QWidget *); //qwidget_mac.cpp extern QString qt_mac_from_pascal_string(const Str255); //qglobal.cpp extern void qt_mac_command_set_enabled(MenuRef, UInt32, bool); //qmenu_mac.cpp extern bool qt_sendSpontaneousEvent(QObject *obj, QEvent *event); // qapplication.cpp +extern void qt_mac_update_cursor(); // qcursor_mac.mm // Forward Decls void onApplicationWindowChangedActivation( QWidget*widget, bool activated ); @@ -1364,43 +1365,16 @@ void QApplication::setMainWidget(QWidget *mainWidget) /***************************************************************************** QApplication cursor stack *****************************************************************************/ -#ifdef QT_MAC_USE_COCOA -void QApplicationPrivate::disableUsageOfCursorRects(bool disable) -{ - // In Cocoa there are two competing ways of setting the cursor; either - // by using cursor rects (see qcocoaview_mac.mm), or by pushing/popping - // the cursor manually. When we use override cursors, it makes most sense - // to use the latter. But then we need to tell cocoa to stop using the - // first approach so it doesn't change the cursor back when hovering over - // a cursor rect: - QWidgetList topLevels = qApp->topLevelWidgets(); - for (int i=0; i<topLevels.size(); ++i) { - if (NSWindow *window = qt_mac_window_for(topLevels.at(i))) - disable ? [window disableCursorRects] : [window enableCursorRects]; - } -} - -void QApplicationPrivate::updateOverrideCursor() -{ - // Sometimes Cocoa forgets that we have set a Cursor - // manually. In those cases, remind it again: - if (QCursor *override = qApp->overrideCursor()) - [static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(*override)) set]; -} -#endif void QApplication::setOverrideCursor(const QCursor &cursor) { qApp->d_func()->cursor_list.prepend(cursor); #ifdef QT_MAC_USE_COCOA - QMacCocoaAutoReleasePool pool; - if (qApp->d_func()->cursor_list.size() == 1) - qApp->d_func()->disableUsageOfCursorRects(true); - [static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(cursor)) push]; + qt_mac_update_cursor(); #else if (qApp && qApp->activeWindow()) - qt_mac_set_cursor(&qApp->d_func()->cursor_list.first(), QCursor::pos()); + qt_mac_set_cursor(&qApp->d_func()->cursor_list.first()); #endif } @@ -1411,14 +1385,11 @@ void QApplication::restoreOverrideCursor() qApp->d_func()->cursor_list.removeFirst(); #ifdef QT_MAC_USE_COCOA - QMacCocoaAutoReleasePool pool; - [NSCursor pop]; - if (qApp->d_func()->cursor_list.isEmpty()) - qApp->d_func()->disableUsageOfCursorRects(false); + qt_mac_update_cursor(); #else if (qApp && qApp->activeWindow()) { const QCursor def(Qt::ArrowCursor); - qt_mac_set_cursor(qApp->d_func()->cursor_list.isEmpty() ? &def : &qApp->d_func()->cursor_list.first(), QCursor::pos()); + qt_mac_set_cursor(qApp->d_func()->cursor_list.isEmpty() ? &def : &qApp->d_func()->cursor_list.first()); } #endif } @@ -1431,30 +1402,54 @@ QWidget *QApplication::topLevelAt(const QPoint &p) qt_mac_window_at(p.x(), p.y(), &widget); return widget; #else + // Use a cache to avoid iterate through the whole list of windows for all + // calls to to topLevelAt. We e.g. do this for each and every mouse + // move since we need to find the widget under mouse: + if (topLevelAt_cache && topLevelAt_cache->frameGeometry().contains(p)) + return topLevelAt_cache; + + // INVARIANT: Cache miss. Go through the list if windows instead: + QMacCocoaAutoReleasePool pool; + NSPoint cocoaPoint = flipPoint(p); NSInteger windowCount; NSCountWindows(&windowCount); if (windowCount <= 0) return 0; // There's no window to find! - QMacCocoaAutoReleasePool pool; - NSPoint cocoaPoint = flipPoint(p); + QVarLengthArray<NSInteger> windowList(windowCount); NSWindowList(windowCount, windowList.data()); + int firstQtWindowFound = -1; for (int i = 0; i < windowCount; ++i) { NSWindow *window = [NSApp windowWithWindowNumber:windowList[i]]; - if (window && NSPointInRect(cocoaPoint, [window frame])) { + if (window) { QWidget *candidateWindow = [window QT_MANGLE_NAMESPACE(qt_qwidget)]; - // Check to see if there's a hole in the window where the mask is. - // If there is, we should just continue to see if there is a window below. - if (candidateWindow && !candidateWindow->mask().isEmpty()) { - QPoint localPoint = candidateWindow->mapFromGlobal(p); - if (!candidateWindow->mask().contains(localPoint)) { - continue; + if (candidateWindow && firstQtWindowFound == -1) + firstQtWindowFound = i; + + if (NSPointInRect(cocoaPoint, [window frame])) { + // Check to see if there's a hole in the window where the mask is. + // If there is, we should just continue to see if there is a window below. + if (candidateWindow && !candidateWindow->mask().isEmpty()) { + QPoint localPoint = candidateWindow->mapFromGlobal(p); + if (!candidateWindow->mask().contains(localPoint)) + continue; + else + return candidateWindow; + } else { + if (i == firstQtWindowFound) { + // The cache will only work when the window under mouse is + // top most (that is, not partially obscured by other windows. + // And we only set it if no mask is present to optimize for the common case: + topLevelAt_cache = candidateWindow; + } + return candidateWindow; } } - return candidateWindow; } } - return 0; // Couldn't find a window at this point + + topLevelAt_cache = 0; + return 0; #endif } @@ -1480,8 +1475,8 @@ void QApplicationPrivate::enterModal_sys(QWidget *widget) if (!qt_modal_stack) qt_modal_stack = new QWidgetList; - dispatchEnterLeave(0, qt_mouseover); - qt_mouseover = 0; + dispatchEnterLeave(0, qt_last_mouse_receiver); + qt_last_mouse_receiver = 0; qt_modal_stack->insert(0, widget); if (!app_do_modal) @@ -1512,8 +1507,8 @@ void QApplicationPrivate::leaveModal_sys(QWidget *widget) w = grabber; else w = QApplication::widgetAt(p.x(), p.y()); - dispatchEnterLeave(w, qt_mouseover); // send synthetic enter event - qt_mouseover = w; + dispatchEnterLeave(w, qt_last_mouse_receiver); // send synthetic enter event + qt_last_mouse_receiver = w; } #ifdef QT_MAC_USE_COCOA if (!qt_mac_is_macsheet(widget)) @@ -1938,7 +1933,7 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event } } } - qt_mac_set_cursor(&cursor, QPoint(where.h, where.v)); + qt_mac_set_cursor(&cursor); } //This mouse button state stuff looks like this on purpose @@ -2132,20 +2127,20 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event QWidget * const enterLeaveWidget = (inPopupMode || ekind == kEventMouseUp) ? QApplication::widgetAt(where.h, where.v) : static_cast<QWidget*>(widget); - if ((QWidget *) qt_mouseover != enterLeaveWidget || inNonClientArea) { + if ((QWidget *) qt_last_mouse_receiver != enterLeaveWidget || inNonClientArea) { #ifdef DEBUG_MOUSE_MAPS qDebug("Entering: %p - %s (%s), Leaving %s (%s)", (QWidget*)enterLeaveWidget, enterLeaveWidget ? enterLeaveWidget->metaObject()->className() : "none", enterLeaveWidget ? enterLeaveWidget->objectName().toLocal8Bit().constData() : "", - qt_mouseover ? qt_mouseover->metaObject()->className() : "none", - qt_mouseover ? qt_mouseover->objectName().toLocal8Bit().constData() : ""); + qt_last_mouse_receiver ? qt_last_mouse_receiver->metaObject()->className() : "none", + qt_last_mouse_receiver ? qt_last_mouse_receiver->objectName().toLocal8Bit().constData() : ""); #endif QWidget * const mouseGrabber = QWidget::mouseGrabber(); if (inPopupMode) { QWidget *enter = enterLeaveWidget; - QWidget *leave = qt_mouseover; + QWidget *leave = qt_last_mouse_receiver; if (mouseGrabber) { QWidget * const popupWidget = qApp->activePopupWidget(); if (leave == popupWidget) @@ -2155,15 +2150,15 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event if ((enter == mouseGrabber && leave == popupWidget) || (leave == mouseGrabber && enter == popupWidget)) { QApplicationPrivate::dispatchEnterLeave(enter, leave); - qt_mouseover = enter; + qt_last_mouse_receiver = enter; } } else { QApplicationPrivate::dispatchEnterLeave(enter, leave); - qt_mouseover = enter; + qt_last_mouse_receiver = enter; } - } else if ((!qt_button_down || !qt_mouseover) && !mouseGrabber && !leaveAfterRelease) { - QApplicationPrivate::dispatchEnterLeave(enterLeaveWidget, qt_mouseover); - qt_mouseover = enterLeaveWidget; + } else if ((!qt_button_down || !qt_last_mouse_receiver) && !mouseGrabber && !leaveAfterRelease) { + QApplicationPrivate::dispatchEnterLeave(enterLeaveWidget, qt_last_mouse_receiver); + qt_last_mouse_receiver = enterLeaveWidget; } } break; } @@ -2240,7 +2235,7 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event if (leaveAfterRelease) { QWidget *enter = QApplication::widgetAt(where.h, where.v); QApplicationPrivate::dispatchEnterLeave(enter, leaveAfterRelease); - qt_mouseover = enter; + qt_last_mouse_receiver = enter; leaveAfterRelease = 0; } @@ -2503,7 +2498,7 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event void QApplicationPrivate::qt_initAfterNSAppStarted() { setupAppleEvents(); - updateOverrideCursor(); + qt_mac_update_cursor(); } void QApplicationPrivate::setupAppleEvents() @@ -3080,7 +3075,7 @@ void onApplicationWindowChangedActivation(QWidget *widget, bool activated) } QMenuBar::macUpdateMenuBar(); - QApplicationPrivate::updateOverrideCursor(); + qt_mac_update_cursor(); #else Q_UNUSED(widget); Q_UNUSED(activated); @@ -3115,6 +3110,7 @@ void onApplicationChangedActivation( bool activated ) app->setActiveWindow(tmp_w); } QMenuBar::macUpdateMenuBar(); + qt_mac_update_cursor(); } else { // de-activated QApplicationPrivate *priv = [[QT_MANGLE_NAMESPACE(QCocoaApplicationDelegate) sharedDelegate] qAppPrivate]; while (priv->inPopupMode()) diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h index 7b49999..c5f8717 100644 --- a/src/gui/kernel/qapplication_p.h +++ b/src/gui/kernel/qapplication_p.h @@ -489,8 +489,6 @@ public: #ifdef QT_MAC_USE_COCOA static void qt_initAfterNSAppStarted(); static void setupAppleEvents(); - static void updateOverrideCursor(); - static void disableUsageOfCursorRects(bool disable); #endif static bool qt_mac_apply_settings(); #endif diff --git a/src/gui/kernel/qcocoaapplicationdelegate_mac.mm b/src/gui/kernel/qcocoaapplicationdelegate_mac.mm index 9b07d64..6c5de59 100644 --- a/src/gui/kernel/qcocoaapplicationdelegate_mac.mm +++ b/src/gui/kernel/qcocoaapplicationdelegate_mac.mm @@ -78,6 +78,7 @@ #import <private/qcocoaapplicationdelegate_mac_p.h> #import <private/qcocoamenuloader_mac_p.h> +#import <private/qcocoaapplication_mac_p.h> #include <private/qapplication_p.h> #include <private/qt_mac_p.h> #include <private/qt_cocoa_helpers_mac_p.h> @@ -89,6 +90,9 @@ QT_BEGIN_NAMESPACE extern void onApplicationChangedActivation(bool); // qapplication_mac.mm extern void qt_release_apple_event_handler(); //qapplication_mac.mm +extern QPointer<QWidget> qt_last_mouse_receiver; // qapplication_mac.cpp +extern QPointer<QWidget> qt_button_down; // qapplication_mac.cpp + QT_END_NAMESPACE QT_FORWARD_DECLARE_CLASS(QDesktopWidgetImplementation) @@ -253,7 +257,18 @@ static void cleanupCocoaApplicationDelegate() if (reflectionDelegate && [reflectionDelegate respondsToSelector:@selector(applicationDidBecomeActive:)]) [reflectionDelegate applicationDidBecomeActive:notification]; + onApplicationChangedActivation(true); + + if (!QWidget::mouseGrabber()){ + // Update enter/leave immidiatly, don't wait for a move event. But only + // if no grab exists (even if the grab points to this widget, it seems, ref X11) + QPoint qlocal, qglobal; + QWidget *widgetUnderMouse = 0; + qt_mac_getTargetForMouseEvent(0, QEvent::Enter, qlocal, qglobal, 0, &widgetUnderMouse); + QApplicationPrivate::dispatchEnterLeave(widgetUnderMouse, 0); + qt_last_mouse_receiver = widgetUnderMouse; + } } - (void)applicationDidResignActive:(NSNotification *)notification; @@ -261,7 +276,13 @@ static void cleanupCocoaApplicationDelegate() if (reflectionDelegate && [reflectionDelegate respondsToSelector:@selector(applicationDidResignActive:)]) [reflectionDelegate applicationDidResignActive:notification]; + onApplicationChangedActivation(false); + + if (!QWidget::mouseGrabber()) + QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver); + qt_last_mouse_receiver = 0; + qt_button_down = 0; } - (void)applicationDidChangeScreenParameters:(NSNotification *)notification diff --git a/src/gui/kernel/qcocoapanel_mac.mm b/src/gui/kernel/qcocoapanel_mac.mm index 0b48efd..cb1e5d0 100644 --- a/src/gui/kernel/qcocoapanel_mac.mm +++ b/src/gui/kernel/qcocoapanel_mac.mm @@ -47,9 +47,10 @@ #import <private/qcocoaview_mac_p.h> #import <private/qcocoawindowcustomthemeframe_mac_p.h> #import <private/qcocoaapplication_mac_p.h> -#include <private/qapplication_p.h> -#include <private/qbackingstore_p.h> - +#import <private/qmultitouch_mac_p.h> +#import <private/qapplication_p.h> +#import <private/qbackingstore_p.h> +#import <private/qdnd_p.h> #include <QtGui/QWidget> diff --git a/src/gui/kernel/qcocoapanel_mac_p.h b/src/gui/kernel/qcocoapanel_mac_p.h index 3678f81..3accc1b 100644 --- a/src/gui/kernel/qcocoapanel_mac_p.h +++ b/src/gui/kernel/qcocoapanel_mac_p.h @@ -50,20 +50,27 @@ // We mean it. // +#ifndef QCOCOAPANEL_MAC_P +#define QCOCOAPANEL_MAC_P + #include "qmacdefines_mac.h" #ifdef QT_MAC_USE_COCOA #import <Cocoa/Cocoa.h> QT_FORWARD_DECLARE_CLASS(QStringList); +QT_FORWARD_DECLARE_CLASS(QCocoaDropData); @interface QT_MANGLE_NAMESPACE(QCocoaPanel) : NSPanel { - bool leftButtonIsRightButton; QStringList *currentCustomDragTypes; + QCocoaDropData *dropData; + NSInteger dragEnterSequence; } + (Class)frameViewClassForStyleMask:(NSUInteger)styleMask; - (void)registerDragTypes; +- (void)drawRectOriginal:(NSRect)rect; @end #endif +#endif diff --git a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h index efe045c..c71d476 100644 --- a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h +++ b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h @@ -62,7 +62,6 @@ extern void qt_event_request_window_change(QWidget *); // qapplication_mac.mm extern void qt_mac_send_posted_gl_updates(QWidget *widget); // qapplication_mac.mm Q_GLOBAL_STATIC(QPointer<QWidget>, currentDragTarget); - QT_END_NAMESPACE - (id)initWithContentRect:(NSRect)contentRect @@ -145,66 +144,27 @@ QT_END_NAMESPACE - (void)sendEvent:(NSEvent *)event { - QWidget *widget = [[QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate] qt_qwidgetForWindow:self]; - // Cocoa can hold onto the window after we've disavowed its knowledge. So, - // if we get sent an event afterwards just have it go through the super's - // version and don't do any stuff with Qt. - if (!widget) { - [super sendEvent:event]; - return; - } - [self retain]; - QT_MANGLE_NAMESPACE(QCocoaView) *view = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(qt_mac_nativeview_for(widget)); - Qt::MouseButton mouseButton = cocoaButton2QtButton([event buttonNumber]); bool handled = false; - // sometimes need to redirect mouse events to the popup. - QWidget *popup = qAppInstance()->activePopupWidget(); - if (popup) { - switch([event type]) - { - case NSLeftMouseDown: - if (!qt_button_down) - qt_button_down = widget; - handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonPress, mouseButton); - // Don't call super here. This prevents us from getting the mouseUp event, - // which we need to send even if the mouseDown event was not accepted. - // (this is standard Qt behavior.) - break; - case NSRightMouseDown: - case NSOtherMouseDown: - if (!qt_button_down) - qt_button_down = widget; - handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonPress, mouseButton); - break; - case NSLeftMouseUp: - case NSRightMouseUp: - case NSOtherMouseUp: - handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonRelease, mouseButton); - qt_button_down = 0; - break; - case NSMouseMoved: - handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseMove, Qt::NoButton); - break; - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: - [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->view = view; - [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->theEvent = event; - handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseMove, mouseButton); - break; - default: - [super sendEvent:event]; - break; - } - } else { - [super sendEvent:event]; + switch([event type]) { + case NSMouseMoved: + // Cocoa sends move events to a parent and all its children under the mouse, much + // like Qt handles hover events. But we only want to handle the move event once, so + // to optimize a bit (since we subscribe for move event for all views), we handle it + // here before this logic happends. Note: it might be tempting to do this shortcut for + // all mouse events. The problem is that Cocoa does more than just find the correct view + // when sending the event, like raising windows etc. So avoid it as much as possible: + handled = qt_mac_handleMouseEvent(event, QEvent::MouseMove, Qt::NoButton, 0); + break; + default: + break; } - if (!handled) - qt_mac_dispatchNCMouseMessage(self, event, [self QT_MANGLE_NAMESPACE(qt_qwidget)], leftButtonIsRightButton); - + if (!handled) { + [super sendEvent:event]; + qt_mac_handleNonClientAreaMouseEvent(self, event); + } [self release]; } @@ -237,6 +197,56 @@ QT_END_NAMESPACE return [super frameViewClassForStyleMask:styleMask]; } +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 +- (void)touchesBeganWithEvent:(NSEvent *)event; +{ + QPoint qlocal, qglobal; + QWidget *widgetToGetTouch = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, 0, &widgetToGetTouch); + if (!widgetToGetTouch) + return; + + bool all = widgetToGetTouch->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); + qt_translateRawTouchEvent(widgetToGetTouch, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all)); +} + +- (void)touchesMovedWithEvent:(NSEvent *)event; +{ + QPoint qlocal, qglobal; + QWidget *widgetToGetTouch = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, 0, &widgetToGetTouch); + if (!widgetToGetTouch) + return; + + bool all = widgetToGetTouch->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); + qt_translateRawTouchEvent(widgetToGetTouch, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all)); +} + +- (void)touchesEndedWithEvent:(NSEvent *)event; +{ + QPoint qlocal, qglobal; + QWidget *widgetToGetTouch = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, 0, &widgetToGetTouch); + if (!widgetToGetTouch) + return; + + bool all = widgetToGetTouch->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); + qt_translateRawTouchEvent(widgetToGetTouch, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all)); +} + +- (void)touchesCancelledWithEvent:(NSEvent *)event; +{ + QPoint qlocal, qglobal; + QWidget *widgetToGetTouch = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, 0, &widgetToGetTouch); + if (!widgetToGetTouch) + return; + + bool all = widgetToGetTouch->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); + qt_translateRawTouchEvent(widgetToGetTouch, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all)); +} +#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + -(void)registerDragTypes { // Calling registerForDraggedTypes below is slow, so only do @@ -259,21 +269,47 @@ QT_END_NAMESPACE NSMultipleTextSelectionPboardType, mimeTypeGeneric, nil]; // Add custom types supported by the application. for (int i = 0; i < customTypes.size(); i++) { - [supportedTypes addObject:reinterpret_cast<const NSString *>(QCFString::toCFStringRef(customTypes[i]))]; + [supportedTypes addObject:qt_mac_QStringToNSString(customTypes[i])]; } [self registerForDraggedTypes:supportedTypes]; } } -- (QWidget *)dragTargetHitTest:(id <NSDraggingInfo>)sender +- (void)removeDropData +{ + if (dropData) { + delete dropData; + dropData = 0; + } +} + +- (void)addDropData:(id <NSDraggingInfo>)sender { - // Do a hittest to find the NSView under the - // mouse, and return the corresponding QWidget: - NSPoint windowPoint = [sender draggingLocation]; - NSView *candidateView = [[self contentView] hitTest:windowPoint]; - if (![candidateView isKindOfClass:[QT_MANGLE_NAMESPACE(QCocoaView) class]]) - return 0; - return [static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(candidateView) qt_qwidget]; + [self removeDropData]; + CFStringRef dropPasteboard = (CFStringRef) [[sender draggingPasteboard] name]; + dropData = new QCocoaDropData(dropPasteboard); +} + +- (void)changeDraggingCursor:(NSDragOperation)newOperation +{ + static SEL action = nil; + static bool operationSupported = false; + if (action == nil) { + action = NSSelectorFromString(@"operationNotAllowedCursor"); + if ([NSCursor respondsToSelector:action]) { + operationSupported = true; + } + } + if (operationSupported) { + NSCursor *notAllowedCursor = [NSCursor performSelector:action]; + bool isNotAllowedCursor = ([NSCursor currentCursor] == notAllowedCursor); + if (newOperation == NSDragOperationNone && !isNotAllowedCursor) { + [notAllowedCursor push]; + } else if (newOperation != NSDragOperationNone && isNotAllowedCursor) { + [notAllowedCursor pop]; + } + + } } - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender @@ -286,64 +322,211 @@ QT_END_NAMESPACE // registerForDraggedTypes on the views will severly degrade initialization time // for an application that uses a lot of drag subscribing widgets. - QWidget *target = [self dragTargetHitTest:sender]; - if (!target) + NSPoint nswindowPoint = [sender draggingLocation]; + NSPoint nsglobalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:nswindowPoint]; + QPoint globalPoint = flipPoint(nsglobalPoint).toPoint(); + + QWidget *qwidget = QApplication::widgetAt(globalPoint); + *currentDragTarget() = qwidget; + if (!qwidget) return [super draggingEntered:sender]; - if (target->testAttribute(Qt::WA_DropSiteRegistered) == false) + if (qwidget->testAttribute(Qt::WA_DropSiteRegistered) == false) return NSDragOperationNone; - *currentDragTarget() = target; - return [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingEntered:sender]; + [self addDropData:sender]; + + QMimeData *mimeData = dropData; + if (QDragManager::self()->source()) + mimeData = QDragManager::self()->dragPrivate()->data; + + NSDragOperation nsActions = [sender draggingSourceOperationMask]; + Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations(nsActions); + QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) = nsActions; + Qt::KeyboardModifiers modifiers = Qt::NoModifier; + + if ([sender draggingSource] != nil) { + // modifier flags might have changed, update it here since we don't send any input events. + QApplicationPrivate::modifier_buttons = qt_cocoaModifiers2QtModifiers([[NSApp currentEvent] modifierFlags]); + modifiers = QApplication::keyboardModifiers(); + } else { + // when the source is from another application the above technique will not work. + modifiers = qt_cocoaDragOperation2QtModifiers(nsActions); + } + + // send the drag enter event to the widget. + QPoint localPoint(qwidget->mapFromGlobal(globalPoint)); + QDragEnterEvent qDEEvent(localPoint, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers); + QApplication::sendEvent(qwidget, &qDEEvent); + + if (!qDEEvent.isAccepted()) { + // The enter event was not accepted. We mark this by removing + // the drop data so we don't send subsequent drag move events: + [self removeDropData]; + [self changeDraggingCursor:NSDragOperationNone]; + return NSDragOperationNone; + } else { + // Send a drag move event immediately after a drag enter event (as per documentation). + QDragMoveEvent qDMEvent(localPoint, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers); + qDMEvent.setDropAction(qDEEvent.dropAction()); + qDMEvent.accept(); // accept by default, since enter event was accepted. + QApplication::sendEvent(qwidget, &qDMEvent); + + if (!qDMEvent.isAccepted() || qDMEvent.dropAction() == Qt::IgnoreAction) { + // Since we accepted the drag enter event, the widget expects + // future drage move events. + nsActions = NSDragOperationNone; + // Save as ignored in the answer rect. + qDMEvent.setDropAction(Qt::IgnoreAction); + } else { + nsActions = QT_PREPEND_NAMESPACE(qt_mac_mapDropAction)(qDMEvent.dropAction()); + } + + QT_PREPEND_NAMESPACE(qt_mac_copy_answer_rect)(qDMEvent); + [self changeDraggingCursor:nsActions]; + return nsActions; + } } -- (NSDragOperation)draggingUpdated:(id < NSDraggingInfo >)sender +- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender { - QWidget *target = [self dragTargetHitTest:sender]; - if (!target) - return [super draggingUpdated:sender]; - - if (target == *currentDragTarget()) { - // The drag continues to move over the widget that we have sendt - // a draggingEntered message to. So just update the view: - return [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingUpdated:sender]; - } else { - // The widget under the mouse has changed. - // So we need to fake enter/leave events: - if (*currentDragTarget()) - [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingExited:sender]; - if (target->testAttribute(Qt::WA_DropSiteRegistered) == false) { - *currentDragTarget() = 0; - return NSDragOperationNone; + NSPoint nswindowPoint = [sender draggingLocation]; + NSPoint nsglobalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:nswindowPoint]; + QPoint globalPoint = flipPoint(nsglobalPoint).toPoint(); + + QWidget *qwidget = QApplication::widgetAt(globalPoint); + if (!qwidget) + return [super draggingEntered:sender]; + + // First, check if the widget under the mouse has changed since the + // last drag move events. If so, we need to change target, and dispatch + // syntetic drag enter/leave events: + if (qwidget != *currentDragTarget()) { + if (*currentDragTarget() && dropData) { + QDragLeaveEvent de; + QApplication::sendEvent(*currentDragTarget(), &de); + [self removeDropData]; } - *currentDragTarget() = target; - return [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingEntered:sender]; + return [self draggingEntered:sender]; } + + if (qwidget->testAttribute(Qt::WA_DropSiteRegistered) == false) + return NSDragOperationNone; + + // If we have no drop data (which will be assigned inside draggingEntered), it means + // that the current drag target did not accept the enter event. If so, we ignore + // subsequent move events as well: + if (dropData == 0) { + [self changeDraggingCursor:NSDragOperationNone]; + return NSDragOperationNone; + } + + // If the mouse is still within the accepted rect (provided by + // the application on a previous event), we follow the optimization + // and just return the answer given at that point: + NSDragOperation nsActions = [sender draggingSourceOperationMask]; + QPoint localPoint(qwidget->mapFromGlobal(globalPoint)); + if (qt_mac_mouse_inside_answer_rect(localPoint) + && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) == nsActions) { + NSDragOperation operation = QT_PREPEND_NAMESPACE(qt_mac_mapDropActions)(QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastAction)); + [self changeDraggingCursor:operation]; + return operation; + } + + QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) = nsActions; + Qt::DropActions qtAllowed = QT_PREPEND_NAMESPACE(qt_mac_mapNSDragOperations)(nsActions); + Qt::KeyboardModifiers modifiers = Qt::NoModifier; + + // Update modifiers: + if ([sender draggingSource] != nil) { + QApplicationPrivate::modifier_buttons = qt_cocoaModifiers2QtModifiers([[NSApp currentEvent] modifierFlags]); + modifiers = QApplication::keyboardModifiers(); + } else { + modifiers = qt_cocoaDragOperation2QtModifiers(nsActions); + } + + QMimeData *mimeData = dropData; + if (QDragManager::self()->source()) + mimeData = QDragManager::self()->dragPrivate()->data; + + // Insert the same drop action on the event according to + // what the application told us it should be on the previous event: + QDragMoveEvent qDMEvent(localPoint, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers); + if (QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).lastAction != Qt::IgnoreAction + && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).buttons == qDMEvent.mouseButtons() + && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).modifiers == qDMEvent.keyboardModifiers()) + qDMEvent.setDropAction(QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).lastAction); + + // Now, end the drag move event to the widget: + qDMEvent.accept(); + QApplication::sendEvent(qwidget, &qDMEvent); + + NSDragOperation operation = qt_mac_mapDropAction(qDMEvent.dropAction()); + if (!qDMEvent.isAccepted() || qDMEvent.dropAction() == Qt::IgnoreAction) { + // Ignore this event (we will still receive further + // notifications), save as ignored in the answer rect: + operation = NSDragOperationNone; + qDMEvent.setDropAction(Qt::IgnoreAction); + } + + qt_mac_copy_answer_rect(qDMEvent); + [self changeDraggingCursor:operation]; + + return operation; } -- (void)draggingExited:(id < NSDraggingInfo >)sender +- (void)draggingExited:(id <NSDraggingInfo>)sender { - QWidget *target = [self dragTargetHitTest:sender]; - if (!target) + NSPoint nswindowPoint = [sender draggingLocation]; + NSPoint nsglobalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:nswindowPoint]; + QPoint globalPoint = flipPoint(nsglobalPoint).toPoint(); + + QWidget *qwidget = *currentDragTarget(); + if (!qwidget) return [super draggingExited:sender]; - if (*currentDragTarget()) { - [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) draggingExited:sender]; - *currentDragTarget() = 0; + if (dropData) { + QDragLeaveEvent de; + QApplication::sendEvent(qwidget, &de); + [self removeDropData]; } + + // Clean-up: + [self removeDropData]; + *currentDragTarget() = 0; + [self changeDraggingCursor:NSDragOperationEvery]; } -- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender +- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender { - QWidget *target = [self dragTargetHitTest:sender]; - if (!target) - return [super performDragOperation:sender]; - - BOOL dropResult = NO; - if (*currentDragTarget()) { - dropResult = [reinterpret_cast<NSView *>((*currentDragTarget())->winId()) performDragOperation:sender]; - *currentDragTarget() = 0; - } - return dropResult; + QWidget *qwidget = *currentDragTarget(); + if (!qwidget) + return NO; + + *currentDragTarget() = 0; + NSPoint nswindowPoint = [sender draggingLocation]; + NSPoint nsglobalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:nswindowPoint]; + QPoint globalPoint = flipPoint(nsglobalPoint).toPoint(); + + [self addDropData:sender]; + + NSDragOperation nsActions = [sender draggingSourceOperationMask]; + Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations(nsActions); + QMimeData *mimeData = dropData; + + if (QDragManager::self()->source()) + mimeData = QDragManager::self()->dragPrivate()->data; + if (QDragManager::self()->object) + QDragManager::self()->dragPrivate()->target = qwidget; + + QPoint localPoint(qwidget->mapFromGlobal(globalPoint)); + QDropEvent de(localPoint, qtAllowed, mimeData, + QApplication::mouseButtons(), QApplication::keyboardModifiers()); + QApplication::sendEvent(qwidget, &de); + + if (QDragManager::self()->object) + QDragManager::self()->dragPrivate()->executed_action = de.dropAction(); + + return de.isAccepted(); } - (void)displayIfNeeded @@ -394,8 +577,8 @@ static bool firstDrawingInvocation = true; - (void)drawRectSpecial:(NSRect)rect { // Call the original drawing method. - [self drawRectOriginal:rect]; - NSWindow *window = [self window]; + [id(self) drawRectOriginal:rect]; + NSWindow *window = [id(self) window]; NSToolbar *toolbar = [window toolbar]; if(!toolbar) { // There is no toolbar, we have to draw a line on top of the line drawn by Cocoa. @@ -415,3 +598,11 @@ static bool firstDrawingInvocation = true; } } } + +- (void)drawRectOriginal:(NSRect)rect +{ + Q_UNUSED(rect) + // This method implementation is here to silenct the compiler. + // See drawRectSpecial for information. +} + diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index dfcc2e6..c627b0b 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -49,7 +49,6 @@ #include <private/qt_cocoa_helpers_mac_p.h> #include <private/qdnd_p.h> #include <private/qmacinputcontext_p.h> -#include <private/qmultitouch_mac_p.h> #include <private/qevent_p.h> #include <private/qbackingstore_p.h> @@ -76,70 +75,15 @@ QT_BEGIN_NAMESPACE -Q_GLOBAL_STATIC(DnDParams, qMacDnDParams); - -extern void qt_mac_update_cursor_at_global_pos(const QPoint &globalPos); // qcursor_mac.mm +extern void qt_mac_update_cursor(); // qcursor_mac.mm extern bool qt_sendSpontaneousEvent(QObject *, QEvent *); // qapplication.cpp +extern QPointer<QWidget> qt_last_mouse_receiver; // qapplication_mac.cpp extern OSViewRef qt_mac_nativeview_for(const QWidget *w); // qwidget_mac.mm -extern QPointer<QWidget> qt_mouseover; //qapplication_mac.mm +extern OSViewRef qt_mac_effectiveview_for(const QWidget *w); // qwidget_mac.mm extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp extern Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum); - -struct dndenum_mapper -{ - NSDragOperation mac_code; - Qt::DropAction qt_code; - bool Qt2Mac; -}; - -static dndenum_mapper dnd_enums[] = { - { NSDragOperationLink, Qt::LinkAction, true }, - { NSDragOperationMove, Qt::MoveAction, true }, - { NSDragOperationCopy, Qt::CopyAction, true }, - { NSDragOperationGeneric, Qt::CopyAction, false }, - { NSDragOperationEvery, Qt::ActionMask, false }, - { NSDragOperationNone, Qt::IgnoreAction, false } -}; - -static NSDragOperation qt_mac_mapDropAction(Qt::DropAction action) -{ - for (int i=0; dnd_enums[i].qt_code; i++) { - if (dnd_enums[i].Qt2Mac && (action & dnd_enums[i].qt_code)) { - return dnd_enums[i].mac_code; - } - } - return NSDragOperationNone; -} - -static NSDragOperation qt_mac_mapDropActions(Qt::DropActions actions) -{ - NSDragOperation nsActions = NSDragOperationNone; - for (int i=0; dnd_enums[i].qt_code; i++) { - if (dnd_enums[i].Qt2Mac && (actions & dnd_enums[i].qt_code)) - nsActions |= dnd_enums[i].mac_code; - } - return nsActions; -} - -static Qt::DropAction qt_mac_mapNSDragOperation(NSDragOperation nsActions) -{ - Qt::DropAction action = Qt::IgnoreAction; - for (int i=0; dnd_enums[i].mac_code; i++) { - if (nsActions & dnd_enums[i].mac_code) - return dnd_enums[i].qt_code; - } - return action; -} - -static Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions) -{ - Qt::DropActions actions = Qt::IgnoreAction; - for (int i=0; dnd_enums[i].mac_code; i++) { - if (nsActions & dnd_enums[i].mac_code) - actions |= dnd_enums[i].qt_code; - } - return actions; -} +extern QWidget *mac_mouse_grabber; +extern bool qt_mac_clearDirtyOnWidgetInsideDrawWidget; // qwidget.cpp static QColor colorFrom(NSColor *color) { @@ -222,243 +166,9 @@ static int qCocoaViewCount = 0; object:self]; } -- (void)resetCursorRects -{ - // [NSView addCursorRect] is slow, so bail out early if we can: - if (NSIsEmptyRect([self visibleRect])) - return; - - QWidget *cursorWidget = qwidget; - - if (cursorWidget->testAttribute(Qt::WA_TransparentForMouseEvents)) - cursorWidget = QApplication::widgetAt(qwidget->mapToGlobal(qwidget->rect().center())); - - if (cursorWidget == 0) - return; - - if (!cursorWidget->testAttribute(Qt::WA_SetCursor)) { - [super resetCursorRects]; - return; - } - - QRegion mask = qt_widget_private(cursorWidget)->extra->mask; - NSCursor *nscursor = static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(cursorWidget->cursor())); - // The mask could have the WA_MouseNoMask attribute set and that means that we have to ignore the mask. - if (mask.isEmpty() || cursorWidget->testAttribute(Qt::WA_MouseNoMask)) { - [self addCursorRect:[qt_mac_nativeview_for(cursorWidget) visibleRect] cursor:nscursor]; - } else { - const QVector<QRect> &rects = mask.rects(); - for (int i = 0; i < rects.size(); ++i) { - const QRect &rect = rects.at(i); - [self addCursorRect:NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height()) cursor:nscursor]; - } - } -} - -- (void)removeDropData -{ - if (dropData) { - delete dropData; - dropData = 0; - } -} - -- (void)addDropData:(id <NSDraggingInfo>)sender -{ - [self removeDropData]; - CFStringRef dropPasteboard = (CFStringRef) [[sender draggingPasteboard] name]; - dropData = new QCocoaDropData(dropPasteboard); -} - -- (void)changeDraggingCursor:(NSDragOperation)newOperation -{ - static SEL action = nil; - static bool operationSupported = false; - if (action == nil) { - action = NSSelectorFromString(@"operationNotAllowedCursor"); - if ([NSCursor respondsToSelector:action]) { - operationSupported = true; - } - } - if (operationSupported) { - NSCursor *notAllowedCursor = [NSCursor performSelector:action]; - bool isNotAllowedCursor = ([NSCursor currentCursor] == notAllowedCursor); - if (newOperation == NSDragOperationNone && !isNotAllowedCursor) { - [notAllowedCursor push]; - } else if (newOperation != NSDragOperationNone && isNotAllowedCursor) { - [notAllowedCursor pop]; - } - - } -} - -- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender -{ - // NB: This function is called from QCoocaWindow/QCocoaPanel rather than directly - // from Cocoa. They modify the drag target, and might fake enter/leave events. - NSPoint windowPoint = [sender draggingLocation]; - dragEnterSequence = [sender draggingSequenceNumber]; - [self addDropData:sender]; - QMimeData *mimeData = dropData; - if (QDragManager::self()->source()) - mimeData = QDragManager::self()->dragPrivate()->data; - NSPoint globalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:windowPoint]; - NSPoint localPoint = [self convertPoint:windowPoint fromView:nil]; - QPoint posDrag(localPoint.x, localPoint.y); - NSDragOperation nsActions = [sender draggingSourceOperationMask]; - Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations(nsActions); - QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) = nsActions; - Qt::KeyboardModifiers modifiers = Qt::NoModifier; - if ([sender draggingSource] != nil) { - // modifier flags might have changed, update it here since we don't send any input events. - QApplicationPrivate::modifier_buttons = qt_cocoaModifiers2QtModifiers([[NSApp currentEvent] modifierFlags]); - modifiers = QApplication::keyboardModifiers(); - } else { - // when the source is from another application the above technique will not work. - modifiers = qt_cocoaDragOperation2QtModifiers(nsActions); - } - // send the drag enter event to the widget. - QDragEnterEvent qDEEvent(posDrag, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers); - QApplication::sendEvent(qwidget, &qDEEvent); - if (!qDEEvent.isAccepted()) { - // widget is not interested in this drag, so ignore this drop data. - [self removeDropData]; - [self changeDraggingCursor:NSDragOperationNone]; - return NSDragOperationNone; - } else { - // save the mouse position, used by draggingExited handler. - DnDParams *dndParams = [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]; - dndParams->activeDragEnterPos = windowPoint; - // send a drag move event immediately after a drag enter event (as per documentation). - QDragMoveEvent qDMEvent(posDrag, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers); - qDMEvent.setDropAction(qDEEvent.dropAction()); - qDMEvent.accept(); // accept by default, since enter event was accepted. - QApplication::sendEvent(qwidget, &qDMEvent); - if (!qDMEvent.isAccepted() || qDMEvent.dropAction() == Qt::IgnoreAction) { - // since we accepted the drag enter event, the widget expects - // future drage move events. - // ### check if we need to treat this like the drag enter event. - nsActions = NSDragOperationNone; - // Save as ignored in the answer rect. - qDMEvent.setDropAction(Qt::IgnoreAction); - } else { - nsActions = QT_PREPEND_NAMESPACE(qt_mac_mapDropAction)(qDMEvent.dropAction()); - } - QT_PREPEND_NAMESPACE(qt_mac_copy_answer_rect)(qDMEvent); - [self changeDraggingCursor:nsActions]; - return nsActions; - } - } -- (NSDragOperation)draggingUpdated:(id < NSDraggingInfo >)sender -{ - // NB: This function is called from QCoocaWindow/QCocoaPanel rather than directly - // from Cocoa. They modify the drag target, and might fake enter/leave events. - NSPoint windowPoint = [sender draggingLocation]; - // in cases like QFocusFrame, the view under the mouse might - // not have received the drag enter. Generate a synthetic - // drag enter event for that view. - if (dragEnterSequence != [sender draggingSequenceNumber]) - [self draggingEntered:sender]; - // drag enter event was rejected, so ignore the move event. - if (dropData == 0) { - [self changeDraggingCursor:NSDragOperationNone]; - return NSDragOperationNone; - } - // return last value, if we are still in the answerRect. - NSPoint globalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:windowPoint]; - NSPoint localPoint = [self convertPoint:windowPoint fromView:nil]; - NSDragOperation nsActions = [sender draggingSourceOperationMask]; - QPoint posDrag(localPoint.x, localPoint.y); - if (qt_mac_mouse_inside_answer_rect(posDrag) - && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) == nsActions) { - NSDragOperation operation = QT_PREPEND_NAMESPACE(qt_mac_mapDropActions)(QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastAction)); - [self changeDraggingCursor:operation]; - return operation; - } - // send drag move event to the widget - QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec.lastOperation) = nsActions; - Qt::DropActions qtAllowed = QT_PREPEND_NAMESPACE(qt_mac_mapNSDragOperations)(nsActions); - Qt::KeyboardModifiers modifiers = Qt::NoModifier; - if ([sender draggingSource] != nil) { - // modifier flags might have changed, update it here since we don't send any input events. - QApplicationPrivate::modifier_buttons = qt_cocoaModifiers2QtModifiers([[NSApp currentEvent] modifierFlags]); - modifiers = QApplication::keyboardModifiers(); - } else { - // when the source is from another application the above technique will not work. - modifiers = qt_cocoaDragOperation2QtModifiers(nsActions); - } - QMimeData *mimeData = dropData; - if (QDragManager::self()->source()) - mimeData = QDragManager::self()->dragPrivate()->data; - QDragMoveEvent qDMEvent(posDrag, qtAllowed, mimeData, QApplication::mouseButtons(), modifiers); - if (QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).lastAction != Qt::IgnoreAction - && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).buttons == qDMEvent.mouseButtons() - && QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).modifiers == qDMEvent.keyboardModifiers()) - qDMEvent.setDropAction(QT_PREPEND_NAMESPACE(qt_mac_dnd_answer_rec).lastAction); - qDMEvent.accept(); - QApplication::sendEvent(qwidget, &qDMEvent); - - NSDragOperation operation = qt_mac_mapDropAction(qDMEvent.dropAction()); - if (!qDMEvent.isAccepted() || qDMEvent.dropAction() == Qt::IgnoreAction) { - // ignore this event (we will still receive further notifications) - operation = NSDragOperationNone; - // Save as ignored in the answer rect. - qDMEvent.setDropAction(Qt::IgnoreAction); - } - qt_mac_copy_answer_rect(qDMEvent); - [self changeDraggingCursor:operation]; - return operation; -} - -- (void)draggingExited:(id < NSDraggingInfo >)sender -{ - // NB: This function is called from QCoocaWindow/QCocoaPanel rather than directly - // from Cocoa. They modify the drag target, and might fake enter/leave events. - Q_UNUSED(sender); - dragEnterSequence = -1; - // drag enter event was rejected, so ignore the move event. - if (dropData) { - QDragLeaveEvent de; - QApplication::sendEvent(qwidget, &de); - [self removeDropData]; - } - [self changeDraggingCursor:NSDragOperationEvery]; - -} - -- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender -{ - // NB: This function is called from QCoocaWindow/QCocoaPanel rather than directly - // from Cocoa. They modify the drag target, and might fake enter/leave events. - NSPoint windowPoint = [sender draggingLocation]; - dragEnterSequence = -1; - [self addDropData:sender]; - - NSPoint globalPoint = [[sender draggingDestinationWindow] convertBaseToScreen:windowPoint]; - NSPoint localPoint = [self convertPoint:windowPoint fromView:nil]; - QPoint posDrop(localPoint.x, localPoint.y); - - NSDragOperation nsActions = [sender draggingSourceOperationMask]; - Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations(nsActions); - QMimeData *mimeData = dropData; - if (QDragManager::self()->source()) - mimeData = QDragManager::self()->dragPrivate()->data; - // send the drop event to the widget. - QDropEvent de(posDrop, qtAllowed, mimeData, - QApplication::mouseButtons(), QApplication::keyboardModifiers()); - if (QDragManager::self()->object) - QDragManager::self()->dragPrivate()->target = qwidget; - QApplication::sendEvent(qwidget, &de); - if (QDragManager::self()->object) - QDragManager::self()->dragPrivate()->executed_action = de.dropAction(); - if (!de.isAccepted()) - return NO; - else - return YES; -} - - (void)dealloc { + QMacCocoaAutoReleasePool pool; delete composingText; [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -532,9 +242,8 @@ static int qCocoaViewCount = 0; { if (!qwidget) return; - - // We use a different graphics system. if (QApplicationPrivate::graphicsSystem() != 0 && !qwidgetprivate->isInUnifiedToolbar) { + // INVARIANT: We use a different graphics system. // Qt handles the painting occuring inside the window. // Cocoa also keeps track of all widgets as NSView and therefore might @@ -560,7 +269,7 @@ static int qCocoaViewCount = 0; qwidgetprivate->hd = cg; // We steal the CGContext for flushing in the unified toolbar with the raster engine. - if (QApplicationPrivate::graphicsSystem() != 0 && qwidgetprivate->isInUnifiedToolbar) { + if (QApplicationPrivate::graphicsSystem() != 0 && qwidgetprivate->isInUnifiedToolbar && qwidgetprivate->unifiedSurface) { qwidgetprivate->cgContext = cg; qwidgetprivate->hasOwnContext = true; qwidgetprivate->unifiedSurface->flush(qwidget, qwidgetprivate->ut_rg, qwidgetprivate->ut_pt); @@ -576,13 +285,13 @@ static int qCocoaViewCount = 0; const QRect qrect = QRect(aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height); QRegion qrgn; - const NSRect *rects; - NSInteger count; - [self getRectsBeingDrawn:&rects count:&count]; - for (int i = 0; i < count; ++i) { - QRect tmpRect = QRect(rects[i].origin.x, rects[i].origin.y, rects[i].size.width, rects[i].size.height); - qrgn += tmpRect; - } + const NSRect *rects; + NSInteger count; + [self getRectsBeingDrawn:&rects count:&count]; + for (int i = 0; i < count; ++i) { + QRect tmpRect = QRect(rects[i].origin.x, rects[i].origin.y, rects[i].size.width, rects[i].size.height); + qrgn += tmpRect; + } if (!qwidget->isWindow() && !qobject_cast<QAbstractScrollArea *>(qwidget->parent())) { const QRegion &parentMask = qwidget->window()->mask(); @@ -612,38 +321,27 @@ static int qCocoaViewCount = 0; } if (qwidget->isWindow() && !qwidgetprivate->isOpaque - && !qwidget->testAttribute(Qt::WA_MacBrushedMetal)) { + && !qwidget->testAttribute(Qt::WA_MacBrushedMetal)) { CGContextClearRect(cg, NSRectToCGRect(aRect)); } - // Check for alien widgets, use qwidgetPrivate->drawWidget() to draw the widget if this - // is the case. This makes sure child widgets are drawn as well, Cocoa does not know about - // those and wont send them drawRect calls. - if (qwidget->testAttribute(Qt::WA_NativeWindow) && qt_widget_private(qwidget)->hasAlienChildren == false) { - if (engine && !qwidget->testAttribute(Qt::WA_NoSystemBackground) - && (qwidget->isWindow() || qwidget->autoFillBackground()) - || qwidget->testAttribute(Qt::WA_TintedBackground) - || qwidget->testAttribute(Qt::WA_StyledBackground)) { -#ifdef DEBUG_WIDGET_PAINT - if(doDebug) - qDebug(" Handling erase for [%s::%s]", qwidget->metaObject()->className(), - qwidget->objectName().local8Bit().data()); -#endif - QPainter p(qwidget); - qwidgetprivate->paintBackground(&p, qrgn, - qwidget->isWindow() ? QWidgetPrivate::DrawAsRoot : 0); - p.end(); - } - QPaintEvent e(qrgn); -#ifdef QT3_SUPPORT - e.setErased(true); -#endif - qt_sendSpontaneousEvent(qwidget, &e); - } else { - qwidget->setAttribute(Qt::WA_WState_InPaintEvent, false); // QWidgetPrivate::drawWidget sets this - QWidgetPrivate *qwidgetPrivate = qt_widget_private(qwidget); - qwidgetPrivate->drawWidget(qwidget, qrgn, QPoint(), QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawPaintOnScreen | QWidgetPrivate::DrawRecursive, 0); - } + qwidget->setAttribute(Qt::WA_WState_InPaintEvent, false); + QWidgetPrivate *qwidgetPrivate = qt_widget_private(qwidget); + + // We specify that we want to draw the widget itself, and + // all its children recursive. But we skip native children, because + // they will receive drawRect calls by themselves as needed: + int flags = QWidgetPrivate::DrawPaintOnScreen + | QWidgetPrivate::DrawRecursive + | QWidgetPrivate::DontDrawNativeChildren; + + if (qwidget->isWindow()) + flags |= QWidgetPrivate::DrawAsRoot; + + // Start to draw: + qt_mac_clearDirtyOnWidgetInsideDrawWidget = true; + qwidgetPrivate->drawWidget(qwidget, qrgn, QPoint(), flags, 0); + qt_mac_clearDirtyOnWidgetInsideDrawWidget = false; if (!redirectionOffset.isNull()) QPainter::restoreRedirected(qwidget); @@ -652,7 +350,7 @@ static int qCocoaViewCount = 0; qwidget->setAttribute(Qt::WA_WState_InPaintEvent, false); if(!qwidget->testAttribute(Qt::WA_PaintOutsidePaintEvent) && qwidget->paintingActive()) qWarning("QWidget: It is dangerous to leave painters active on a" - " widget outside of the PaintEvent"); + " widget outside of the PaintEvent"); } qwidgetprivate->hd = 0; CGContextRestoreGState(cg); @@ -660,11 +358,13 @@ static int qCocoaViewCount = 0; - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent { - if (!qwidget) + // Find the widget that should receive the event: + QPoint qlocal, qglobal; + QWidget *widgetToGetMouse = qt_mac_getTargetForMouseEvent(theEvent, QEvent::MouseButtonPress, qlocal, qglobal, qwidget, 0); + if (!widgetToGetMouse) return NO; - Q_UNUSED(theEvent); - return !qwidget->testAttribute(Qt::WA_MacNoClickThrough); + return !widgetToGetMouse->testAttribute(Qt::WA_MacNoClickThrough); } - (NSView *)hitTest:(NSPoint)aPoint @@ -715,161 +415,119 @@ static int qCocoaViewCount = 0; - (void)mouseEntered:(NSEvent *)event { - if (!qwidget) - return; - if (qwidgetprivate->data.in_destructor) - return; - - if (!qAppInstance()->activeModalWidget() || QApplicationPrivate::tryModalHelper(qwidget, 0)) { - QEvent enterEvent(QEvent::Enter); - NSPoint windowPoint = [event locationInWindow]; - NSPoint globalPoint = [[event window] convertBaseToScreen:windowPoint]; - NSPoint viewPoint = [self convertPoint:windowPoint fromView:nil]; - QApplication::sendEvent(qwidget, &enterEvent); - qt_mouseover = qwidget; - - // Update cursor icon: - qt_mac_update_cursor_at_global_pos(flipPoint(globalPoint).toPoint()); - - // Send mouse move and hover events as well: - if (!qAppInstance()->activePopupWidget() || qAppInstance()->activePopupWidget() == qwidget->window()) { - // This mouse move event should be sendt, even when mouse - // tracking is switched off (to trigger tooltips): - NSEvent *mouseEvent = [NSEvent mouseEventWithType:NSMouseMoved - location:windowPoint modifierFlags:[event modifierFlags] timestamp:[event timestamp] - windowNumber:[event windowNumber] context:[event context] eventNumber:[event eventNumber] - clickCount:0 pressure:0]; - qt_mac_handleMouseEvent(self, mouseEvent, QEvent::MouseMove, Qt::NoButton); - - if (qwidget->testAttribute(Qt::WA_Hover)) { - QHoverEvent he(QEvent::HoverEnter, QPoint(viewPoint.x, viewPoint.y), QPoint(-1, -1)); - QApplicationPrivate::instance()->notify_helper(qwidget, &he); - } - } - } + // Cocoa will not send a move event on mouseEnter. But since + // Qt expect this, we fake one now. See also mouseExited below + // for info about enter/leave event handling + NSEvent *nsmoveEvent = [NSEvent + mouseEventWithType:NSMouseMoved + location:[[self window] mouseLocationOutsideOfEventStream] + modifierFlags: [event modifierFlags] + timestamp: [event timestamp] + windowNumber: [event windowNumber] + context: [event context] + eventNumber: [event eventNumber] + clickCount: 0 + pressure: 0]; + + // Important: Cocoa sends us mouseEnter on all views under the mouse + // and not just the one on top. Therefore, to we cannot use qwidget + // as native widget for this case. Instead, we let qt_mac_handleMouseEvent + // resolve it (last argument set to 0): + qt_mac_handleMouseEvent(nsmoveEvent, QEvent::MouseMove, Qt::NoButton, 0); } - (void)mouseExited:(NSEvent *)event { - if (!qwidget) - return; - - QEvent leaveEvent(QEvent::Leave); - NSPoint globalPoint = [[event window] convertBaseToScreen:[event locationInWindow]]; - if (!qAppInstance()->activeModalWidget() || QApplicationPrivate::tryModalHelper(qwidget, 0)) { - QApplication::sendEvent(qwidget, &leaveEvent); - - // ### Think about if it is necessary to update the cursor, should only be for a few cases. - qt_mac_update_cursor_at_global_pos(flipPoint(globalPoint).toPoint()); - if (qwidget->testAttribute(Qt::WA_Hover) - && (!qAppInstance()->activePopupWidget() || qAppInstance()->activePopupWidget() == qwidget->window())) { - QHoverEvent he(QEvent::HoverLeave, QPoint(-1, -1), - qwidget->mapFromGlobal(QApplicationPrivate::instance()->hoverGlobalPos)); - QApplicationPrivate::instance()->notify_helper(qwidget, &he); + // Note: normal enter/leave handling is done from within mouseMove. This handler + // catches the case when the mouse moves out of the window (which mouseMove do not). + // Updating the mouse cursor follows the same logic as enter/leave. And we update + // neither if a grab exists (even if the grab points to this widget, it seems, ref X11) + Q_UNUSED(event); + if (self == [[self window] contentView] && !qt_button_down && !QWidget::mouseGrabber()) { + qt_mac_update_cursor(); + // If the mouse exits the content view, but qt_mac_getTargetForMouseEvent still + // reports a target, it means that either there is a grab involved, or the mouse + // hovered over another window in the application. In both cases, move events will + // cause qt_mac_handleMouseEvent to be called, which will handle enter/leave. + QPoint qlocal, qglobal; + QWidget *widgetUnderMouse = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Leave, qlocal, qglobal, qwidget, &widgetUnderMouse); + + if (widgetUnderMouse == 0) { + QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver); + qt_last_mouse_receiver = 0; } } } - (void)flagsChanged:(NSEvent *)theEvent { - if (!qwidget) + QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget); + if (!widgetToGetKey) return; - QWidget *widgetToGetKey = qwidget; - - QWidget *popup = qAppInstance()->activePopupWidget(); - if (popup && popup != qwidget->window()) - widgetToGetKey = popup->focusWidget() ? popup->focusWidget() : popup; qt_dispatchModifiersChanged(theEvent, widgetToGetKey); [super flagsChanged:theEvent]; } - (void)mouseMoved:(NSEvent *)theEvent { - if (!qwidget) - return; - - // We always enable mouse tracking for all QCocoaView-s. In cases where we have - // child views, we will receive mouseMoved for both parent & the child (if - // mouse is over the child). We need to ignore the parent mouseMoved in such - // cases. - NSPoint windowPoint = [theEvent locationInWindow]; - NSView *candidateView = [[[self window] contentView] hitTest:windowPoint]; - if (candidateView && candidateView == self) { - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseMove, Qt::NoButton); - } + // Important: this method will only be called when the view's window is _not_ inside + // QCocoaWindow/QCocoaPanel. Otherwise, [QCocoaWindow sendEvent] will handle the event + // before it ends up here. So, this method is added for supporting QMacNativeWidget. + // TODO: Cocoa send move events to all views under the mouse. So make sure we only + // handle the event for the widget on top when using QMacNativeWidget. + qt_mac_handleMouseEvent(theEvent, QEvent::MouseMove, Qt::NoButton, qwidget); } - (void)mouseDown:(NSEvent *)theEvent { - if (!qt_button_down) - qt_button_down = qwidget; - - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonPress, Qt::LeftButton); + qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonPress, Qt::LeftButton, qwidget); // Don't call super here. This prevents us from getting the mouseUp event, // which we need to send even if the mouseDown event was not accepted. // (this is standard Qt behavior.) } - - (void)mouseUp:(NSEvent *)theEvent { - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonRelease, Qt::LeftButton); - - qt_button_down = 0; + qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonRelease, Qt::LeftButton, qwidget); } - (void)rightMouseDown:(NSEvent *)theEvent { - if (!qt_button_down) - qt_button_down = qwidget; - - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonPress, Qt::RightButton); + qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonPress, Qt::RightButton, qwidget); } - (void)rightMouseUp:(NSEvent *)theEvent { - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonRelease, Qt::RightButton); - - qt_button_down = 0; + qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonRelease, Qt::RightButton, qwidget); } - (void)otherMouseDown:(NSEvent *)theEvent { - if (!qt_button_down) - qt_button_down = qwidget; - Qt::MouseButton mouseButton = cocoaButton2QtButton([theEvent buttonNumber]); - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonPress, mouseButton); + qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonPress, mouseButton, qwidget); } - (void)otherMouseUp:(NSEvent *)theEvent { Qt::MouseButton mouseButton = cocoaButton2QtButton([theEvent buttonNumber]); - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseButtonRelease, mouseButton); - - qt_button_down = 0; + qt_mac_handleMouseEvent(theEvent, QEvent::MouseButtonRelease, mouseButton, qwidget); } - (void)mouseDragged:(NSEvent *)theEvent { - qMacDnDParams()->view = self; - qMacDnDParams()->theEvent = theEvent; - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseMove, Qt::NoButton); + qt_mac_handleMouseEvent(theEvent, QEvent::MouseMove, Qt::NoButton, qwidget); } - (void)rightMouseDragged:(NSEvent *)theEvent { - qMacDnDParams()->view = self; - qMacDnDParams()->theEvent = theEvent; - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseMove, Qt::NoButton); + qt_mac_handleMouseEvent(theEvent, QEvent::MouseMove, Qt::NoButton, qwidget); } - (void)otherMouseDragged:(NSEvent *)theEvent { - qMacDnDParams()->view = self; - qMacDnDParams()->theEvent = theEvent; - qt_mac_handleMouseEvent(self, theEvent, QEvent::MouseMove, Qt::NoButton); + qt_mac_handleMouseEvent(theEvent, QEvent::MouseMove, Qt::NoButton, qwidget); } - (void)scrollWheel:(NSEvent *)theEvent @@ -880,21 +538,14 @@ static int qCocoaViewCount = 0; [currentIManager handleMouseEvent:theEvent]; } - NSPoint windowPoint = [theEvent locationInWindow]; - NSPoint globalPoint = [[theEvent window] convertBaseToScreen:windowPoint]; - NSPoint localPoint = [self convertPoint:windowPoint fromView:nil]; - QPoint qlocal = QPoint(localPoint.x, localPoint.y); - QPoint qglobal = QPoint(globalPoint.x, flipYCoordinate(globalPoint.y)); Qt::MouseButtons buttons = QApplication::mouseButtons(); - bool wheelOK = false; Qt::KeyboardModifiers keyMods = qt_cocoaModifiers2QtModifiers([theEvent modifierFlags]); - QWidget *widgetToGetMouse = qwidget; - // if popup is open it should get wheel events if the cursor is over the popup, - // otherwise the event should be ignored. - if (QWidget *popup = qAppInstance()->activePopupWidget()) { - if (!popup->geometry().contains(qglobal)) - return; - } + + // Find the widget that should receive the event: + QPoint qlocal, qglobal; + QWidget *widgetToGetMouse = qt_mac_getTargetForMouseEvent(theEvent, QEvent::Wheel, qlocal, qglobal, qwidget, 0); + if (!widgetToGetMouse) + return; int deltaX = 0; int deltaY = 0; @@ -926,27 +577,11 @@ static int qCocoaViewCount = 0; if (deltaX != 0) { QWheelEvent qwe(qlocal, qglobal, deltaX, buttons, keyMods, Qt::Horizontal); qt_sendSpontaneousEvent(widgetToGetMouse, &qwe); - wheelOK = qwe.isAccepted(); - if (!wheelOK && QApplicationPrivate::focus_widget - && QApplicationPrivate::focus_widget != widgetToGetMouse) { - QWheelEvent qwe2(QApplicationPrivate::focus_widget->mapFromGlobal(qglobal), qglobal, - deltaX, buttons, keyMods, Qt::Horizontal); - qt_sendSpontaneousEvent(QApplicationPrivate::focus_widget, &qwe2); - wheelOK = qwe2.isAccepted(); - } } if (deltaY) { QWheelEvent qwe(qlocal, qglobal, deltaY, buttons, keyMods, Qt::Vertical); qt_sendSpontaneousEvent(widgetToGetMouse, &qwe); - wheelOK = qwe.isAccepted(); - if (!wheelOK && QApplicationPrivate::focus_widget - && QApplicationPrivate::focus_widget != widgetToGetMouse) { - QWheelEvent qwe2(QApplicationPrivate::focus_widget->mapFromGlobal(qglobal), qglobal, - deltaY, buttons, keyMods, Qt::Vertical); - qt_sendSpontaneousEvent(QApplicationPrivate::focus_widget, &qwe2); - wheelOK = qwe2.isAccepted(); - } } if (deltaZ) { @@ -954,14 +589,6 @@ static int qCocoaViewCount = 0; // try to be ahead of the pack, I'm adding this extra value. QWheelEvent qwe(qlocal, qglobal, deltaZ, buttons, keyMods, (Qt::Orientation)3); qt_sendSpontaneousEvent(widgetToGetMouse, &qwe); - wheelOK = qwe.isAccepted(); - if (!wheelOK && QApplicationPrivate::focus_widget - && QApplicationPrivate::focus_widget != widgetToGetMouse) { - QWheelEvent qwe2(QApplicationPrivate::focus_widget->mapFromGlobal(qglobal), qglobal, - deltaZ, buttons, keyMods, (Qt::Orientation)3); - qt_sendSpontaneousEvent(QApplicationPrivate::focus_widget, &qwe2); - wheelOK = qwe2.isAccepted(); - } } #endif //QT_NO_WHEELEVENT } @@ -977,35 +604,14 @@ static int qCocoaViewCount = 0; [super tabletPoint:tabletEvent]; } -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 -- (void)touchesBeganWithEvent:(NSEvent *)event; -{ - bool all = qwidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); - qt_translateRawTouchEvent(qwidget, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all)); -} - -- (void)touchesMovedWithEvent:(NSEvent *)event; -{ - bool all = qwidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); - qt_translateRawTouchEvent(qwidget, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all)); -} - -- (void)touchesEndedWithEvent:(NSEvent *)event; -{ - bool all = qwidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); - qt_translateRawTouchEvent(qwidget, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all)); -} - -- (void)touchesCancelledWithEvent:(NSEvent *)event; -{ - bool all = qwidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); - qt_translateRawTouchEvent(qwidget, QTouchEvent::TouchPad, QCocoaTouch::getCurrentTouchPointList(event, all)); -} -#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - - (void)magnifyWithEvent:(NSEvent *)event; { - if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + QPoint qlocal, qglobal; + QWidget *widgetToGetGesture = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture); + if (!widgetToGetGesture) + return; + if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0)) return; #ifndef QT_NO_GESTURES @@ -1014,13 +620,18 @@ static int qCocoaViewCount = 0; NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); qNGEvent.percentage = [event magnification]; - qt_sendSpontaneousEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent); #endif // QT_NO_GESTURES } - (void)rotateWithEvent:(NSEvent *)event; { - if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + QPoint qlocal, qglobal; + QWidget *widgetToGetGesture = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture); + if (!widgetToGetGesture) + return; + if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0)) return; #ifndef QT_NO_GESTURES @@ -1029,13 +640,18 @@ static int qCocoaViewCount = 0; NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); qNGEvent.percentage = -[event rotation]; - qt_sendSpontaneousEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent); #endif // QT_NO_GESTURES } - (void)swipeWithEvent:(NSEvent *)event; { - if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + QPoint qlocal, qglobal; + QWidget *widgetToGetGesture = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture); + if (!widgetToGetGesture) + return; + if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0)) return; #ifndef QT_NO_GESTURES @@ -1051,13 +667,18 @@ static int qCocoaViewCount = 0; qNGEvent.angle = 90.0f; else if ([event deltaY] == -1) qNGEvent.angle = 270.0f; - qt_sendSpontaneousEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent); #endif // QT_NO_GESTURES } - (void)beginGestureWithEvent:(NSEvent *)event; { - if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + QPoint qlocal, qglobal; + QWidget *widgetToGetGesture = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture); + if (!widgetToGetGesture) + return; + if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0)) return; #ifndef QT_NO_GESTURES @@ -1065,13 +686,18 @@ static int qCocoaViewCount = 0; qNGEvent.gestureType = QNativeGestureEvent::GestureBegin; NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); - qt_sendSpontaneousEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent); #endif // QT_NO_GESTURES } - (void)endGestureWithEvent:(NSEvent *)event; { - if (!QApplicationPrivate::tryModalHelper(qwidget, 0)) + QPoint qlocal, qglobal; + QWidget *widgetToGetGesture = 0; + qt_mac_getTargetForMouseEvent(event, QEvent::Gesture, qlocal, qglobal, qwidget, &widgetToGetGesture); + if (!widgetToGetGesture) + return; + if (!QApplicationPrivate::tryModalHelper(widgetToGetGesture, 0)) return; #ifndef QT_NO_GESTURES @@ -1079,9 +705,9 @@ static int qCocoaViewCount = 0; qNGEvent.gestureType = QNativeGestureEvent::GestureEnd; NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); - qt_sendSpontaneousEvent(qwidget, &qNGEvent); -#endif // QT_NO_GESTURES + qt_sendSpontaneousEvent(widgetToGetGesture, &qNGEvent); } +#endif // QT_NO_GESTURES - (void)frameDidChange:(NSNotification *)note { @@ -1124,16 +750,32 @@ static int qCocoaViewCount = 0; { if (!qwidget) return NO; - // disabled widget shouldn't get focus even if it's a window. + + // Disabled widget shouldn't get focus even if it's a window. // hence disabled windows will not get any key or mouse events. if (!qwidget->isEnabled()) return NO; - // Before accepting the focus for a window, we check that - // the focusWidget (if any) is not contained in the same window. - if (qwidget->isWindow() && !qt_widget_private(qwidget)->topData()->embedded - && (!qApp->focusWidget() || qApp->focusWidget()->window() != qwidget)) { - return YES; // Always do it, so that windows can accept key press events. + + if (qwidget->isWindow() && !qt_widget_private(qwidget)->topData()->embedded) { + QWidget *focusWidget = qApp->focusWidget(); + if (!focusWidget) { + // There is no focus widget, but we still want to receive key events + // for shortcut handling etc. So we accept first responer for the + // content view as a last resort: + return YES; + } + if (!focusWidget->internalWinId() && focusWidget->nativeParentWidget() == qwidget) { + // The current focus widget is alien, and hence, cannot get acceptsFirstResponder + // calls. Since the focus widget is a child of qwidget, we let this view say YES: + return YES; + } + if (focusWidget->window() != qwidget) { + // The current focus widget is in another window. Since cocoa + // suggest that this window should be key now, we accept: + return YES; + } } + return qwidget->focusPolicy() != Qt::NoFocus; } @@ -1141,10 +783,13 @@ static int qCocoaViewCount = 0; { if (!qwidget) return NO; + // Seems like the following test only triggers if this // view is inside a QMacNativeWidget: - if (qwidget == QApplication::focusWidget()) - qwidget->clearFocus(); +// if (QWidget *fw = QApplication::focusWidget()) { +// if (qwidget == fw || qwidget == fw->nativeParentWidget()) +// fw->clearFocus(); +// } return YES; } @@ -1173,11 +818,11 @@ static int qCocoaViewCount = 0; { Q_UNUSED(anImage); Q_UNUSED(aPoint); - qMacDnDParams()->performedAction = operation; + macCurrentDnDParameters()->performedAction = operation; if (QDragManager::self()->object && QDragManager::self()->dragPrivate()->executed_action != Qt::ActionMask) { - qMacDnDParams()->performedAction = - qt_mac_mapDropAction(QDragManager::self()->dragPrivate()->executed_action); + macCurrentDnDParameters()->performedAction = + qt_mac_mapDropAction(QDragManager::self()->dragPrivate()->executed_action); } } @@ -1192,51 +837,37 @@ static int qCocoaViewCount = 0; qwidgetprivate = 0; } -- (BOOL)qt_leftButtonIsRightButton -{ - return leftButtonIsRightButton; -} - -- (void)qt_setLeftButtonIsRightButton:(BOOL)isSwapped -{ - leftButtonIsRightButton = isSwapped; -} - -+ (DnDParams*)currentMouseEvent -{ - return qMacDnDParams(); -} - - (void)keyDown:(NSEvent *)theEvent { - sendKeyEvents = true; - - QWidget *widgetToGetKey = qwidget; + if (!qwidget) + return; + QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget); + if (!widgetToGetKey) + return; - QWidget *popup = qAppInstance()->activePopupWidget(); - bool sendToPopup = false; - if (popup && popup != qwidget->window()) { - widgetToGetKey = popup->focusWidget() ? popup->focusWidget() : popup; - sendToPopup = true; - } + sendKeyEvents = true; if (widgetToGetKey->testAttribute(Qt::WA_InputMethodEnabled) && !(widgetToGetKey->inputMethodHints() & Qt::ImhDigitsOnly || widgetToGetKey->inputMethodHints() & Qt::ImhFormattedNumbersOnly || widgetToGetKey->inputMethodHints() & Qt::ImhHiddenText)) { fromKeyDownEvent = true; - [qt_mac_nativeview_for(widgetToGetKey) interpretKeyEvents:[NSArray arrayWithObject: theEvent]]; + [qt_mac_nativeview_for(qwidget) interpretKeyEvents:[NSArray arrayWithObject: theEvent]]; fromKeyDownEvent = false; } + if (sendKeyEvents && !composing) { - bool keyOK = qt_dispatchKeyEvent(theEvent, widgetToGetKey); - if (!keyOK && !sendToPopup) { - // find the first responder that is not created by Qt and forward - // the event to it (for example if Qt widget is embedded into native). + bool keyEventEaten = qt_dispatchKeyEvent(theEvent, widgetToGetKey); + if (!keyEventEaten && qwidget) { + // The event is not yet eaten, and if Qt is embedded inside a native + // cocoa application, send it to first responder not owned by Qt. + // The exception is if widgetToGetKey was redirected to a popup. QWidget *toplevel = qwidget->window(); - if (toplevel && qt_widget_private(toplevel)->topData()->embedded) { - if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview]) - [w keyDown:theEvent]; + if (toplevel == widgetToGetKey->window()) { + if (qt_widget_private(toplevel)->topData()->embedded) { + if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview]) + [w keyDown:theEvent]; + } } } } @@ -1246,12 +877,21 @@ static int qCocoaViewCount = 0; - (void)keyUp:(NSEvent *)theEvent { if (sendKeyEvents) { - bool keyOK = qt_dispatchKeyEvent(theEvent, qwidget); - if (!keyOK) { + QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget); + if (!widgetToGetKey) + return; + + bool keyEventEaten = qt_dispatchKeyEvent(theEvent, widgetToGetKey); + if (!keyEventEaten && qwidget) { + // The event is not yet eaten, and if Qt is embedded inside a native + // cocoa application, send it to first responder not owned by Qt. + // The exception is if widgetToGetKey was redirected to a popup. QWidget *toplevel = qwidget->window(); - if (toplevel && qt_widget_private(toplevel)->topData()->embedded) { - if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview]) - [w keyUp:theEvent]; + if (toplevel == widgetToGetKey->window()) { + if (qt_widget_private(toplevel)->topData()->embedded) { + if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview]) + [w keyUp:theEvent]; + } } } } @@ -1299,13 +939,14 @@ static int qCocoaViewCount = 0; // When entering characters through Character Viewer or Keyboard Viewer, the text is passed // through this insertText method. Since we dont receive a keyDown Event in such cases, the // composing flag will be false. - if (([aString length] && composing) || !fromKeyDownEvent) { + if (([aString length] && composing) || !fromKeyDownEvent) { // Send the commit string to the widget. composing = false; sendKeyEvents = false; QInputMethodEvent e; e.setCommitString(commitText); - qt_sendSpontaneousEvent(qwidget, &e); + if (QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget)) + qt_sendSpontaneousEvent(widgetToGetKey, &e); } else { // The key sequence "`q" on a French Keyboard will generate two calls to insertText before // it returns from interpretKeyEvents. The first call will turn off 'composing' and accept @@ -1369,8 +1010,11 @@ static int qCocoaViewCount = 0; 0, composingLength, format); } *composingText = qtText; + QInputMethodEvent e(qtText, attrs); - qt_sendSpontaneousEvent(qwidget, &e); + if (QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget)) + qt_sendSpontaneousEvent(widgetToGetKey, &e); + if (!composingLength) composing = false; } @@ -1380,7 +1024,8 @@ static int qCocoaViewCount = 0; if (composing) { QInputMethodEvent e; e.setCommitString(*composingText); - qt_sendSpontaneousEvent(qwidget, &e); + if (QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget)) + qt_sendSpontaneousEvent(widgetToGetKey, &e); } composingText->clear(); composing = false; @@ -1453,8 +1098,12 @@ static int qCocoaViewCount = 0; { Q_UNUSED(theRange); // The returned rect is always based on the internal cursor. - QRect mr(qwidget->inputMethodQuery(Qt::ImMicroFocus).toRect()); - QPoint mp(qwidget->mapToGlobal(QPoint(mr.bottomLeft()))); + QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget); + if (!widgetToGetKey) + return NSZeroRect; + + QRect mr(widgetToGetKey->inputMethodQuery(Qt::ImMicroFocus).toRect()); + QPoint mp(widgetToGetKey->mapToGlobal(QPoint(mr.bottomLeft()))); NSRect rect ; rect.origin.x = mp.x(); rect.origin.y = flipYCoordinate(mp.y()); @@ -1472,10 +1121,11 @@ static int qCocoaViewCount = 0; - (NSArray*) validAttributesForMarkedText { - if (qwidget == 0) + QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget); + if (!widgetToGetKey) return nil; - if (!qwidget->testAttribute(Qt::WA_InputMethodEnabled)) + if (!widgetToGetKey->testAttribute(Qt::WA_InputMethodEnabled)) return nil; // Not sure if that's correct, but it's saves a malloc. // Support only underline color/style. @@ -1489,7 +1139,7 @@ void QMacInputContext::reset() { QWidget *w = QInputContext::focusWidget(); if (w) { - NSView *view = qt_mac_nativeview_for(w); + NSView *view = qt_mac_effectiveview_for(w); if ([view isKindOfClass:[QT_MANGLE_NAMESPACE(QCocoaView) class]]) { QMacCocoaAutoReleasePool pool; QT_MANGLE_NAMESPACE(QCocoaView) *qc = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(view); @@ -1506,7 +1156,7 @@ bool QMacInputContext::isComposing() const { QWidget *w = QInputContext::focusWidget(); if (w) { - NSView *view = qt_mac_nativeview_for(w); + NSView *view = qt_mac_effectiveview_for(w); if ([view isKindOfClass:[QT_MANGLE_NAMESPACE(QCocoaView) class]]) { return [static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(view) isComposing]; } @@ -1599,39 +1249,45 @@ Qt::DropAction QDragManager::drag(QDrag *o) } else { hotspot = dragPrivate()->hotspot; } - // convert the image to NSImage. + + // Convert the image to NSImage: NSImage *image = (NSImage *)qt_mac_create_nsimage(pix); [image retain]; - DnDParams dndParams = *[QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]; - // save supported actions - [dndParams.view setSupportedActions: qt_mac_mapDropActions(dragPrivate()->possible_actions)]; - NSPoint imageLoc = {dndParams.localPoint.x - hotspot.x(), - dndParams.localPoint.y + pix.height() - hotspot.y()}; + + DnDParams *dndParams = macCurrentDnDParameters(); + QT_MANGLE_NAMESPACE(QCocoaView) *theView = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(dndParams->view); + + // Save supported actions: + [theView setSupportedActions: qt_mac_mapDropActions(dragPrivate()->possible_actions)]; + QPoint pointInView = [theView qt_qwidget]->mapFromGlobal(dndParams->globalPoint); + NSPoint imageLoc = {pointInView.x() - hotspot.x(), pointInView.y() + pix.height() - hotspot.y()}; NSSize mouseOffset = {0.0, 0.0}; NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; - NSPoint windowPoint = [dndParams.theEvent locationInWindow]; dragPrivate()->executed_action = Qt::ActionMask; - // do the drag - [dndParams.view retain]; - [dndParams.view dragImage:image - at:imageLoc - offset:mouseOffset - event:dndParams.theEvent - pasteboard:pboard - source:dndParams.view - slideBack:YES]; - // reset the implicit grab widget when drag ends because we will not - // receive the mouse release event when DND is active. + + // Execute the drag: + [theView retain]; + [theView dragImage:image + at:imageLoc + offset:mouseOffset + event:dndParams->theEvent + pasteboard:pboard + source:theView + slideBack:YES]; + + // Reset the implicit grab widget when drag ends because we will not + // receive the mouse release event when DND is active: qt_button_down = 0; - [dndParams.view release]; + [theView release]; [image release]; if (dragPrivate()) dragPrivate()->executed_action = Qt::IgnoreAction; object = 0; - Qt::DropAction performedAction(qt_mac_mapNSDragOperation(qMacDnDParams()->performedAction)); - // do post drag processing, if required. - if(performedAction != Qt::IgnoreAction) { - // check if the receiver points us to a file location. + Qt::DropAction performedAction(qt_mac_mapNSDragOperation(dndParams->performedAction)); + + // Do post drag processing, if required. + if (performedAction != Qt::IgnoreAction) { + // Check if the receiver points us to a file location. // if so, we need to do the file copy/move ourselves. QCFType<CFURLRef> pasteLocation = 0; PasteboardCopyPasteLocation(dragBoard.pasteBoard(), &pasteLocation); @@ -1648,6 +1304,8 @@ Qt::DropAction QDragManager::drag(QDrag *o) } } } + + // Clean-up: o->setMimeData(0); o->deleteLater(); return performedAction; diff --git a/src/gui/kernel/qcocoaview_mac_p.h b/src/gui/kernel/qcocoaview_mac_p.h index 511423357..2443129 100644 --- a/src/gui/kernel/qcocoaview_mac_p.h +++ b/src/gui/kernel/qcocoaview_mac_p.h @@ -58,57 +58,29 @@ QT_FORWARD_DECLARE_CLASS(QWidgetPrivate); QT_FORWARD_DECLARE_CLASS(QWidget); QT_FORWARD_DECLARE_CLASS(QEvent); -QT_FORWARD_DECLARE_CLASS(QCocoaDropData); QT_FORWARD_DECLARE_CLASS(QString); QT_FORWARD_DECLARE_CLASS(QStringList); -QT_BEGIN_NAMESPACE -struct DnDParams -{ - QT_MANGLE_NAMESPACE(QCocoaView) *view; - NSEvent *theEvent; - NSPoint localPoint; - NSDragOperation performedAction; - NSPoint activeDragEnterPos; -}; - -QT_END_NAMESPACE - -QT_FORWARD_DECLARE_STRUCT(DnDParams); - Q_GUI_EXPORT @interface QT_MANGLE_NAMESPACE(QCocoaView) : NSControl <NSTextInput> { QWidget *qwidget; QWidgetPrivate *qwidgetprivate; - bool leftButtonIsRightButton; - QCocoaDropData *dropData; NSDragOperation supportedActions; bool composing; int composingLength; bool sendKeyEvents; bool fromKeyDownEvent; QString *composingText; - NSInteger dragEnterSequence; } - (id)initWithQWidget:(QWidget *)widget widgetPrivate:(QWidgetPrivate *)widgetprivate; - (void) finishInitWithQWidget:(QWidget *)widget widgetPrivate:(QWidgetPrivate *)widgetprivate; - (void)frameDidChange:(NSNotification *)note; -- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender; -- (NSDragOperation)draggingUpdated:(id < NSDraggingInfo >)sender; -- (void)draggingExited:(id < NSDraggingInfo >)sender; -- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender; -- (void)removeDropData; -- (void)addDropData:(id <NSDraggingInfo>)sender; - (void)setSupportedActions:(NSDragOperation)actions; - (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal; - (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation; - (BOOL)isComposing; - (QWidget *)qt_qwidget; - (void) qt_clearQWidget; -- (BOOL)qt_leftButtonIsRightButton; -- (void)qt_setLeftButtonIsRightButton:(BOOL)isSwapped; -- (void)changeDraggingCursor:(NSDragOperation)newOperation; -+ (DnDParams*)currentMouseEvent; @end #endif diff --git a/src/gui/kernel/qcocoawindow_mac.mm b/src/gui/kernel/qcocoawindow_mac.mm index f1b642b..a4ab224 100644 --- a/src/gui/kernel/qcocoawindow_mac.mm +++ b/src/gui/kernel/qcocoawindow_mac.mm @@ -47,6 +47,8 @@ #import <private/qt_cocoa_helpers_mac_p.h> #import <private/qcocoawindowcustomthemeframe_mac_p.h> #import <private/qcocoaapplication_mac_p.h> +#import <private/qdnd_p.h> +#import <private/qmultitouch_mac_p.h> #include <QtGui/QWidget> diff --git a/src/gui/kernel/qcocoawindow_mac_p.h b/src/gui/kernel/qcocoawindow_mac_p.h index 21f82df..028b809 100644 --- a/src/gui/kernel/qcocoawindow_mac_p.h +++ b/src/gui/kernel/qcocoawindow_mac_p.h @@ -50,17 +50,20 @@ // We mean it. // +#ifndef QCOCOAWINDOW_MAC_P +#define QCOCOAWINDOW_MAC_P + #ifdef QT_MAC_USE_COCOA #include "qmacdefines_mac.h" #import <Cocoa/Cocoa.h> #include <private/qapplication_p.h> #include <private/qbackingstore_p.h> - enum { QtMacCustomizeWindow = 1 << 21 }; // This will one day be run over by QT_FORWARD_DECLARE_CLASS(QWidget); QT_FORWARD_DECLARE_CLASS(QStringList); +QT_FORWARD_DECLARE_CLASS(QCocoaDropData); @interface NSWindow (QtCoverForHackWithCategory) + (Class)frameViewClassForStyleMask:(NSUInteger)styleMask; @@ -72,13 +75,16 @@ QT_FORWARD_DECLARE_CLASS(QStringList); @end @interface QT_MANGLE_NAMESPACE(QCocoaWindow) : NSWindow { - bool leftButtonIsRightButton; QStringList *currentCustomDragTypes; + QCocoaDropData *dropData; + NSInteger dragEnterSequence; } + (Class)frameViewClassForStyleMask:(NSUInteger)styleMask; - (void)registerDragTypes; +- (void)drawRectOriginal:(NSRect)rect; @end #endif +#endif diff --git a/src/gui/kernel/qcursor.h b/src/gui/kernel/qcursor.h index 62d2f41..9d22b7c 100644 --- a/src/gui/kernel/qcursor.h +++ b/src/gui/kernel/qcursor.h @@ -77,7 +77,7 @@ class QBitmap; class QPixmap; #if defined(Q_WS_MAC) -void qt_mac_set_cursor(const QCursor *c, const QPoint &p); +void qt_mac_set_cursor(const QCursor *c); #endif #if defined(Q_OS_SYMBIAN) extern void qt_symbian_show_pointer_sprite(); @@ -141,7 +141,8 @@ private: QCursorData *d; #if defined(Q_WS_MAC) friend void *qt_mac_nsCursorForQCursor(const QCursor &c); - friend void qt_mac_set_cursor(const QCursor *c, const QPoint &p); + friend void qt_mac_set_cursor(const QCursor *c); + friend void qt_mac_updateCursorWithWidgetUnderMouse(QWidget *widgetUnderMouse); #endif #if defined(Q_OS_SYMBIAN) friend void qt_symbian_show_pointer_sprite(); diff --git a/src/gui/kernel/qcursor_mac.mm b/src/gui/kernel/qcursor_mac.mm index c3d6c54..cebe789 100644 --- a/src/gui/kernel/qcursor_mac.mm +++ b/src/gui/kernel/qcursor_mac.mm @@ -50,6 +50,7 @@ #include <AppKit/NSCursor.h> #include <qpainter.h> #include <private/qt_cocoa_helpers_mac_p.h> +#include <private/qapplication_p.h> QT_BEGIN_NAMESPACE @@ -60,6 +61,7 @@ extern QCursorData *qt_cursorTable[Qt::LastCursor + 1]; extern OSWindowRef qt_mac_window_for(const QWidget *); //qwidget_mac.cpp extern GrafPtr qt_mac_qd_context(const QPaintDevice *); //qpaintdevice_mac.cpp extern bool qt_sendSpontaneousEvent(QObject *, QEvent *); //qapplication_mac.cpp +extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp /***************************************************************************** Internal QCursorData class @@ -95,18 +97,19 @@ protected: } }; -void *qt_mac_nsCursorForQCursor(const QCursor &c) +inline void *qt_mac_nsCursorForQCursor(const QCursor &c) { c.d->update(); return [[static_cast<NSCursor *>(c.d->curs.cp.nscursor) retain] autorelease]; } static QCursorData *currentCursor = 0; //current cursor -void qt_mac_set_cursor(const QCursor *c, const QPoint &) + +void qt_mac_set_cursor(const QCursor *c) { #ifdef QT_MAC_USE_COCOA - Q_UNUSED(c); - return; + QMacCocoaAutoReleasePool pool; + [static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(*c)) set]; #else if (!c) { currentCursor = 0; @@ -128,35 +131,122 @@ void qt_mac_set_cursor(const QCursor *c, const QPoint &) c->d->curs.tc.anim->start(c->d->curs.tc.curs); } } + currentCursor = c->d; #endif } -void qt_mac_update_cursor_at_global_pos(const QPoint &globalPos) +static QPointer<QWidget> lastWidgetUnderMouse = 0; +static QPointer<QWidget> lastMouseCursorWidget = 0; +static bool qt_button_down_on_prev_call = false; +static QCursor *grabCursor = 0; + +void qt_mac_updateCursorWithWidgetUnderMouse(QWidget *widgetUnderMouse) { -#ifdef QT_MAC_USE_COCOA - Q_UNUSED(globalPos); - return; -#else QCursor cursor(Qt::ArrowCursor); + if (qt_button_down) { + // The widget that is currently pressed + // grabs the mouse cursor: + widgetUnderMouse = qt_button_down; + qt_button_down_on_prev_call = true; + } else if (qt_button_down_on_prev_call) { + // Grab has been released, so do + // a full check: + qt_button_down_on_prev_call = false; + lastWidgetUnderMouse = 0; + lastMouseCursorWidget = 0; + } + if (QApplication::overrideCursor()) { cursor = *QApplication::overrideCursor(); - } else { - for(QWidget *w = QApplication::widgetAt(globalPos); w; w = w->parentWidget()) { - if(w->testAttribute(Qt::WA_SetCursor)) { - cursor = w->cursor(); - break; + } else if (grabCursor) { + cursor = *grabCursor; + } else if (widgetUnderMouse) { + if (widgetUnderMouse == lastWidgetUnderMouse) { + // Optimization that should hit when the widget under + // the mouse does not change as the mouse moves: + if (lastMouseCursorWidget) + cursor = lastMouseCursorWidget->cursor(); + } else { + QWidget *w = widgetUnderMouse; + for (; w; w = w->parentWidget()) { + if (w->testAttribute(Qt::WA_SetCursor)) { + cursor = w->cursor(); + break; + } + if (w->isWindow()) + break; } + // One final check in case we ran out of parents in the loop: + if (w && !w->testAttribute(Qt::WA_SetCursor)) + w = 0; + + lastWidgetUnderMouse = widgetUnderMouse; + lastMouseCursorWidget = w; } } - qt_mac_set_cursor(&cursor, globalPos); + +#ifdef QT_MAC_USE_COCOA + cursor.d->update(); + NSCursor *nsCursor = static_cast<NSCursor *>(cursor.d->curs.cp.nscursor); + if ([NSCursor currentCursor] != nsCursor) { + QMacCocoaAutoReleasePool pool; + [nsCursor set]; + } +#else + qt_mac_set_cursor(&cursor); #endif } void qt_mac_update_cursor() { - qt_mac_update_cursor_at_global_pos(QCursor::pos()); + // This function is similar to qt_mac_updateCursorWithWidgetUnderMouse + // except that is clears the optimization cache, and finds the widget + // under mouse itself. Clearing the cache is useful in cases where the + // application has been deactivated/activated etc. + // NB: since we dont have any true native widget, the call to + // qt_mac_getTargetForMouseEvent will fail when the mouse is over QMacNativeWidgets. +#ifdef QT_MAC_USE_COCOA + lastWidgetUnderMouse = 0; + lastMouseCursorWidget = 0; + QWidget *widgetUnderMouse = 0; + + if (qt_button_down) { + widgetUnderMouse = qt_button_down; + } else { + QPoint localPoint; + QPoint globalPoint = QCursor::pos(); + qt_mac_getTargetForMouseEvent(0, QEvent::None, localPoint, globalPoint, 0, &widgetUnderMouse); + } + qt_mac_updateCursorWithWidgetUnderMouse(widgetUnderMouse); +#else + qt_mac_updateCursorWithWidgetUnderMouse(QApplication::widgetAt(QCursor::pos())); +#endif +} + +void qt_mac_setMouseGrabCursor(bool set, QCursor *const cursor = 0) +{ + if (grabCursor) { + delete grabCursor; + grabCursor = 0; + } + if (set) { + if (cursor) + grabCursor = new QCursor(*cursor); + else if (lastMouseCursorWidget) + grabCursor = new QCursor(lastMouseCursorWidget->cursor()); + else + grabCursor = new QCursor(Qt::ArrowCursor); + } + qt_mac_update_cursor(); +} + +#ifndef QT_MAC_USE_COCOA +void qt_mac_update_cursor_at_global_pos(const QPoint &globalPos) +{ + qt_mac_updateCursorWithWidgetUnderMouse(QApplication::widgetAt(globalPos)); } +#endif static int nextCursorId = Qt::BitmapCursor; @@ -427,7 +517,8 @@ void QCursorData::update() break; case Qt::DragCopyCursor: type = QCursorData::TYPE_ThemeCursor; - curs.cp.nscursor = [NSCursor dragCopyCursor]; + if ([NSCursor respondsToSelector:@selector(dragCopyCursor)]) + curs.cp.nscursor = [NSCursor performSelector:@selector(dragCopyCursor)]; break; case Qt::DragMoveCursor: type = QCursorData::TYPE_ThemeCursor; @@ -435,7 +526,8 @@ void QCursorData::update() break; case Qt::DragLinkCursor: type = QCursorData::TYPE_ThemeCursor; - curs.cp.nscursor = [NSCursor dragLinkCursor]; + if ([NSCursor respondsToSelector:@selector(dragLinkCursor)]) + curs.cp.nscursor = [NSCursor performSelector:@selector(dragLinkCursor)]; break; #define QT_USE_APPROXIMATE_CURSORS #ifdef QT_USE_APPROXIMATE_CURSORS diff --git a/src/gui/kernel/qdnd_mac.mm b/src/gui/kernel/qdnd_mac.mm index 844f5e3..6f43fb6 100644 --- a/src/gui/kernel/qdnd_mac.mm +++ b/src/gui/kernel/qdnd_mac.mm @@ -491,7 +491,7 @@ bool QWidgetPrivate::qt_mac_dnd_event(uint kind, DragRef dragRef) SetThemeCursor(cursor); } if(found_cursor) { - qt_mac_set_cursor(0, QPoint()); //just use our's + qt_mac_set_cursor(0); //just use our's } else { QCursor cursor(Qt::ArrowCursor); if(qApp && qApp->overrideCursor()) { @@ -504,7 +504,7 @@ bool QWidgetPrivate::qt_mac_dnd_event(uint kind, DragRef dragRef) } } } - qt_mac_set_cursor(&cursor, QPoint(mouse.h, mouse.v)); + qt_mac_set_cursor(&cursor); } //idle things diff --git a/src/gui/kernel/qt_cocoa_helpers_mac.mm b/src/gui/kernel/qt_cocoa_helpers_mac.mm index 48d21e9..7a4af8f 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac.mm +++ b/src/gui/kernel/qt_cocoa_helpers_mac.mm @@ -89,9 +89,14 @@ #include <private/qcocoaview_mac_p.h> #include <private/qkeymapper_p.h> #include <private/qwidget_p.h> +#include <private/qcocoawindow_mac_p.h> QT_BEGIN_NAMESPACE +// Cmd + left mousebutton should produce a right button +// press (mainly for mac users with one-button mice): +static bool qt_leftButtonIsRightButton = false; + Q_GLOBAL_STATIC(QMacWindowFader, macwindowFader); QMacWindowFader::QMacWindowFader() @@ -141,6 +146,9 @@ void QMacWindowFader::performFade() extern bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event); // qapplication.cpp; extern QWidget * mac_mouse_grabber; extern QWidget *qt_button_down; //qapplication_mac.cpp +extern QPointer<QWidget> qt_last_mouse_receiver; +extern OSViewRef qt_mac_effectiveview_for(const QWidget *w); +extern void qt_mac_updateCursorWithWidgetUnderMouse(QWidget *widgetUnderMouse); // qcursor_mac.mm void macWindowFade(void * /*OSWindowRef*/ window, float durationSeconds) { @@ -167,6 +175,70 @@ void macWindowFade(void * /*OSWindowRef*/ window, float durationSeconds) } } } +struct dndenum_mapper +{ + NSDragOperation mac_code; + Qt::DropAction qt_code; + bool Qt2Mac; +}; + +#ifdef QT_MAC_USE_COCOA && __OBJC__ + +static dndenum_mapper dnd_enums[] = { + { NSDragOperationLink, Qt::LinkAction, true }, + { NSDragOperationMove, Qt::MoveAction, true }, + { NSDragOperationCopy, Qt::CopyAction, true }, + { NSDragOperationGeneric, Qt::CopyAction, false }, + { NSDragOperationEvery, Qt::ActionMask, false }, + { NSDragOperationNone, Qt::IgnoreAction, false } +}; + +NSDragOperation qt_mac_mapDropAction(Qt::DropAction action) +{ + for (int i=0; dnd_enums[i].qt_code; i++) { + if (dnd_enums[i].Qt2Mac && (action & dnd_enums[i].qt_code)) { + return dnd_enums[i].mac_code; + } + } + return NSDragOperationNone; +} + +NSDragOperation qt_mac_mapDropActions(Qt::DropActions actions) +{ + NSDragOperation nsActions = NSDragOperationNone; + for (int i=0; dnd_enums[i].qt_code; i++) { + if (dnd_enums[i].Qt2Mac && (actions & dnd_enums[i].qt_code)) + nsActions |= dnd_enums[i].mac_code; + } + return nsActions; +} + +Qt::DropAction qt_mac_mapNSDragOperation(NSDragOperation nsActions) +{ + Qt::DropAction action = Qt::IgnoreAction; + for (int i=0; dnd_enums[i].mac_code; i++) { + if (nsActions & dnd_enums[i].mac_code) + return dnd_enums[i].qt_code; + } + return action; +} + +Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions) +{ + Qt::DropActions actions = Qt::IgnoreAction; + for (int i=0; dnd_enums[i].mac_code; i++) { + if (nsActions & dnd_enums[i].mac_code) + actions |= dnd_enums[i].qt_code; + } + return actions; +} + +Q_GLOBAL_STATIC(DnDParams, currentDnDParameters); +DnDParams *macCurrentDnDParameters() +{ + return currentDnDParameters(); +} +#endif bool macWindowIsTextured( void * /*OSWindowRef*/ window ) { @@ -301,7 +373,7 @@ bool qt_mac_checkForNativeSizeGrip(const QWidget *widget) HIViewFindByID(HIViewGetRoot(HIViewGetWindow(HIViewRef(widget->winId()))), kHIViewWindowGrowBoxID, &nativeSizeGrip); return (nativeSizeGrip != 0); #else - return [[reinterpret_cast<NSView *>(widget->winId()) window] showsResizeIndicator]; + return [[reinterpret_cast<NSView *>(widget->effectiveWinId()) window] showsResizeIndicator]; #endif } struct qt_mac_enum_mapper @@ -517,8 +589,12 @@ static const KeyPair entries[NumEntries] = { { NSNewlineCharacter, Qt::Key_Return }, { NSCarriageReturnCharacter, Qt::Key_Return }, { NSBackTabCharacter, Qt::Key_Backtab }, - { NSDeleteCharacter, Qt::Key_Delete }, { kEscapeCharCode, Qt::Key_Escape }, + // Cocoa sends us delete when pressing backspace! + // (NB when we reverse this list in qtKey2CocoaKey, there + // will be two indices of Qt::Key_Backspace. But is seems to work + // ok for menu shortcuts (which uses that function): + { NSDeleteCharacter, Qt::Key_Backspace }, { NSUpArrowFunctionKey, Qt::Key_Up }, { NSDownArrowFunctionKey, Qt::Key_Down }, { NSLeftArrowFunctionKey, Qt::Key_Left }, @@ -731,7 +807,6 @@ Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum) return Qt::NoButton; } -// Helper to share code between QCocoaWindow and QCocoaView bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEvent) { #ifndef QT_MAC_USE_COCOA @@ -743,6 +818,7 @@ bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEve EventRef key_event = static_cast<EventRef>(const_cast<void *>([event eventRef])); Q_ASSERT(key_event); unsigned int info = 0; + if ([event type] == NSKeyDown) { NSString *characters = [event characters]; if ([characters length]) { @@ -752,19 +828,12 @@ bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEve } } - // Redirect keys to alien widgets. - if (widgetToGetEvent->testAttribute(Qt::WA_NativeWindow) == false) { - widgetToGetEvent = qApp->focusWidget(); - } - - if (widgetToGetEvent == 0) - return false; - if (qt_mac_sendMacEventToWidget(widgetToGetEvent, key_event)) return true; if (mustUseCocoaKeyEvent()) return qt_dispatchKeyEventWithCocoa(keyEvent, widgetToGetEvent); + bool consumed = qt_keymapper_private()->translateKeyEvent(widgetToGetEvent, 0, key_event, &info, true); return consumed && (info != 0); #endif @@ -788,7 +857,6 @@ void qt_dispatchModifiersChanged(void * /*NSEvent * */flagsChangedEvent, QWidget #endif } - QPointF flipPoint(const NSPoint &p) { return QPointF(p.x, flipYCoordinate(p.y)); @@ -804,21 +872,15 @@ NSPoint flipPoint(const QPointF &p) return NSMakePoint(p.x(), flipYCoordinate(p.y())); } -void qt_mac_dispatchNCMouseMessage(void * /* NSWindow* */eventWindow, void * /* NSEvent* */mouseEvent, - QWidget *widgetToGetEvent, bool &leftButtonIsRightButton) +#if QT_MAC_USE_COCOA && __OBJC__ + +void qt_mac_handleNonClientAreaMouseEvent(NSWindow *window, NSEvent *event) { -#ifndef QT_MAC_USE_COCOA - Q_UNUSED(eventWindow); - Q_UNUSED(mouseEvent); - Q_UNUSED(widgetToGetEvent); - Q_UNUSED(leftButtonIsRightButton); -#else + QWidget *widgetToGetEvent = [window QT_MANGLE_NAMESPACE(qt_qwidget)]; if (widgetToGetEvent == 0) return; - NSWindow *window = static_cast<NSWindow *>(eventWindow); - NSEvent *event = static_cast<NSEvent *>(mouseEvent); - NSEventType evtType = [event type]; + NSEventType evtType = [event type]; QPoint qlocalPoint; QPoint qglobalPoint; bool processThisEvent = false; @@ -936,12 +998,12 @@ void qt_mac_dispatchNCMouseMessage(void * /* NSWindow* */eventWindow, void * /* : QEvent::MouseButtonDblClick; if (button == Qt::LeftButton && (keyMods & Qt::MetaModifier)) { button = Qt::RightButton; - leftButtonIsRightButton = true; + qt_leftButtonIsRightButton = true; } } else if (eventType == QEvent::NonClientAreaMouseButtonRelease || eventType == QEvent::MouseButtonRelease) { - if (button == Qt::LeftButton && leftButtonIsRightButton) { + if (button == Qt::LeftButton && qt_leftButtonIsRightButton) { button = Qt::RightButton; - leftButtonIsRightButton = false; + qt_leftButtonIsRightButton = false; } } @@ -961,97 +1023,197 @@ void qt_mac_dispatchNCMouseMessage(void * /* NSWindow* */eventWindow, void * /* // However we might need to unset it if the event is Release. if (eventType == QEvent::MouseButtonRelease) qt_button_down = 0; -#endif } -bool qt_mac_handleMouseEvent(void * /* NSView * */view, void * /* NSEvent * */event, QEvent::Type eventType, Qt::MouseButton button) +QWidget *qt_mac_getTargetForKeyEvent(QWidget *widgetThatReceivedEvent) +{ + if (QWidget *popup = QApplication::activePopupWidget()) { + QWidget *focusInPopup = popup->focusWidget(); + return focusInPopup ? focusInPopup : popup; + } + + QWidget *widgetToGetKey = qApp->focusWidget(); + if (!widgetToGetKey) + widgetToGetKey = widgetThatReceivedEvent; + + return widgetToGetKey; +} + +// This function will find the widget that should receive the +// mouse event. Because of explicit/implicit mouse grabs, popups, +// etc, this might not end up being the same as the widget under +// the mouse (which is more interresting when handling enter/leave +// events +QWidget *qt_mac_getTargetForMouseEvent( + // You can call this function without providing an event. + // If so, set returnGlobalPoint before the call. + NSEvent *event, + QEvent::Type eventType, + QPoint &returnLocalPoint, + QPoint &returnGlobalPoint, + QWidget *nativeWidget, + QWidget **returnWidgetUnderMouse) { -#ifndef QT_MAC_USE_COCOA - Q_UNUSED(view); Q_UNUSED(event); - Q_UNUSED(eventType); - Q_UNUSED(button); - return false; -#else - QT_MANGLE_NAMESPACE(QCocoaView) *theView = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(view); - NSEvent *theEvent = static_cast<NSEvent *>(event); + returnGlobalPoint = flipPoint([NSEvent mouseLocation]).toPoint(); + QWidget *mouseGrabber = QWidget::mouseGrabber(); + bool buttonDownNotBlockedByModal = qt_button_down && !QApplicationPrivate::isBlockedByModal(qt_button_down); + + // Resolve the widget under the mouse: + QWidget *widgetUnderMouse = 0; + if (nativeWidget) { + QPoint p = nativeWidget->mapFromGlobal(returnGlobalPoint); + widgetUnderMouse = nativeWidget->childAt(p); + if (!widgetUnderMouse){ + // Cocoa will redirct mouse event to the current + // mouse down widget, which is not what we want for our + // widgetUnderMouse assignment. So we need to check + // if we are actually inside nativeView: + if (nativeWidget->rect().contains(p)) { + widgetUnderMouse = nativeWidget; + } else { + // Ok, fallback to find the widget under mouse ourselves. + widgetUnderMouse = QApplication::widgetAt(returnGlobalPoint); + } + } + } else { + // Calling QApplication::widgetAt is potentially slow, hence the + // reason we avoid it if we can. So supplying a nativeWidget to + // this function is mostly an optimization. But at the same time, + // calling QApplication::widgetAt fails for QMacNativeWidget... + widgetUnderMouse = QApplication::widgetAt(returnGlobalPoint); + } - // Give the Input Manager a chance to process the mouse events. - NSInputManager *currentIManager = [NSInputManager currentInputManager]; - if (currentIManager && [currentIManager wantsToHandleMouseEvents]) { - [currentIManager handleMouseEvent:theEvent]; - } + if (widgetUnderMouse) { + // Check if widgetUnderMouse is blocked by a modal + // window, or the mouse if over the frame strut: + if (widgetUnderMouse == qt_button_down) { + // Small optimization to avoid an extra call to isBlockedByModal: + if (buttonDownNotBlockedByModal == false) + widgetUnderMouse = 0; + } else if (QApplicationPrivate::isBlockedByModal(widgetUnderMouse)) { + widgetUnderMouse = 0; + } - // Handle tablet events (if any) first. - if (qt_mac_handleTabletEvent(theView, theEvent)) { - // Tablet event was handled. In Qt we aren't supposed to send the mouse event. - return true; + if (widgetUnderMouse && widgetUnderMouse->isWindow()) { + // Exclude the titlebar (and frame strut) when finding widget under mouse: + QPoint p = widgetUnderMouse->mapFromGlobal(returnGlobalPoint); + if (!widgetUnderMouse->rect().contains(p)) + widgetUnderMouse = 0; + } + } + if (returnWidgetUnderMouse) + *returnWidgetUnderMouse = widgetUnderMouse; + + // Resolve the target for the mouse event. Default will be widgetUnderMouse, except + // if there is a popup-"grab", mousegrab, or button-down-"grab": + QWidget *popup = QApplication::activePopupWidget(); + if (popup && !mouseGrabber) { + if (!popup->isAncestorOf(widgetUnderMouse)) { + // The popup will always grab the mouse unless the + // mouse is over a child, or the user scrolls: + if (eventType == QEvent::Wheel) + return 0; + returnLocalPoint = popup->mapFromGlobal(returnGlobalPoint); + return popup; + } else if (popup == widgetUnderMouse) { + returnLocalPoint = popup->mapFromGlobal(returnGlobalPoint); + return popup; + } else { + returnLocalPoint = widgetUnderMouse->mapFromGlobal(returnGlobalPoint); + return widgetUnderMouse; + } } - NSPoint windowPoint = [theEvent locationInWindow]; - NSPoint globalPoint = [[theEvent window] convertBaseToScreen:windowPoint]; + QWidget *target = mouseGrabber; + if (!target && buttonDownNotBlockedByModal) + target = qt_button_down; + if (!target) + target = widgetUnderMouse; + if (!target) + return 0; - // Find the widget that *should* get the event (e.g., maybe it was a pop-up, - // they always get the mouse event). - QWidget *qwidget = [theView qt_qwidget]; - QWidget *widgetToGetMouse = 0; - NSView *tmpView = 0; - QWidget *popup = qAppInstance()->activePopupWidget(); - QPoint qglobalPoint(flipPoint(globalPoint).toPoint()); + returnLocalPoint = target->mapFromGlobal(returnGlobalPoint); + return target; +} - if (popup) { - widgetToGetMouse = popup; - tmpView = qt_mac_nativeview_for(popup); - windowPoint = [[tmpView window] convertScreenToBase:globalPoint]; - - QPoint qWindowPoint(windowPoint.x, windowPoint.y); - if (widgetToGetMouse->rect().contains(qWindowPoint)) { - // Keeping the mouse pressed on a combobox button will make - // the popup pop in front of the mouse. But all mouse events - // will be sendt to the button. Since we want mouse events - // to be sendt to widgets inside the popup, we search for the - // widget in front of the mouse: - tmpView = [tmpView hitTest:windowPoint]; - if (!tmpView) - return false; - widgetToGetMouse = - [static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(tmpView) qt_qwidget]; - } +static inline void qt_mac_checkEnterLeaveForNativeWidgets(QWidget *maybeEnterWidget) +{ + // Dispatch enter/leave for the cases where QApplicationPrivate::sendMouseEvent do + // not. This will in general be the cases when alien widgets are not involved: + // 1. from a native widget to another native widget or + // 2. from a native widget to no widget + // 3. from no widget to a native or alien widget + + if (qt_button_down || QWidget::mouseGrabber()) + return; + if ((maybeEnterWidget == qt_last_mouse_receiver) && qt_last_mouse_receiver) + return; + + if (maybeEnterWidget) { + if (!qt_last_mouse_receiver) { + // case 3 + QApplicationPrivate::dispatchEnterLeave(maybeEnterWidget, 0); + qt_last_mouse_receiver = maybeEnterWidget; + } else if (qt_last_mouse_receiver->internalWinId() && maybeEnterWidget->internalWinId()) { + // case 1 + if (qt_last_mouse_receiver->isVisible()) { + QApplicationPrivate::dispatchEnterLeave(maybeEnterWidget, qt_last_mouse_receiver); + qt_last_mouse_receiver = maybeEnterWidget; + } + } // else at lest one of the widgets are alien, so enter/leave will be handled in QApplicationPrivate } else { - extern QWidget * qt_button_down; //qapplication_mac.cpp - QPoint pos; - widgetToGetMouse = QApplicationPrivate::pickMouseReceiver(qwidget, qglobalPoint, - pos, eventType, - button, qt_button_down, 0); - if (widgetToGetMouse) - tmpView = qt_mac_nativeview_for(widgetToGetMouse); + if (qt_last_mouse_receiver && qt_last_mouse_receiver->internalWinId()) { + // case 2 + QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver); + // This seems to be the only case where we need to update qt_last_mouse_receiver + // from the mac specific code. Otherwise, QApplicationPrivate::sendMouseEvent + // will handle it: + qt_last_mouse_receiver = 0; + } + } +} + +bool qt_mac_handleMouseEvent(NSEvent *event, QEvent::Type eventType, Qt::MouseButton button, QWidget *nativeWidget) +{ + // Give the Input Manager a chance to process the mouse events. + NSInputManager *currentIManager = [NSInputManager currentInputManager]; + if (currentIManager && [currentIManager wantsToHandleMouseEvents]) { + [currentIManager handleMouseEvent:event]; } + + // Find the widget that should receive the event, and the widget under the mouse. Those + // can differ if an implicit or explicit mouse grab is active: + QWidget *widgetUnderMouse = 0; + QPoint localPoint, globalPoint; + QWidget *widgetToGetMouse = qt_mac_getTargetForMouseEvent(event, eventType, localPoint, globalPoint, nativeWidget, &widgetUnderMouse); if (!widgetToGetMouse) return false; - NSPoint localPoint = [tmpView convertPoint:windowPoint fromView:nil]; - QPoint qlocalPoint = QPoint(localPoint.x, localPoint.y); + if (!nativeWidget) { + // Path typically taken for mouse moves (send + // directly from [QCocoaWindow sendEvent] + if (!widgetUnderMouse) + return false; + nativeWidget = widgetUnderMouse->internalWinId() ? + widgetUnderMouse : widgetUnderMouse->nativeParentWidget(); + if (!nativeWidget) + return false; + } + NSView *view = qt_mac_effectiveview_for(nativeWidget); - // Search for alien child widgets (either on this qwidget or on the popup) - if (widgetToGetMouse->testAttribute(Qt::WA_NativeWindow) == false || qt_widget_private(widgetToGetMouse)->hasAlienChildren) { - QPoint qScreenPoint = flipPoint(globalPoint).toPoint(); -#ifdef ALIEN_DEBUG - qDebug() << "alien mouse event" << qScreenPoint << possibleAlien; -#endif - QWidget *possibleAlien = widgetToGetMouse->childAt(qlocalPoint); - if (possibleAlien) { - qlocalPoint = possibleAlien->mapFromGlobal(widgetToGetMouse->mapToGlobal(qlocalPoint)); - widgetToGetMouse = possibleAlien; - } + // Handle tablet events (if any) first. + if (qt_mac_handleTabletEvent(view, event)) { + // Tablet event was handled. In Qt we aren't supposed to send the mouse event. + return true; } - EventRef carbonEvent = static_cast<EventRef>(const_cast<void *>([theEvent eventRef])); + EventRef carbonEvent = static_cast<EventRef>(const_cast<void *>([event eventRef])); if (qt_mac_sendMacEventToWidget(widgetToGetMouse, carbonEvent)) return true; - // Yay! All the special cases are handled, it really is just a normal mouse event. - Qt::KeyboardModifiers keyMods = qt_cocoaModifiers2QtModifiers([theEvent modifierFlags]); - NSInteger clickCount = [theEvent clickCount]; + Qt::KeyboardModifiers keyMods = qt_cocoaModifiers2QtModifiers([event modifierFlags]); + NSInteger clickCount = [event clickCount]; Qt::MouseButtons buttons = 0; { UInt32 mac_buttons; @@ -1059,55 +1221,65 @@ bool qt_mac_handleMouseEvent(void * /* NSView * */view, void * /* NSEvent * */ev sizeof(mac_buttons), 0, &mac_buttons) == noErr) buttons = qt_mac_get_buttons(mac_buttons); } + + // Send enter/leave events for the cases when QApplicationPrivate::sendMouseEvent do not: + qt_mac_checkEnterLeaveForNativeWidgets(widgetUnderMouse); + switch (eventType) { default: qWarning("not handled! %d", eventType); break; case QEvent::MouseMove: + if (button == Qt::LeftButton && qt_leftButtonIsRightButton) + button = Qt::RightButton; break; case QEvent::MouseButtonPress: - [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->view = theView; - [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->theEvent = theEvent; -#ifndef QT_NAMESPACE - Q_ASSERT(clickCount > 0); -#endif + qt_button_down = widgetUnderMouse; if (clickCount % 2 == 0 && buttons == button) eventType = QEvent::MouseButtonDblClick; if (button == Qt::LeftButton && (keyMods & Qt::MetaModifier)) { button = Qt::RightButton; - [theView qt_setLeftButtonIsRightButton: true]; + qt_leftButtonIsRightButton = true; } break; case QEvent::MouseButtonRelease: - if (button == Qt::LeftButton && [theView qt_leftButtonIsRightButton]) { + if (button == Qt::LeftButton && qt_leftButtonIsRightButton) { button = Qt::RightButton; - [theView qt_setLeftButtonIsRightButton: false]; + qt_leftButtonIsRightButton = false; } qt_button_down = 0; break; } - [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->localPoint = localPoint; - QMouseEvent qme(eventType, qlocalPoint, qglobalPoint, button, buttons, keyMods); -#ifdef ALIEN_DEBUG - qDebug() << "sending mouse event to" << widgetToGetMouse; -#endif - extern QWidget *qt_button_down; - extern QPointer<QWidget> qt_last_mouse_receiver; + qt_mac_updateCursorWithWidgetUnderMouse(widgetUnderMouse); - if (qwidget->testAttribute(Qt::WA_NativeWindow) && qt_widget_private(qwidget)->hasAlienChildren == false) - qt_sendSpontaneousEvent(widgetToGetMouse, &qme); - else - QApplicationPrivate::sendMouseEvent(widgetToGetMouse, &qme, widgetToGetMouse, qwidget, &qt_button_down, - qt_last_mouse_receiver); + DnDParams *dndParams = currentDnDParameters(); + dndParams->view = view; + dndParams->theEvent = event; + dndParams->globalPoint = globalPoint; + + // Send the mouse event: + QMouseEvent qme(eventType, localPoint, globalPoint, button, buttons, keyMods); + QApplicationPrivate::sendMouseEvent( + widgetToGetMouse, &qme, widgetUnderMouse, nativeWidget, + &qt_button_down, qt_last_mouse_receiver, true); if (eventType == QEvent::MouseButtonPress && button == Qt::RightButton) { - QContextMenuEvent qcme(QContextMenuEvent::Mouse, qlocalPoint, qglobalPoint, keyMods); + QContextMenuEvent qcme(QContextMenuEvent::Mouse, localPoint, globalPoint, keyMods); qt_sendSpontaneousEvent(widgetToGetMouse, &qcme); } + + if (eventType == QEvent::MouseButtonRelease) { + // A mouse button was released, which means that the implicit grab was + // released. We therefore need to re-check if should send (delayed) enter leave events: + // qt_button_down has now become NULL since the call at the top of the function. + widgetToGetMouse = qt_mac_getTargetForMouseEvent(0, QEvent::None, localPoint, globalPoint, nativeWidget, &widgetUnderMouse); + qt_mac_checkEnterLeaveForNativeWidgets(widgetUnderMouse); + } + return true; -#endif } +#endif bool qt_mac_handleTabletEvent(void * /*QCocoaView * */view, void * /*NSEvent * */tabletEvent) { @@ -1291,17 +1463,17 @@ void qt_mac_replaceDrawRectOriginal(void * /*OSWindowRef */window, QWidgetPrivat } #endif // QT_MAC_USE_COCOA +#if QT_MAC_USE_COCOA void qt_mac_showBaseLineSeparator(void * /*OSWindowRef */window, bool show) { if(!window) return; -#if QT_MAC_USE_COCOA QMacCocoaAutoReleasePool pool; OSWindowRef theWindow = static_cast<OSWindowRef>(window); NSToolbar *macToolbar = [theWindow toolbar]; [macToolbar setShowsBaselineSeparator:show]; -#endif // QT_MAC_USE_COCOA } +#endif // QT_MAC_USE_COCOA QStringList qt_mac_NSArrayToQStringList(void *nsarray) { @@ -1321,6 +1493,7 @@ void *qt_mac_QStringListToNSMutableArrayVoid(const QStringList &list) return result; } +#if QT_MAC_USE_COCOA void qt_syncCocoaTitleBarButtons(OSWindowRef window, QWidget *widgetForWindow) { if (!widgetForWindow) @@ -1345,6 +1518,7 @@ void qt_syncCocoaTitleBarButtons(OSWindowRef window, QWidget *widgetForWindow) [window setShowsToolbarButton:uint(flags & Qt::MacWindowToolBarButtonHint) != 0]; } +#endif // QT_MAC_USE_COCOA // Carbon: Make sure you call QDEndContext on the context when done with it. CGContextRef qt_mac_graphicsContextFor(QWidget *widget) @@ -1446,6 +1620,7 @@ void qt_mac_constructQIconFromIconRef(const IconRef icon, const IconRef overlayI } } +#ifdef QT_MAC_USE_COCOA void qt_mac_menu_collapseSeparators(void */*NSMenu **/ theMenu, bool collapse) { OSMenuRef menu = static_cast<OSMenuRef>(theMenu); @@ -1479,12 +1654,24 @@ void qt_mac_menu_collapseSeparators(void */*NSMenu **/ theMenu, bool collapse) } } -#ifdef QT_MAC_USE_COCOA -void qt_cocoaChangeOverrideCursor(const QCursor &cursor) +class CocoaPostMessageAfterEventLoopExitHelp : public QObject { - QMacCocoaAutoReleasePool pool; - [static_cast<NSCursor *>(qt_mac_nsCursorForQCursor(cursor)) set]; -} + id target; + SEL selector; + int argCount; + id arg1; + id arg2; +public: + CocoaPostMessageAfterEventLoopExitHelp(id target, SEL selector, int argCount, id arg1, id arg2) + : target(target), selector(selector), argCount(argCount), arg1(arg1), arg2(arg2){ + deleteLater(); + } + + ~CocoaPostMessageAfterEventLoopExitHelp() + { + qt_cocoaPostMessage(target, selector, argCount, arg1, arg2); + } +}; void qt_cocoaPostMessage(id target, SEL selector, int argCount, id arg1, id arg2) { @@ -1498,6 +1685,15 @@ void qt_cocoaPostMessage(id target, SEL selector, int argCount, id arg1, id arg2 context:nil subtype:QtCocoaEventSubTypePostMessage data1:lower data2:upper]; [NSApp postEvent:e atStart:NO]; } + +void qt_cocoaPostMessageAfterEventLoopExit(id target, SEL selector, int argCount, id arg1, id arg2) +{ + if (QApplicationPrivate::instance()->threadData->eventLoops.size() <= 1) + qt_cocoaPostMessage(target, selector, argCount, arg1, arg2); + else + new CocoaPostMessageAfterEventLoopExitHelp(target, selector, argCount, arg1, arg2); +} + #endif QMacCocoaAutoReleasePool::QMacCocoaAutoReleasePool() diff --git a/src/gui/kernel/qt_cocoa_helpers_mac_p.h b/src/gui/kernel/qt_cocoa_helpers_mac_p.h index 04c2d06..d2978c2 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac_p.h +++ b/src/gui/kernel/qt_cocoa_helpers_mac_p.h @@ -144,18 +144,14 @@ bool qt_mac_checkForNativeSizeGrip(const QWidget *widget); void qt_dispatchTabletProximityEvent(void * /*NSEvent * */ tabletEvent); #ifdef QT_MAC_USE_COCOA bool qt_dispatchKeyEventWithCocoa(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEvent); -void qt_cocoaChangeOverrideCursor(const QCursor &cursor); // These methods exists only for supporting unified mode. void macDrawRectOnTop(void * /*OSWindowRef */ window); void macSyncDrawingOnFirstInvocation(void * /*OSWindowRef */window); void qt_cocoaStackChildWindowOnTopOfOtherChildren(QWidget *widget); -#endif void qt_mac_menu_collapseSeparators(void * /*NSMenu */ menu, bool collapse); +#endif bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEvent); void qt_dispatchModifiersChanged(void * /*NSEvent * */flagsChangedEvent, QWidget *widgetToGetEvent); -void qt_mac_dispatchNCMouseMessage(void */* NSWindow* */eventWindow, void */* NSEvent* */mouseEvent, - QWidget *widgetToGetEvent, bool &leftButtonIsRightButton); -bool qt_mac_handleMouseEvent(void * /*QCocoaView * */view, void * /*NSEvent * */event, QEvent::Type eventType, Qt::MouseButton button); bool qt_mac_handleTabletEvent(void * /*QCocoaView * */view, void * /*NSEvent * */event); inline QApplication *qAppInstance() { return static_cast<QApplication *>(QCoreApplication::instance()); } struct ::TabletProximityRec; @@ -165,6 +161,29 @@ Qt::KeyboardModifiers qt_cocoaDragOperation2QtModifiers(uint dragOperations); QPixmap qt_mac_convert_iconref(const IconRef icon, int width, int height); void qt_mac_constructQIconFromIconRef(const IconRef icon, const IconRef overlayIcon, QIcon *retIcon, QStyle::StandardPixmap standardIcon = QStyle::SP_CustomBase); + +#if QT_MAC_USE_COCOA && __OBJC__ +struct DnDParams +{ + NSView *view; + NSEvent *theEvent; + QPoint globalPoint; + NSDragOperation performedAction; +}; + +DnDParams *macCurrentDnDParameters(); +NSDragOperation qt_mac_mapDropAction(Qt::DropAction action); +NSDragOperation qt_mac_mapDropActions(Qt::DropActions actions); +Qt::DropAction qt_mac_mapNSDragOperation(NSDragOperation nsActions); +Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions); + +QWidget *qt_mac_getTargetForKeyEvent(QWidget *widgetThatReceivedEvent); +QWidget *qt_mac_getTargetForMouseEvent(NSEvent *event, QEvent::Type eventType, + QPoint &returnLocalPoint, QPoint &returnGlobalPoint, QWidget *nativeWidget, QWidget **returnWidgetUnderMouse); +bool qt_mac_handleMouseEvent(NSEvent *event, QEvent::Type eventType, Qt::MouseButton button, QWidget *nativeWidget); +void qt_mac_handleNonClientAreaMouseEvent(NSWindow *window, NSEvent *event); +#endif + inline int flipYCoordinate(int y) { return QApplication::desktop()->screenGeometry(0).height() - y; @@ -221,6 +240,7 @@ public: } }; void qt_cocoaPostMessage(id target, SEL selector, int argCount=0, id arg1=0, id arg2=0); +void qt_cocoaPostMessageAfterEventLoopExit(id target, SEL selector, int argCount=0, id arg1=0, id arg2=0); #endif #endif diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index cd1c9f0..e5e1e00 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -144,6 +144,10 @@ Q_GUI_EXPORT void qt_x11_set_global_double_buffer(bool enable) } #endif +#if defined(QT_MAC_USE_COCOA) +bool qt_mac_clearDirtyOnWidgetInsideDrawWidget = false; +#endif + static inline bool qRectIntersects(const QRect &r1, const QRect &r2) { return (qMax(r1.left(), r2.left()) <= qMin(r1.right(), r2.right()) && @@ -300,7 +304,6 @@ QWidgetPrivate::QWidgetPrivate(int version) #endif #elif defined(Q_WS_MAC) , needWindowChange(0) - , hasAlienChildren(0) , window_event(0) , qd_hd(0) #elif defined (Q_WS_QPA) @@ -1305,9 +1308,9 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) if (f & Qt::MSWindowsOwnDC) q->setAttribute(Qt::WA_NativeWindow); -#ifdef Q_WS_MAC - q->setAttribute(Qt::WA_NativeWindow); -#endif +//#ifdef Q_WS_MAC +// q->setAttribute(Qt::WA_NativeWindow); +//#endif q->setAttribute(Qt::WA_QuitOnClose); // might be cleared in adjustQuitOnCloseAttribute() adjustQuitOnCloseAttribute(); @@ -1414,10 +1417,6 @@ void QWidget::create(WId window, bool initializeWindow, bool destroyOldWindow) #ifndef Q_WS_QPA if (QWidget *parent = parentWidget()) { -#ifdef Q_WS_MAC - if (testAttribute(Qt::WA_NativeWindow) == false) - parent->d_func()->hasAlienChildren = true; -#endif if (type & Qt::Window) { if (!parent->testAttribute(Qt::WA_WState_Created)) parent->createWinId(); @@ -5405,6 +5404,9 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP return; #if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA) + if (qt_mac_clearDirtyOnWidgetInsideDrawWidget) + dirtyOnWidget = QRegion(); + // We disable the rendering of QToolBar in the backingStore if // it's supposed to be in the unified toolbar on Mac OS X. if (backingStore && isInUnifiedToolbar) @@ -5492,7 +5494,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP //paint the background if ((asRoot || q->autoFillBackground() || onScreen || q->testAttribute(Qt::WA_StyledBackground)) && !q->testAttribute(Qt::WA_OpaquePaintEvent) && !q->testAttribute(Qt::WA_NoSystemBackground)) { - QPainter p(q); paintBackground(&p, toBePainted, (asRoot || onScreen) ? flags | DrawAsRoot : 0); } @@ -5674,10 +5675,12 @@ void QWidgetPrivate::paintSiblingsRecursive(QPaintDevice *pdev, const QObjectLis QRect boundingRect; bool dirtyBoundingRect = true; const bool exludeOpaqueChildren = (flags & DontDrawOpaqueChildren); + const bool excludeNativeChildren = (flags & DontDrawNativeChildren); do { QWidget *x = qobject_cast<QWidget*>(siblings.at(index)); - if (x && !(exludeOpaqueChildren && x->d_func()->isOpaque) && !x->isHidden() && !x->isWindow()) { + if (x && !(exludeOpaqueChildren && x->d_func()->isOpaque) && !x->isHidden() && !x->isWindow() + && !(excludeNativeChildren && x->internalWinId())) { if (dirtyBoundingRect) { boundingRect = rgn.boundingRect(); dirtyBoundingRect = false; @@ -10081,7 +10084,13 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f) #if defined(Q_WS_X11) || defined(Q_WS_WIN) || defined(Q_WS_MAC) || defined(Q_OS_SYMBIAN) if (newParent && parent && !desktopWidget) { - if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)) + if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) +#if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA) + // On Mac, toolbars inside the unified title bar will never overlap with + // siblings in the content view. So we skip enforce native siblings in that case + && !d->isInUnifiedToolbar && parentWidget() && parentWidget()->isWindow() +#endif // Q_WS_MAC && QT_MAC_USE_COCOA + ) parent->d_func()->enforceNativeChildren(); else if (parent->d_func()->nativeChildrenForced() || parent->testAttribute(Qt::WA_PaintOnScreen)) setAttribute(Qt::WA_NativeWindow); @@ -10728,7 +10737,13 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) ic->setFocusWidget(0); } } - if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget()) + if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget() +#if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA) + // On Mac, toolbars inside the unified title bar will never overlap with + // siblings in the content view. So we skip enforce native siblings in that case + && !d->isInUnifiedToolbar && parentWidget()->isWindow() +#endif // Q_WS_MAC && QT_MAC_USE_COCOA + ) parentWidget()->d_func()->enforceNativeChildren(); if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created)) d->createWinId(); diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index fc94616..e0cdc16 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -155,7 +155,6 @@ static bool qt_mac_raise_process = true; static OSWindowRef qt_root_win = 0; QWidget *mac_mouse_grabber = 0; QWidget *mac_keyboard_grabber = 0; -extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp #ifndef QT_MAC_USE_COCOA #ifdef QT_NAMESPACE @@ -179,13 +178,14 @@ static CFStringRef kObjectQWidget = CFSTR("com.trolltech.qt.widget"); /***************************************************************************** Externals *****************************************************************************/ +extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp extern QWidget *qt_mac_modal_blocked(QWidget *); //qapplication_mac.mm extern void qt_event_request_activate(QWidget *); //qapplication_mac.mm extern bool qt_event_remove_activate(); //qapplication_mac.mm extern void qt_mac_event_release(QWidget *w); //qapplication_mac.mm extern void qt_event_request_showsheet(QWidget *); //qapplication_mac.mm extern void qt_event_request_window_change(QWidget *); //qapplication_mac.mm -extern QPointer<QWidget> qt_mouseover; //qapplication_mac.mm +extern QPointer<QWidget> qt_last_mouse_receiver; //qapplication_mac.mm extern IconRef qt_mac_create_iconref(const QPixmap &); //qpixmap_mac.cpp extern void qt_mac_set_cursor(const QCursor *, const QPoint &); //qcursor_mac.mm extern void qt_mac_update_cursor(); //qcursor_mac.mm @@ -193,7 +193,8 @@ extern bool qt_nograb(); extern CGImageRef qt_mac_create_cgimage(const QPixmap &, bool); //qpixmap_mac.cpp extern RgnHandle qt_mac_get_rgn(); //qregion_mac.cpp extern QRegion qt_mac_convert_mac_region(RgnHandle rgn); //qregion_mac.cpp - +extern void qt_mac_setMouseGrabCursor(bool set, QCursor *cursor = 0); // qcursor_mac.mm +extern QPointer<QWidget> topLevelAt_cache; // qapplication_mac.mm /***************************************************************************** QWidget utility functions *****************************************************************************/ @@ -217,22 +218,13 @@ static QSize qt_mac_desktopSize() #ifdef QT_MAC_USE_COCOA static NSDrawer *qt_mac_drawer_for(const QWidget *widget) { - // This only goes one level below the content view so start with the window. - // This works fine for straight Qt stuff, but runs into problems if we are - // embedding, but if that's the case, they probably want to be using - // NSDrawer directly. - NSView *widgetView = reinterpret_cast<NSView *>(widget->window()->winId()); + NSView *widgetView = reinterpret_cast<NSView *>(widget->window()->effectiveWinId()); NSArray *windows = [NSApp windows]; for (NSWindow *window in windows) { NSArray *drawers = [window drawers]; for (NSDrawer *drawer in drawers) { if ([drawer contentView] == widgetView) return drawer; - NSArray *views = [[drawer contentView] subviews]; - for (NSView *view in views) { - if (view == widgetView) - return drawer; - } } } return 0; @@ -314,7 +306,7 @@ bool qt_mac_is_macdrawer(const QWidget *w) bool qt_mac_insideKeyWindow(const QWidget *w) { #ifdef QT_MAC_USE_COCOA - return [[reinterpret_cast<NSView *>(w->winId()) window] isKeyWindow]; + return [[reinterpret_cast<NSView *>(w->effectiveWinId()) window] isKeyWindow]; #else Q_UNUSED(w); #endif @@ -421,7 +413,14 @@ inline static void qt_mac_set_fullscreen_mode(bool b) Q_GUI_EXPORT OSViewRef qt_mac_nativeview_for(const QWidget *w) { - return reinterpret_cast<OSViewRef>(w->data->winid); + return reinterpret_cast<OSViewRef>(w->internalWinId()); +} + +Q_GUI_EXPORT OSViewRef qt_mac_effectiveview_for(const QWidget *w) +{ + // Get the first non-alien (parent) widget for + // w, and return its NSView (if it has one): + return reinterpret_cast<OSViewRef>(w->effectiveWinId()); } Q_GUI_EXPORT OSViewRef qt_mac_get_contentview_for(OSWindowRef w) @@ -479,11 +478,12 @@ bool qt_isGenuineQWidget(const QWidget *window) Q_GUI_EXPORT OSWindowRef qt_mac_window_for(const QWidget *w) { - OSViewRef hiview = qt_mac_nativeview_for(w); - if (hiview){ + if (OSViewRef hiview = qt_mac_effectiveview_for(w)) { OSWindowRef window = qt_mac_window_for(hiview); - if (!window && qt_isGenuineQWidget(hiview)) { - QWidget *myWindow = w->window(); + if (window) + return window; + + if (qt_isGenuineQWidget(hiview)) { // This is a workaround for NSToolbar. When a widget is hidden // by clicking the toolbar button, Cocoa reparents the widgets // to another window (but Qt doesn't know about it). @@ -491,18 +491,22 @@ Q_GUI_EXPORT OSWindowRef qt_mac_window_for(const QWidget *w) // but at this point it's window is nil, but the window it's being brought // into (the Qt one) is for sure created. // This stops the hierarchy moving under our feet. - if (myWindow != w && qt_mac_window_for(qt_mac_nativeview_for(myWindow))) - return qt_mac_window_for(qt_mac_nativeview_for(myWindow)); + QWidget *toplevel = w->window(); + if (toplevel != w) { + hiview = qt_mac_nativeview_for(toplevel); + if (OSWindowRef w = qt_mac_window_for(hiview)) + return w; + } - myWindow->d_func()->createWindow_sys(); - // Reget the hiview since the "create window could potentially move the view (I guess). - hiview = qt_mac_nativeview_for(w); - window = qt_mac_window_for(hiview); + toplevel->d_func()->createWindow_sys(); + // Reget the hiview since "create window" could potentially move the view (I guess). + hiview = qt_mac_nativeview_for(toplevel); + return qt_mac_window_for(hiview); } - return window; } return 0; } + #ifndef QT_MAC_USE_COCOA /* Checks if the current group is a 'stay on top' group. If so, the group gets removed from the hash table */ @@ -580,25 +584,6 @@ inline static void qt_mac_set_window_group_to_popup(OSWindowRef window) } #endif -#ifdef QT_MAC_USE_COCOA -void qt_mac_set_needs_display(QWidget *widget, QRegion region) -{ - NSView *theNSView = qt_mac_nativeview_for(widget); - if (region.isEmpty()) { - [theNSView setNeedsDisplay:YES]; - return; - } - - QVector<QRect> rects = region.rects(); - for (int i = 0; i<rects.count(); ++i) { - const QRect &rect = rects.at(i); - NSRect nsrect = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height()); - [theNSView setNeedsDisplayInRect:nsrect]; - } - -} -#endif - inline static bool updateRedirectedToGraphicsProxyWidget(QWidget *widget, const QRect &rect) { if (!widget) @@ -636,6 +621,51 @@ inline static bool updateRedirectedToGraphicsProxyWidget(QWidget *widget, const return false; } +void QWidgetPrivate::macSetNeedsDisplay(QRegion region) +{ + Q_Q(QWidget); +#ifndef QT_MAC_USE_COCOA + if (region.isEmpty()) + HIViewSetNeedsDisplay(qt_mac_nativeview_for(q), true); + else if (RgnHandle rgnHandle = region.toQDRgnForUpdate_sys()) + HIViewSetNeedsDisplayInRegion(qt_mac_nativeview_for(q), QMacSmartQuickDrawRegion(rgnHandle), true); + else + HIViewSetNeedsDisplay(qt_mac_nativeview_for(q), true); // do a complete repaint on overflow. +#else + if (NSView *nativeView = qt_mac_nativeview_for(q)) { + // INVARIANT: q is _not_ alien. So we can optimize a little: + if (region.isEmpty()) { + [nativeView setNeedsDisplay:YES]; + } else { + QVector<QRect> rects = region.rects(); + for (int i = 0; i<rects.count(); ++i) { + const QRect &rect = rects.at(i); + NSRect nsrect = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height()); + [nativeView setNeedsDisplayInRect:nsrect]; + } + } + } else if (QWidget *effectiveWidget = q->nativeParentWidget()) { + // INVARIANT: q is alien, and effectiveWidget is native. + if (NSView *effectiveView = qt_mac_nativeview_for(effectiveWidget)) { + if (region.isEmpty()) { + const QRect &rect = q->rect(); + QPoint p = q->mapTo(effectiveWidget, rect.topLeft()); + NSRect nsrect = NSMakeRect(p.x(), p.y(), rect.width(), rect.height()); + [effectiveView setNeedsDisplayInRect:nsrect]; + } else { + QVector<QRect> rects = region.rects(); + for (int i = 0; i<rects.count(); ++i) { + const QRect &rect = rects.at(i); + QPoint p = q->mapTo(effectiveWidget, rect.topLeft()); + NSRect nsrect = NSMakeRect(p.x(), p.y(), rect.width(), rect.height()); + [effectiveView setNeedsDisplayInRect:nsrect]; + } + } + } + } +#endif +} + void QWidgetPrivate::macUpdateIsOpaque() { Q_Q(QWidget); @@ -1569,6 +1599,11 @@ OSViewRef qt_mac_create_widget(QWidget *widget, QWidgetPrivate *widgetPrivate, O #ifdef QT_MAC_USE_COCOA QMacCocoaAutoReleasePool pool; QT_MANGLE_NAMESPACE(QCocoaView) *view = [[QT_MANGLE_NAMESPACE(QCocoaView) alloc] initWithQWidget:widget widgetPrivate:widgetPrivate]; + +#ifdef ALIEN_DEBUG + qDebug() << "Creating NSView for" << widget; +#endif + if (view && parent) [parent addSubview:view]; return view; @@ -1635,7 +1670,7 @@ bool QWidgetPrivate::qt_mac_update_sizer(QWidget *w, int up) // to happen, prevent that here (you really want the thing hidden). if (up >= 0 || topData->resizer != 0) topData->resizer += up; - OSWindowRef windowRef = qt_mac_window_for(OSViewRef(w->winId())); + OSWindowRef windowRef = qt_mac_window_for(OSViewRef(w->effectiveWinId())); { #ifndef QT_MAC_USE_COCOA WindowClass wclass; @@ -1670,6 +1705,7 @@ bool QWidgetPrivate::qt_mac_update_sizer(QWidget *w, int up) void QWidgetPrivate::qt_clean_root_win() { #ifdef QT_MAC_USE_COCOA + QMacCocoaAutoReleasePool pool; [qt_root_win release]; #else if(!qt_root_win) @@ -2307,15 +2343,12 @@ void QWidgetPrivate::finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ voidWin } [windowRef setContentView:nsview]; [nsview setHidden:NO]; - if (q->testAttribute(Qt::WA_DropSiteRegistered)) - registerDropSite(true); transferChildren(); // Tell Cocoa explicit that we wan't the view to receive key events // (regardless of focus policy) because this is how it works on other // platforms (and in the carbon port): - if (!qApp->focusWidget()) - [windowRef makeFirstResponder:nsview]; + [windowRef makeFirstResponder:nsview]; if (topExtra->posFromMove) { updateFrameStrut(); @@ -2346,8 +2379,9 @@ void QWidgetPrivate::finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ voidWin q->setAttribute(Qt::WA_WState_WindowOpacitySet, false); } - if (qApp->overrideCursor()) - [windowRef disableCursorRects]; + // Its more performant to handle the mouse cursor + // ourselves, expecially when using alien widgets: + [windowRef disableCursorRects]; setWindowLevel(); macUpdateHideOnSuspend(); @@ -2465,8 +2499,6 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO data.crect.setRect(0, 0, desktopSize.width(), desktopSize.height()); dialog = popup = false; // force these flags off } else { - q->setAttribute(Qt::WA_WState_Visible, false); - if (topLevel && (type != Qt::Drawer)) { if (QDesktopWidget *dsk = QApplication::desktop()) { // calc pos/size from screen const bool wasResized = q->testAttribute(Qt::WA_Resized); @@ -2556,6 +2588,8 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO transfer = true; } else if (parentWidget) { // I need to be added to my parent, therefore my parent needs an NSView + // Alien note: a 'window' was supplied as argument, meaning this widget + // is not alien. So therefore the parent cannot be alien either. parentWidget->createWinId(); parent = qt_mac_nativeview_for(parentWidget); } @@ -2627,11 +2661,8 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO data.fstrut_dirty = false; // non-toplevel widgets don't have a frame, so no need to update the strut #ifdef QT_MAC_USE_COCOA - if (q->testAttribute(Qt::WA_NativeWindow) == false || - q->internalWinId() != 0) { -#ifdef ALIEN_DEBUG - qDebug() << "Skipping native widget creation for" << this; -#endif + if (q->testAttribute(Qt::WA_NativeWindow) == false || q->internalWinId() != 0) { + // INVARIANT: q is Alien, and we should not create an NSView to back it up. } else #endif if (OSViewRef osview = qt_mac_create_widget(q, this, qt_mac_nativeview_for(parentWidget))) { @@ -2643,13 +2674,20 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO NSRect bounds = NSMakeRect(data.crect.x(), data.crect.y(), data.crect.width(), data.crect.height()); [osview setFrame:bounds]; setWinId((WId)osview); + if (q->isVisible()) { + // If q were Alien before, but now became native (e.g. if a call to + // winId was done from somewhere), we need to show the view immidiatly: + QMacCocoaAutoReleasePool pool; + [osview setHidden:NO]; + } #endif - if (q->testAttribute(Qt::WA_DropSiteRegistered)) - registerDropSite(true); } } updateIsOpaque(); + + if (q->testAttribute(Qt::WA_DropSiteRegistered)) + registerDropSite(true); if (q->hasFocus()) setFocus_sys(); if (!topLevel && initializeWindow) @@ -2691,16 +2729,29 @@ QWidget::macCGHandle() const return handle(); } +void qt_mac_repaintParentUnderAlienWidget(QWidget *alienWidget) +{ + QWidget *nativeParent = alienWidget->nativeParentWidget(); + if (!nativeParent) + return; + + QPoint globalPos = alienWidget->mapToGlobal(QPoint(0, 0)); + QRect dirtyRect = QRect(nativeParent->mapFromGlobal(globalPos), alienWidget->size()); + nativeParent->repaint(dirtyRect); +} + void QWidget::destroy(bool destroyWindow, bool destroySubWindows) { Q_D(QWidget); + QMacCocoaAutoReleasePool pool; d->aboutToDestroy(); if (!isWindow() && parentWidget()) parentWidget()->d_func()->invalidateBuffer(d->effectiveRectFor(geometry())); + if (!internalWinId()) + qt_mac_repaintParentUnderAlienWidget(this); d->deactivateWidgetCleanup(); qt_mac_event_release(this); if(testAttribute(Qt::WA_WState_Created)) { - QMacCocoaAutoReleasePool pool; setAttribute(Qt::WA_WState_Created, false); QObjectList chldrn = children(); for(int i = 0; i < chldrn.size(); i++) { // destroy all widget children @@ -2756,7 +2807,7 @@ void QWidget::destroy(bool destroyWindow, bool destroySubWindows) void QWidgetPrivate::transferChildren() { Q_Q(QWidget); - if (!q->testAttribute(Qt::WA_WState_Created)) + if (!q->internalWinId()) return; // Can't add any views anyway QObjectList chlist = q->children(); @@ -2768,7 +2819,7 @@ void QWidgetPrivate::transferChildren() // This seems weird, no need to call it in a loop right? if (!topData()->caption.isEmpty()) setWindowTitle_helper(extra->topextra->caption); - if (w->testAttribute(Qt::WA_WState_Created)) { + if (w->internalWinId()) { #ifndef QT_MAC_USE_COCOA HIViewAddSubview(qt_mac_nativeview_for(q), qt_mac_nativeview_for(w)); #else @@ -2889,11 +2940,11 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f) #ifndef QT_MAC_USE_COCOA old_window_event = window_event; #else - OSWindowRef oldWindow = qt_mac_window_for(old_id); if (qt_mac_is_macdrawer(q)) { oldDrawer = qt_mac_drawer_for(q); } if (wasWindow) { + OSWindowRef oldWindow = qt_mac_window_for(old_id); oldToolbar = [oldWindow toolbar]; if (oldToolbar) { [oldToolbar retain]; @@ -3015,7 +3066,7 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f) QPoint QWidget::mapToGlobal(const QPoint &pos) const { Q_D(const QWidget); - if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) { + if (!internalWinId()) { QPoint p = pos + data->crect.topLeft(); return isWindow() ? p : parentWidget()->mapToGlobal(p); } @@ -3042,7 +3093,7 @@ QPoint QWidget::mapToGlobal(const QPoint &pos) const QPoint QWidget::mapFromGlobal(const QPoint &pos) const { Q_D(const QWidget); - if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) { + if (!internalWinId()) { QPoint p = isWindow() ? pos : parentWidget()->mapFromGlobal(pos); return p - data->crect.topLeft(); } @@ -3069,28 +3120,12 @@ void QWidgetPrivate::updateSystemBackground() void QWidgetPrivate::setCursor_sys(const QCursor &) { -#ifndef QT_MAC_USE_COCOA qt_mac_update_cursor(); -#else - Q_Q(QWidget); - if (q->testAttribute(Qt::WA_WState_Created)) { - QMacCocoaAutoReleasePool pool; - [qt_mac_window_for(q) invalidateCursorRectsForView:qt_mac_nativeview_for(q)]; - } -#endif } void QWidgetPrivate::unsetCursor_sys() { -#ifndef QT_MAC_USE_COCOA qt_mac_update_cursor(); -#else - Q_Q(QWidget); - if (q->testAttribute(Qt::WA_WState_Created)) { - QMacCocoaAutoReleasePool pool; - [qt_mac_window_for(q) invalidateCursorRectsForView:qt_mac_nativeview_for(q)]; - } -#endif } void QWidgetPrivate::setWindowTitle_sys(const QString &caption) @@ -3232,24 +3267,28 @@ void QWidget::grabMouse() if(mac_mouse_grabber) mac_mouse_grabber->releaseMouse(); mac_mouse_grabber=this; + qt_mac_setMouseGrabCursor(true); } } #ifndef QT_NO_CURSOR -void QWidget::grabMouse(const QCursor &) +void QWidget::grabMouse(const QCursor &cursor) { if(isVisible() && !qt_nograb()) { if(mac_mouse_grabber) mac_mouse_grabber->releaseMouse(); mac_mouse_grabber=this; + qt_mac_setMouseGrabCursor(true, const_cast<QCursor *>(&cursor)); } } #endif void QWidget::releaseMouse() { - if(!qt_nograb() && mac_mouse_grabber == this) + if(!qt_nograb() && mac_mouse_grabber == this) { mac_mouse_grabber = 0; + qt_mac_setMouseGrabCursor(false); + } } void QWidget::grabKeyboard() @@ -3334,35 +3373,10 @@ QWindowSurface *QWidgetPrivate::createDefaultWindowSurface_sys() void QWidgetPrivate::update_sys(const QRect &r) { Q_Q(QWidget); - if (r == q->rect()) { - if (updateRedirectedToGraphicsProxyWidget(q, r)) - return; - dirtyOnWidget += r; -#ifndef QT_MAC_USE_COCOA - HIViewSetNeedsDisplay(qt_mac_nativeview_for(q), true); -#else - qt_mac_set_needs_display(q, QRegion()); -#endif + if (updateRedirectedToGraphicsProxyWidget(q, r)) return; - } - - int x = r.x(), y = r.y(), w = r.width(), h = r.height(); - if (w < 0) - w = q->data->crect.width() - x; - if (h < 0) - h = q->data->crect.height() - y; - if (w && h) { - const QRect updateRect = QRect(x, y, w, h); - if (updateRedirectedToGraphicsProxyWidget(q, updateRect)) - return; -#ifndef QT_MAC_USE_COCOA - dirtyOnWidget += updateRect; - HIRect r = CGRectMake(x, y, w, h); - HIViewSetNeedsDisplayInRect(qt_mac_nativeview_for(q), &r, true); -#else - [qt_mac_nativeview_for(q) setNeedsDisplayInRect:NSMakeRect(x, y, w, h)]; -#endif - } + dirtyOnWidget += r; + macSetNeedsDisplay(r != q->rect() ? r : QRegion()); } void QWidgetPrivate::update_sys(const QRegion &rgn) @@ -3371,33 +3385,7 @@ void QWidgetPrivate::update_sys(const QRegion &rgn) if (updateRedirectedToGraphicsProxyWidget(q, rgn)) return; dirtyOnWidget += rgn; -#ifndef QT_MAC_USE_COCOA - RgnHandle rgnHandle = rgn.toQDRgnForUpdate_sys(); - if (rgnHandle) - HIViewSetNeedsDisplayInRegion(qt_mac_nativeview_for(q), QMacSmartQuickDrawRegion(rgnHandle), true); - else { - HIViewSetNeedsDisplay(qt_mac_nativeview_for(q), true); // do a complete repaint on overflow. - } -#else - // Alien support: get the first native ancestor widget (will be q itself in the non-alien case), - // map the coordinates from q space to NSView space and invalidate the rect. - QWidget *nativeParent = q->internalWinId() ? q : q->nativeParentWidget(); - if (nativeParent == 0) - return; - - QVector<QRect> rects = rgn.rects(); - for (int i = 0; i < rects.count(); ++i) { - const QRect &rect = rects.at(i); - - const QRect nativeBoundingRect = QRect( - QPoint(q->mapTo(nativeParent, rect.topLeft())), - QSize(rect.size())); - - [qt_mac_nativeview_for(nativeParent) setNeedsDisplayInRect:NSMakeRect(nativeBoundingRect.x(), - nativeBoundingRect.y(), nativeBoundingRect.width(), - nativeBoundingRect.height())]; - } -#endif + macSetNeedsDisplay(rgn); } bool QWidgetPrivate::isRealWindow() const @@ -3436,7 +3424,6 @@ void QWidgetPrivate::show_sys() data.fstrut_dirty = true; if (realWindow) { - // Delegates can change window state, so record some things earlier. bool isCurrentlyMinimized = (q->windowState() & Qt::WindowMinimized); setModal_sys(); OSWindowRef window = qt_mac_window_for(q); @@ -3483,9 +3470,11 @@ void QWidgetPrivate::show_sys() } } setSubWindowStacking(true); + qt_mac_update_cursor(); #endif if (q->windowType() == Qt::Popup) { - if (q->focusWidget()) + qt_button_down = 0; + if (q->focusWidget()) q->focusWidget()->d_func()->setFocus_sys(); else setFocus_sys(); @@ -3507,21 +3496,32 @@ void QWidgetPrivate::show_sys() #ifndef QT_MAC_USE_COCOA HIViewSetVisible(qt_mac_nativeview_for(q), true); #else - [qt_mac_nativeview_for(q) setHidden:NO]; - + if (NSView *view = qt_mac_nativeview_for(q)) { + // INVARIANT: q is native. Just show the view: + [view setHidden:NO]; + } else { + // INVARIANT: q is alien. Repaint q instead: + q->repaint(); + } #endif } - if (!QWidget::mouseGrabber()){ - QWidget *enterWidget = QApplication::widgetAt(QCursor::pos()); - QApplicationPrivate::dispatchEnterLeave(enterWidget, qt_mouseover); - qt_mouseover = enterWidget; +#ifdef QT_MAC_USE_COCOA + if ([NSApp isActive] && !qt_button_down && !QWidget::mouseGrabber()){ + // Update enter/leave immidiatly, don't wait for a move event. But only + // if no grab exists (even if the grab points to this widget, it seems, ref X11) + QPoint qlocal, qglobal; + QWidget *widgetUnderMouse = 0; + qt_mac_getTargetForMouseEvent(0, QEvent::Enter, qlocal, qglobal, 0, &widgetUnderMouse); + QApplicationPrivate::dispatchEnterLeave(widgetUnderMouse, qt_last_mouse_receiver); + qt_last_mouse_receiver = widgetUnderMouse; } +#endif + topLevelAt_cache = 0; qt_event_request_window_change(q); } - QPoint qt_mac_nativeMapFromParent(const QWidget *child, const QPoint &pt) { #ifndef QT_MAC_USE_COCOA @@ -3602,6 +3602,7 @@ void QWidgetPrivate::hide_sys() } #endif toggleDrawers(false); + qt_mac_update_cursor(); #ifndef QT_MAC_USE_COCOA // Clear modality (because it seems something that we've always done). if (data.window_modality != Qt::NonModal) { @@ -3649,18 +3650,29 @@ void QWidgetPrivate::hide_sys() #ifndef QT_MAC_USE_COCOA HIViewSetVisible(qt_mac_nativeview_for(q), false); #else - [qt_mac_nativeview_for(q) setHidden:YES]; + if (NSView *view = qt_mac_nativeview_for(q)) { + // INVARIANT: q is native. Just hide the view: + [view setHidden:YES]; + } else { + // INVARIANT: q is alien. Repaint where q is placed instead: + qt_mac_repaintParentUnderAlienWidget(q); + } #endif } - if (!QWidget::mouseGrabber()){ - QWidget *enterWidget = QApplication::widgetAt(QCursor::pos()); - if (enterWidget && enterWidget->data->in_destructor) - enterWidget = 0; - QApplicationPrivate::dispatchEnterLeave(enterWidget, qt_mouseover); - qt_mouseover = enterWidget; - } - +#ifdef QT_MAC_USE_COCOA + if ([NSApp isActive] && !qt_button_down && !QWidget::mouseGrabber()){ + // Update enter/leave immidiatly, don't wait for a move event. But only + // if no grab exists (even if the grab points to this widget, it seems, ref X11) + QPoint qlocal, qglobal; + QWidget *widgetUnderMouse = 0; + qt_mac_getTargetForMouseEvent(0, QEvent::Leave, qlocal, qglobal, 0, &widgetUnderMouse); + QApplicationPrivate::dispatchEnterLeave(widgetUnderMouse, qt_last_mouse_receiver); + qt_last_mouse_receiver = widgetUnderMouse; + } +#endif + + topLevelAt_cache = 0; qt_event_request_window_change(q); deactivateWidgetCleanup(); qt_mac_event_release(q); @@ -3883,12 +3895,14 @@ void QWidgetPrivate::raise_sys() QWidget *parentWidget = q->parentWidget(); if(parentWidget) { OSWindowRef parentWindow = qt_mac_window_for(parentWidget); - if(parentWindow && [parentWindow isOnActiveSpace]) { - // The window was created in a different space. Therefore if we want - // to show it in the current space we need to recreate it in the new - // space. - recreateMacWindow(); - window = qt_mac_window_for(q); + if(parentWindow && [parentWindow respondsToSelector:@selector(isOnActiveSpace)]) { + if ([parentWindow performSelector:@selector(isOnActiveSpace)]) { + // The window was created in a different space. Therefore if we want + // to show it in the current space we need to recreate it in the new + // space. + recreateMacWindow(); + window = qt_mac_window_for(q); + } } } } @@ -3905,6 +3919,7 @@ void QWidgetPrivate::raise_sys() NSView *parentView = [view superview]; [parentView sortSubviewsUsingFunction:compareViews2Raise context:reinterpret_cast<void *>(view)]; } + topLevelAt_cache = 0; #else if(q->isWindow()) { //raise this window @@ -3945,6 +3960,7 @@ void QWidgetPrivate::lower_sys() NSView *parentView = [view superview]; [parentView sortSubviewsUsingFunction:compareViews2Lower context:reinterpret_cast<void *>(view)]; } + topLevelAt_cache = 0; #else if(q->isWindow()) { SendBehind(qt_mac_window_for(q), 0); @@ -4001,6 +4017,7 @@ void QWidgetPrivate::stackUnder_sys(QWidget *w) #endif } +#ifndef QT_MAC_USE_COCOA /* Modifies the bounds for a widgets backing HIView during moves and resizes. Also updates the widget, either by scrolling its contents or repainting, depending on the WA_StaticContents @@ -4008,7 +4025,6 @@ void QWidgetPrivate::stackUnder_sys(QWidget *w) */ static void qt_mac_update_widget_position(QWidget *q, QRect oldRect, QRect newRect) { -#ifndef QT_MAC_USE_COCOA HIRect bounds = CGRectMake(newRect.x(), newRect.y(), newRect.width(), newRect.height()); @@ -4100,13 +4116,8 @@ static void qt_mac_update_widget_position(QWidget *q, QRect oldRect, QRect newRe HIViewSetNeedsDisplayInRect(view, &verticalSlice, true); const HIRect horizontalSlice = CGRectMake(0, starty, startx, stopy); HIViewSetNeedsDisplayInRect(view, &horizontalSlice, true); -#else - Q_UNUSED(oldRect); - NSRect bounds = NSMakeRect(newRect.x(), newRect.y(), - newRect.width(), newRect.height()); - [qt_mac_nativeview_for(q) setFrame:bounds]; -#endif } +#endif /* Helper function for non-toplevel widgets. Helps to map Qt's 32bit @@ -4127,7 +4138,15 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) { Q_Q(QWidget); Q_ASSERT(q->testAttribute(Qt::WA_WState_Created)); - Q_UNUSED(oldRect); + + if (!q->internalWinId() && QApplicationPrivate::graphicsSystem() != 0) { + // We have no view to move, and no paint engine that + // we can update dirty regions on. So just return: + return; + } + + QMacCocoaAutoReleasePool pool; + /* There are up to four different coordinate systems here: Qt coordinate system for this widget. @@ -4135,13 +4154,31 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) Qt coordinate system for parent X coordinate system for parent (relative to parent's wrect). */ + + // wrect is the same as crect, except that it is + // clipped to fit inside parent (and screen): QRect wrect; - //xrect is the X geometry of my X widget. (starts out in parent's Qt coord sys, and ends up in parent's X coord sys) - QRect xrect = data.crect; + // wrectInParentCoordSys will be the same as wrect, except that it is + // originated in q's parent rather than q itself. It starts out in + // parent's Qt coord system, and ends up in parent's coordinate system: + QRect wrectInParentCoordSys = data.crect; + + // If q's parent has been clipped, parentWRect will + // be filled with the parents clipped crect: QRect parentWRect; + + // Embedded have different meaning on each platform, and on + // Mac, it means that q is a QMacNativeWidget. bool isEmbeddedWindow = (q->isWindow() && topData()->embedded); - if (isEmbeddedWindow) { +#ifdef QT_MAC_USE_COCOA + NSView *nsview = qt_mac_nativeview_for(q); +#endif + if (!isEmbeddedWindow) { + parentWRect = q->parentWidget()->data->wrect; + } else { + // INVARIANT: q's parent view is not owned by Qt. So we need to + // do some extra calls to get the clipped rect of the parent view: #ifndef QT_MAC_USE_COCOA HIViewRef parentView = HIViewGetSuperview(qt_mac_nativeview_for(q)); #else @@ -4160,43 +4197,57 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) const QRect wrectRange(-WRECT_MAX,-WRECT_MAX, 2*WRECT_MAX, 2*WRECT_MAX); parentWRect = wrectRange; } - } else { - parentWRect = q->parentWidget()->data->wrect; } if (parentWRect.isValid()) { - // parent is clipped, and we have to clip to the same limit as parent - if (!parentWRect.contains(xrect) && !isEmbeddedWindow) { - xrect &= parentWRect; - wrect = xrect; - //translate from parent's to my Qt coord sys + // INVARIANT: q's parent has been clipped. + // So we fit our own wrects inside it: + if (!parentWRect.contains(wrectInParentCoordSys) && !isEmbeddedWindow) { + wrectInParentCoordSys &= parentWRect; + wrect = wrectInParentCoordSys; + // Make sure wrect is originated in q's coordinate system: wrect.translate(-data.crect.topLeft()); } - //translate from parent's Qt coords to parent's X coords - xrect.translate(-parentWRect.topLeft()); - + // // Make sure wrectInParentCoordSys originated in q's parent coordinate system: + wrectInParentCoordSys.translate(-parentWRect.topLeft()); } else { - // parent is not clipped, we may or may not have to clip + // INVARIANT: we dont know yet the clipping rect of q's parent. + // So we may or may not have to adjust our wrects: if (data.wrect.isValid() && QRect(QPoint(),data.crect.size()).contains(data.wrect)) { - // This is where the main optimization is: we are already - // clipped, and if our clip is still valid, we can just - // move our window, and do not need to move or clip - // children + // This is where the main optimization is: we have an old wrect from an earlier + // setGeometry call, and the new crect is smaller than it. If the final wrect is + // also inside the old wrect, we can just move q and its children to the new + // location without any clipping: + + // vrect will be the part of q that's will be visible inside + // q's parent. If it inside the old wrect, then we can just move: + QRect vrect = wrectInParentCoordSys & q->parentWidget()->rect(); + vrect.translate(-data.crect.topLeft()); - QRect vrect = xrect & q->parentWidget()->rect(); - vrect.translate(-data.crect.topLeft()); //the part of me that's visible through parent, in my Qt coords if (data.wrect.contains(vrect)) { - xrect = data.wrect; - xrect.translate(data.crect.topLeft()); + wrectInParentCoordSys = data.wrect; + wrectInParentCoordSys.translate(data.crect.topLeft()); #ifndef QT_MAC_USE_COCOA - HIRect bounds = CGRectMake(xrect.x(), xrect.y(), - xrect.width(), xrect.height()); + HIRect bounds = CGRectMake(wrectInParentCoordSys.x(), wrectInParentCoordSys.y(), + wrectInParentCoordSys.width(), wrectInParentCoordSys.height()); HIViewSetFrame(qt_mac_nativeview_for(q), &bounds); #else - NSRect bounds = NSMakeRect(xrect.x(), xrect.y(), - xrect.width(), xrect.height()); - [qt_mac_nativeview_for(q) setFrame:bounds]; + if (nsview) { + // INVARIANT: q is native. Set view frame: + NSRect bounds = NSMakeRect(wrectInParentCoordSys.x(), wrectInParentCoordSys.y(), + wrectInParentCoordSys.width(), wrectInParentCoordSys.height()); + [nsview setFrame:bounds]; + } else { + // INVARIANT: q is alien. Repaint wrect instead (includes old and new wrect): + QWidget *parent = q->parentWidget(); + QPoint globalPosWRect = parent->mapToGlobal(data.wrect.topLeft()); + + QWidget *nativeParent = q->nativeParentWidget(); + QRect dirtyWRect = QRect(nativeParent->mapFromGlobal(globalPosWRect), data.wrect.size()); + + nativeParent->update(dirtyWRect); + } #endif if (q->testAttribute(Qt::WA_OutsideWSRange)) { q->setAttribute(Qt::WA_OutsideWSRange, false); @@ -4205,7 +4256,8 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) #ifndef QT_MAC_USE_COCOA HIViewSetVisible(qt_mac_nativeview_for(q), true); #else - [qt_mac_nativeview_for(q) setHidden:NO]; + // If q is Alien, the following call does nothing: + [nsview setHidden:NO]; #endif } } @@ -4213,9 +4265,10 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) } } + // Check if we need to clip q inside the screen: const QRect validRange(-XCOORD_MAX,-XCOORD_MAX, 2*XCOORD_MAX, 2*XCOORD_MAX); - if (!validRange.contains(xrect)) { - // we are too big, and must clip + if (!validRange.contains(wrectInParentCoordSys)) { + // We're too big, and must clip: QPoint screenOffset(0, 0); // offset of the part being on screen const QWidget *parentWidget = q->parentWidget(); while (parentWidget && !parentWidget->isWindow()) { @@ -4227,14 +4280,14 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) 2*WRECT_MAX, 2*WRECT_MAX); - xrect &=cropRect; - wrect = xrect; - wrect.translate(-data.crect.topLeft()); // translate wrect in my Qt coordinates + wrectInParentCoordSys &=cropRect; + wrect = wrectInParentCoordSys; + wrect.translate(-data.crect.topLeft()); } } // unmap if we are outside the valid window system coord system - bool outsideRange = !xrect.isValid(); + bool outsideRange = !wrectInParentCoordSys.isValid(); bool mapWindow = false; if (q->testAttribute(Qt::WA_OutsideWSRange) != outsideRange) { q->setAttribute(Qt::WA_OutsideWSRange, outsideRange); @@ -4242,7 +4295,8 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) #ifndef QT_MAC_USE_COCOA HIViewSetVisible(qt_mac_nativeview_for(q), false); #else - [qt_mac_nativeview_for(q) setHidden:YES]; + // If q is Alien, the following call does nothing: + [nsview setHidden:YES]; #endif q->setAttribute(Qt::WA_Mapped, false); } else if (!q->isHidden()) { @@ -4253,10 +4307,10 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) if (outsideRange) return; + // Store the new clipped rect: bool jump = (data.wrect != wrect); data.wrect = wrect; - // and now recursively for all children... // ### can be optimized for (int i = 0; i < children.size(); ++i) { @@ -4268,17 +4322,56 @@ void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect) } } - qt_mac_update_widget_position(q, oldRect, xrect); - - if (jump) +#ifndef QT_MAC_USE_COCOA + // Move the actual HIView: + qt_mac_update_widget_position(q, oldRect, wrectInParentCoordSys); + if (jump) q->update(); +#else + if (nsview) { + // INVARIANT: q is native. Move the actual NSView: + NSRect bounds = NSMakeRect( + wrectInParentCoordSys.x(), wrectInParentCoordSys.y(), + wrectInParentCoordSys.width(), wrectInParentCoordSys.height()); + [nsview setFrame:bounds]; + if (jump) + q->update(); + } else if (QApplicationPrivate::graphicsSystem() == 0){ + // INVARIANT: q is alien and we use native paint engine. + // Schedule updates where q is moved from and to: + const QWidget *parent = q->parentWidget(); + const QPoint globalPosOldWRect = parent->mapToGlobal(oldRect.topLeft()); + const QPoint globalPosNewWRect = parent->mapToGlobal(wrectInParentCoordSys.topLeft()); + + QWidget *nativeParent = q->nativeParentWidget(); + const QRegion dirtyOldWRect = QRect(nativeParent->mapFromGlobal(globalPosOldWRect), oldRect.size()); + const QRegion dirtyNewWRect = QRect(nativeParent->mapFromGlobal(globalPosNewWRect), wrectInParentCoordSys.size()); + + const bool sizeUnchanged = oldRect.size() == wrectInParentCoordSys.size(); + const bool posUnchanged = oldRect.topLeft() == wrectInParentCoordSys.topLeft(); + + // Resolve/minimize the region that needs to update: + if (sizeUnchanged && q->testAttribute(Qt::WA_OpaquePaintEvent)) { + // INVARIANT: q is opaque, and is only moved (not resized). So in theory we only + // need to blit pixels, and skip a repaint. But we can only make this work if we + // had access to the backbuffer, so we need to update all: + nativeParent->update(dirtyOldWRect | dirtyNewWRect); + } else if (posUnchanged && q->testAttribute(Qt::WA_StaticContents)) { + // We only need to redraw exposed areas: + nativeParent->update(dirtyNewWRect - dirtyOldWRect); + } else { + nativeParent->update(dirtyOldWRect | dirtyNewWRect); + } + } +#endif if (mapWindow && !dontShow) { q->setAttribute(Qt::WA_Mapped); #ifndef QT_MAC_USE_COCOA HIViewSetVisible(qt_mac_nativeview_for(q), true); #else - [qt_mac_nativeview_for(q) setHidden:NO]; + // If q is Alien, the following call does nothing: + [nsview setHidden:NO]; #endif } } @@ -4340,7 +4433,6 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) QMacCocoaAutoReleasePool pool; bool realWindow = isRealWindow(); - BOOL needDisplay = realWindow ? YES : NO; if (realWindow && !q->testAttribute(Qt::WA_DontShowOnScreen)){ adjustWithinMaxAndMinSize(w, h); @@ -4388,7 +4480,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) if (currTopLeft.x() == x && currTopLeft.y() == y && cocoaFrameRect.size.width != 0 && cocoaFrameRect.size.height != 0) { - [window setFrame:cocoaFrameRect display:needDisplay]; + [window setFrame:cocoaFrameRect display:realWindow]; } else { // The window is moved and resized (or resized to zero). // Since Cocoa usually only sends us a resize callback after @@ -4397,7 +4489,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) // would have the same origin as the setFrame call) we shift the // window back and forth inbetween. cocoaFrameRect.origin.y += 1; - [window setFrame:cocoaFrameRect display:needDisplay]; + [window setFrame:cocoaFrameRect display:realWindow]; cocoaFrameRect.origin.y -= 1; [window setFrameOrigin:cocoaFrameRect.origin]; } @@ -4405,6 +4497,8 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) } else { setGeometry_sys_helper(x, y, w, h, isMove); } + + topLevelAt_cache = 0; } void QWidgetPrivate::setGeometry_sys_helper(int x, int y, int w, int h, bool isMove) @@ -4545,6 +4639,7 @@ void QWidgetPrivate::updateMaximizeButton_sys() void QWidgetPrivate::scroll_sys(int dx, int dy) { if (QApplicationPrivate::graphicsSystem() && !paintOnScreen()) { + // INVARIANT: Alien paint engine scrollChildren(dx, dy); scrollRect(q_func()->rect(), dx, dy); } else { @@ -4552,37 +4647,54 @@ void QWidgetPrivate::scroll_sys(int dx, int dy) } } -void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &r) +void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) { Q_Q(QWidget); - if (QApplicationPrivate::graphicsSystem() && !paintOnScreen()) { - scrollRect(r, dx, dy); + // INVARIANT: Alien paint engine + scrollRect(qscrollRect, dx, dy); return; } - const bool valid_rect = r.isValid(); - if (!q->updatesEnabled() && (valid_rect || q->children().isEmpty())) - return; + const bool isAlien = (q->internalWinId() == 0); + const QPoint scrollDelta(dx, dy); + + // If qscrollRect is valid, we are _not_ supposed to scroll q's children (as documented). + // But we do scroll children (and the whole of q) if qscrollRect is invalid. This case is + // documented as undefined, but we exploit it to help factor our code into one function. + const bool scrollChildren = !qscrollRect.isValid(); + + if (!q->updatesEnabled()) { + // We are told not to update anything on q at this point. So unless + // we are supposed to scroll children, we bail out early: + if (!scrollChildren || q->children().isEmpty()) + return; + } - qt_event_request_window_change(q); #ifdef QT_MAC_USE_COCOA QMacCocoaAutoReleasePool pool; +#else + // We're not sure what the following call is supposed to achive + // but until we see what it breaks, we don't bring it into the + // Cocoa port: + qt_event_request_window_change(q); #endif - if(!valid_rect) { // scroll children - QPoint pd(dx, dy); - QWidgetList moved; - QObjectList chldrn = q->children(); - for(int i = 0; i < chldrn.size(); i++) { //first move all children - QObject *obj = chldrn.at(i); - if(obj->isWidgetType()) { - QWidget *w = (QWidget*)obj; - if(!w->isWindow()) { - w->data->crect = QRect(w->pos() + pd, w->size()); - if (w->testAttribute(Qt::WA_WState_Created)) { + // First move all native children. Alien children will indirectly be + // moved when the parent is scrolled. All directly or indirectly moved + // children will receive a move event before the function call returns. + QWidgetList movedChildren; + if (scrollChildren) { + QObjectList children = q->children(); + + for (int i=0; i<children.size(); i++) { + QObject *obj = children.at(i); + if (QWidget *w = qobject_cast<QWidget*>(obj)) { + if (!w->isWindow()) { + w->data->crect = QRect(w->pos() + scrollDelta, w->size()); #ifndef QT_MAC_USE_COCOA + if (w->testAttribute(Qt::WA_WState_Created)) { HIRect bounds = CGRectMake(w->data->crect.x(), w->data->crect.y(), w->data->crect.width(), w->data->crect.height()); HIViewRef hiview = qt_mac_nativeview_for(w); @@ -4593,83 +4705,148 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &r) HIViewSetFrame(hiview, &bounds); if (opaque) HIViewSetDrawingEnabled(hiview, true); + } #else - [qt_mac_nativeview_for(w) - setFrame:NSMakeRect(w->data->crect.x(), w->data->crect.y(), - w->data->crect.width(), w->data->crect.height())]; -#endif + if (NSView *view = qt_mac_nativeview_for(w)) { + // INVARIANT: w is not alien + [view setFrame:NSMakeRect( + w->data->crect.x(), w->data->crect.y(), + w->data->crect.width(), w->data->crect.height())]; } - moved.append(w); +#endif + movedChildren.append(w); } } } - //now send move events (do not do this in the above loop, breaks QAquaFocusWidget) - for(int i = 0; i < moved.size(); i++) { - QWidget *w = moved.at(i); - QMoveEvent e(w->pos(), w->pos() - pd); - QApplication::sendEvent(w, &e); - } } - if (!q->testAttribute(Qt::WA_WState_Created) || !q->isVisible()) - return; + if (q->testAttribute(Qt::WA_WState_Created) && q->isVisible()) { + // Scroll q itself according to the qscrollRect, and + // call update on any exposed areas so that they get redrawn: - OSViewRef view = qt_mac_nativeview_for(q); #ifndef QT_MAC_USE_COCOA - HIRect scrollrect = CGRectMake(r.x(), r.y(), r.width(), r.height()); - OSStatus err = _HIViewScrollRectWithOptions(view, valid_rect ? &scrollrect : 0, dx, dy, kHIViewScrollRectAdjustInvalid); - if (err) { - // The only parameter that can go wrong, is the rect. - qWarning("QWidget::scroll: Your rectangle was too big for the widget, clipping rect"); - scrollrect = CGRectMake(qMax(r.x(), 0), qMax(r.y(), 0), - qMin(r.width(), q->width()), qMin(r.height(), q->height())); - _HIViewScrollRectWithOptions(view, valid_rect ? &scrollrect : 0, dx, dy, kHIViewScrollRectAdjustInvalid); - } + OSViewRef view = qt_mac_nativeview_for(q); + HIRect scrollrect = CGRectMake(qscrollRect.x(), qscrollRect.y(), qscrollRect.width(), qscrollRect.height()); + OSStatus err = _HIViewScrollRectWithOptions(view, qscrollRect.isValid() ? &scrollrect : 0, dx, dy, kHIViewScrollRectAdjustInvalid); + if (err) { + // The only parameter that can go wrong, is the rect. + qWarning("QWidget::scroll: Your rectangle was too big for the widget, clipping rect"); + scrollrect = CGRectMake(qMax(qscrollRect.x(), 0), qMax(qscrollRect.y(), 0), + qMin(qscrollRect.width(), q->width()), qMin(qscrollRect.height(), q->height())); + _HIViewScrollRectWithOptions(view, qscrollRect.isValid() ? &scrollrect : 0, dx, dy, kHIViewScrollRectAdjustInvalid); + } #else - NSRect scrollRect = valid_rect ? NSMakeRect(r.x(), r.y(), r.width(), r.height()) - : NSMakeRect(0, 0, q->width(), q->height()); + QWidget *nativeWidget = isAlien ? q->nativeParentWidget() : q; + if (!nativeWidget) + return; + OSViewRef view = qt_mac_nativeview_for(nativeWidget); + if (!view) + return; - // calc the updateRect - NSRect deltaXRect = { {0, 0}, {0, 0} }; - NSRect deltaYRect = { {0, 0}, {0, 0} }; - if (dy != 0) { - deltaYRect.size.width = scrollRect.size.width; - if (dy > 0) { - deltaYRect.size.height = dy; - } else { - deltaYRect.size.height = -dy; - deltaYRect.origin.y = scrollRect.size.height + dy; + // Scroll the whole widget instead if qscrollRect is not valid: + QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : QRect(0, 0, q->width(), q->height()); + + if (isAlien) { + // Since q is alien, we need to translate the scroll rect: + QPoint widgetTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(QPoint())); + QPoint widgetBottomRightInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(q->rect().bottomRight())); + QPoint scrollTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(validScrollRect.topLeft())); + QPoint scrollBottomRightInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(validScrollRect.bottomRight())); + + // Adjust the scroll rect to the location as seen from the native parent: + validScrollRect.moveTo(scrollTopLeftInsideNative); + + // Ensure that that the destination rect of the + // scroll doesn't draw outside of q's geometry: + if (dy != 0) { + if (scrollTopLeftInsideNative.y() + dy < widgetTopLeftInsideNative.y()) { + // Scrolling outside top + validScrollRect.setTop(widgetTopLeftInsideNative.y() - dy); + } else if (scrollBottomRightInsideNative.y() + dy > widgetBottomRightInsideNative.y()) { + // Scrolling outside bottom + validScrollRect.setBottom(widgetBottomRightInsideNative.y() - dy); + } + } + + if (dx != 0) { + if (scrollTopLeftInsideNative.x() + dx < widgetTopLeftInsideNative.x()) { + // Scrolling outside left edge + validScrollRect.setLeft(widgetTopLeftInsideNative.x() - dx); + } else if (scrollBottomRightInsideNative.x() + dx > widgetBottomRightInsideNative.x()) { + // Scrolling outside right edge + validScrollRect.setRight(widgetBottomRightInsideNative.x() - dx); + } + } } - } - if (dx != 0) { - deltaXRect.size.height = scrollRect.size.height; - if (dx > 0) { - deltaXRect.size.width = dx; - } else { - deltaXRect.size.width = -dx; - deltaXRect.origin.x = scrollRect.size.width + dx; + + NSRect nsscrollRect = NSMakeRect( + validScrollRect.x(), validScrollRect.y(), + validScrollRect.width(), validScrollRect.height()); + + // Calculate the rectangles that needs to be redrawn + // after the scroll. This will be source rect minus destination rect: + + NSRect deltaXRect = { {0, 0}, {0, 0} }; + NSRect deltaYRect = { {0, 0}, {0, 0} }; + + if (dy != 0) { + deltaYRect.size.width = nsscrollRect.size.width; + deltaYRect.origin.x = nsscrollRect.origin.x; + if (dy > 0) { + deltaYRect.size.height = dy; + deltaYRect.origin.y = nsscrollRect.origin.y; + } else { + deltaYRect.size.height = -dy; + deltaYRect.origin.y = nsscrollRect.origin.y + nsscrollRect.size.height + dy; + } } - } - // ### Scroll the dirty regions as well, the following is not correct. - QRegion displayRegion = r.isNull() ? dirtyOnWidget : (dirtyOnWidget & r); - const QVector<QRect> &rects = dirtyOnWidget.rects(); - const QVector<QRect>::const_iterator end = rects.end(); - QVector<QRect>::const_iterator it = rects.begin(); - while (it != end) { - const QRect rect = *it; - const NSRect dirtyRect = NSMakeRect(rect.x() + dx, rect.y() + dy, - rect.width(), rect.height()); - [view setNeedsDisplayInRect:dirtyRect]; - ++it; - } + if (dx != 0) { + deltaXRect.size.height = nsscrollRect.size.height; + deltaXRect.origin.y = nsscrollRect.origin.y; + if (dx > 0) { + deltaXRect.size.width = dx; + deltaXRect.origin.x = nsscrollRect.origin.x; + } else { + deltaXRect.size.width = -dx; + deltaXRect.origin.x = nsscrollRect.origin.x + nsscrollRect.size.width + dx; + } + } - NSSize deltaSize = NSMakeSize(dx, dy); - [view scrollRect:scrollRect by:deltaSize]; - [view setNeedsDisplayInRect:deltaXRect]; - [view setNeedsDisplayInRect:deltaYRect]; + NSSize deltaSize = NSMakeSize(dx, dy); + [view scrollRect:nsscrollRect by:deltaSize]; + [view setNeedsDisplayInRect:deltaXRect]; + [view setNeedsDisplayInRect:deltaYRect]; + + // Some areas inside the scroll rect might have been marked as dirty from before, which + // means that they are scheduled to be redrawn. But as we now scroll, those dirty rects + // should also move along to ensure that q receives repaints on the correct places. + // Since some of the dirty rects might lay outside, or only intersect with, the scroll + // rect, the old calls to setNeedsDisplay still makes sense. + // NB: Using [view translateRectsNeedingDisplayInRect:nsscrollRect by:deltaSize] have + // so far not been proven fruitful to solve this problem. + const QVector<QRect> &rects = dirtyOnWidget.rects(); + const QVector<QRect>::const_iterator end = rects.end(); + QVector<QRect>::const_iterator it = rects.begin(); + while (it != end) { + QRect qdirtyRect = *it; + if (isAlien) { + const QPoint dirtyTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(qdirtyRect.topLeft())); + qdirtyRect.moveTo(dirtyTopLeftInsideNative); + } + const NSRect nsdirtyRect = NSMakeRect(qdirtyRect.x() + dx, qdirtyRect.y() + dy, qdirtyRect.width(), qdirtyRect.height()); + [view setNeedsDisplayInRect:nsdirtyRect]; + ++it; + } #endif // QT_MAC_USE_COCOA + } + + for (int i=0; i<movedChildren.size(); i++) { + QWidget *w = movedChildren.at(i); + QMoveEvent e(w->pos(), w->pos() - scrollDelta); + QApplication::sendEvent(w, &e); + } } int QWidget::metric(PaintDeviceMetric m) const @@ -4815,7 +4992,7 @@ void QWidgetPrivate::registerTouchWindow() #ifndef QT_MAC_USE_COCOA // Needs implementation! #else - NSView *view = qt_mac_nativeview_for(q); + NSView *view = qt_mac_effectiveview_for(q); [view setAcceptsTouchEvents:YES]; #endif #endif @@ -4837,7 +5014,7 @@ void QWidgetPrivate::setMask_sys(const QRegion ®ion) } else { syncCocoaMask(); } - + topLevelAt_cache = 0; #endif } @@ -4915,7 +5092,7 @@ void QWidgetPrivate::finishCocoaMaskSetup() [window setOpaque:(extra->imageMask == 0)]; [window invalidateShadow]; } - qt_mac_set_needs_display(q, QRegion()); + macSetNeedsDisplay(QRegion()); } #endif diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index 4b35238..8c29946 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -359,7 +359,8 @@ public: DrawInvisible = 0x08, DontSubtractOpaqueChildren = 0x10, DontSetCompositionMode = 0x20, - DontDrawOpaqueChildren = 0x40 + DontDrawOpaqueChildren = 0x40, + DontDrawNativeChildren = 0x80 }; enum CloseMode { @@ -791,7 +792,6 @@ public: #elif defined(Q_WS_MAC) // <--------------------------------------------------------- MAC // This is new stuff uint needWindowChange : 1; - uint hasAlienChildren : 1; // Each wiget keeps a list of all its child and grandchild OpenGL widgets. // This list is used to update the gl context whenever a parent and a granparent @@ -822,6 +822,7 @@ public: void macUpdateIgnoreMouseEvents(); void macUpdateMetalAttribute(); void macUpdateIsOpaque(); + void macSetNeedsDisplay(QRegion region); void setEnabled_helper_sys(bool enable); bool isRealWindow() const; void adjustWithinMaxAndMinSize(int &w, int &h); diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp index ae73d7d..f81c8ab 100644 --- a/src/gui/painting/qwindowsurface_raster.cpp +++ b/src/gui/painting/qwindowsurface_raster.cpp @@ -282,6 +282,7 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi CGrafPtr port = GetWindowPort(qt_mac_window_for(widget)); QDBeginCGContext(port, &context); #else + QMacCocoaAutoReleasePool pool; extern CGContextRef qt_mac_graphicsContextFor(QWidget *); CGContextRef context = qt_mac_graphicsContextFor(widget); #endif diff --git a/src/gui/widgets/qcocoamenu_mac.mm b/src/gui/widgets/qcocoamenu_mac.mm index b670186..e41e675 100644 --- a/src/gui/widgets/qcocoamenu_mac.mm +++ b/src/gui/widgets/qcocoamenu_mac.mm @@ -47,6 +47,7 @@ #include <private/qt_cocoa_helpers_mac_p.h> #include <private/qapplication_p.h> #include <private/qaction_p.h> +#include <private/qcocoaapplication_mac_p.h> #include <QtGui/QMenu> @@ -60,6 +61,7 @@ QT_FORWARD_DECLARE_CLASS(QEvent) QT_BEGIN_NAMESPACE extern bool qt_sendSpontaneousEvent(QObject*, QEvent*); //qapplication.cpp +extern NSString *qt_mac_removePrivateUnicode(NSString* string); QT_END_NAMESPACE QT_USE_NAMESPACE @@ -157,7 +159,6 @@ QT_USE_NAMESPACE // (i.e., fire the menu action). NSMenuItem *whichItem; // Change the private unicode keys to the ones used in setting the "Key Equivalents" - extern NSString *qt_mac_removePrivateUnicode(NSString* string); NSString *characters = qt_mac_removePrivateUnicode([event characters]); if ([self hasShortcut:menu forKey:characters diff --git a/src/gui/widgets/qfocusframe.cpp b/src/gui/widgets/qfocusframe.cpp index 4f20bce0..dd508fb 100644 --- a/src/gui/widgets/qfocusframe.cpp +++ b/src/gui/widgets/qfocusframe.cpp @@ -85,6 +85,9 @@ void QFocusFramePrivate::update() void QFocusFramePrivate::updateSize() { Q_Q(QFocusFrame); + if (!widget) + return; + int vmargin = q->style()->pixelMetric(QStyle::PM_FocusFrameVMargin), hmargin = q->style()->pixelMetric(QStyle::PM_FocusFrameHMargin); QPoint pos(widget->x(), widget->y()); diff --git a/src/gui/widgets/qmainwindow.cpp b/src/gui/widgets/qmainwindow.cpp index da902d5..2550ee4 100644 --- a/src/gui/widgets/qmainwindow.cpp +++ b/src/gui/widgets/qmainwindow.cpp @@ -1516,11 +1516,6 @@ void QMainWindow::setUnifiedTitleAndToolBarOnMac(bool set) if (!isWindow() || d->useHIToolBar == set || QSysInfo::MacintoshVersion < QSysInfo::MV_10_3) return; - // ### Disable when using alien widgets - if (testAttribute(Qt::WA_NativeWindow) == false) { - return; - } - d->useHIToolBar = set; createWinId(); // We need the hiview for down below. diff --git a/src/gui/widgets/qmainwindowlayout_mac.mm b/src/gui/widgets/qmainwindowlayout_mac.mm index 9e26423..84cf3eb 100644 --- a/src/gui/widgets/qmainwindowlayout_mac.mm +++ b/src/gui/widgets/qmainwindowlayout_mac.mm @@ -355,7 +355,11 @@ void QMainWindowLayout::updateHIToolBarStatus() // Move everything out of the HIToolbar into the main toolbar. while (!qtoolbarsInUnifiedToolbarList.isEmpty()) { // Should shrink the list by one every time. - layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, qtoolbarsInUnifiedToolbarList.first()); + QToolBar *toolbar = qtoolbarsInUnifiedToolbarList.first(); + layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar); +#if defined(QT_MAC_USE_COCOA) + toolbar->d_func()->isInUnifiedToolbar = false; +#endif } macWindowToolbarSet(qt_mac_window_for(layoutState.mainWindow), 0); } else { @@ -363,7 +367,8 @@ void QMainWindowLayout::updateHIToolBarStatus() for (int i = 0; i < toolbars.size(); ++i) { QToolBar *toolbar = toolbars.at(i); if (toolBarArea(toolbar) == Qt::TopToolBarArea) { - removeWidget(toolbar); // Do this here, because we are in an in-between state. + // Do this here, because we are in an in-between state. + removeWidget(toolbar); layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar); } } @@ -387,10 +392,20 @@ void QMainWindowLayout::insertIntoMacToolbar(QToolBar *before, QToolBar *toolbar if (toolbar == 0) return; +#if defined(QT_MAC_USE_COCOA) + // toolbar will now become native (if not allready) since we need + // an nsview for it inside the corresponding NSToolbarItem. + // Setting isInUnifiedToolbar will (among other things) stop alien + // siblings from becoming native when this happends since the toolbar + // will not overlap with other children of the QMainWindow. NB: Switching + // unified toolbar off after this stage is not supported, as this means + // that either the menubar must be alien again, or the sibling must + // be backed by an nsview to protect from overlapping issues: + toolbar->d_func()->isInUnifiedToolbar = true; +#endif QToolBarLayout *toolbarLayout = static_cast<QToolBarLayout *>(toolbar->layout()); - toolbarSaveState.insert(toolbar, ToolBarSaveState(toolbar->isMovable(), - toolbar->maximumSize())); + toolbarSaveState.insert(toolbar, ToolBarSaveState(toolbar->isMovable(), toolbar->maximumSize())); if (toolbarLayout->hasExpandFlag() == false) toolbar->setMaximumSize(toolbar->sizeHint()); @@ -399,8 +414,8 @@ void QMainWindowLayout::insertIntoMacToolbar(QToolBar *before, QToolBar *toolbar toolbarLayout->setUsePopupMenu(true); // Make the toolbar a child of the mainwindow to avoid creating a window. toolbar->setParent(layoutState.mainWindow); - toolbar->createWinId(); // Now create the OSViewRef. + toolbar->winId(); // Now create the OSViewRef. layoutState.mainWindow->createWinId(); OSWindowRef window = qt_mac_window_for(layoutState.mainWindow); diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index d230f2c..a518470 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -3852,29 +3852,6 @@ void tst_QWidget::testDeletionInEventHandlers() #ifdef Q_WS_MAC -bool testAndRelease(const HIViewRef view) -{ -// qDebug() << CFGetRetainCount(view); - if (CFGetRetainCount(view) != 2) - return false; - CFRelease(view); - CFRelease(view); - return true; -} - -typedef QPair<QWidget *, HIViewRef> WidgetViewPair; - -WidgetViewPair createAndRetain(QWidget * const parent = 0) -{ - QWidget * const widget = new QWidget(parent); - const HIViewRef view = (HIViewRef)widget->winId(); - // Retain twice so we can safely call CFGetRetaintCount even if the retain count - // is off by one because of a double release. - CFRetain(view); - CFRetain(view); - return qMakePair(widget, view); -} - /* Test that retaining and releasing the HIView returned by QWidget::winId() works even if the widget itself is deleted. @@ -4751,9 +4728,6 @@ void tst_QWidget::update() QRegion expectedVisible = QRegion(w.rect()) - child.visibleRegion().translated(childOffset); QCOMPARE(w.visibleRegion(), expectedVisible); -#ifdef QT_MAC_USE_COCOA - QEXPECT_FAIL(0, "Cocoa compositor paints the content view", Continue); -#endif QCOMPARE(w.paintedRegion, expectedVisible); #ifdef QT_MAC_USE_COCOA QEXPECT_FAIL(0, "Cocoa compositor says to paint this.", Continue); @@ -4803,14 +4777,8 @@ void tst_QWidget::update() & sibling.visibleRegion().translated(siblingOffset)); QCOMPARE(w.numPaintEvents, 1); -#ifdef QT_MAC_USE_COCOA - QEXPECT_FAIL(0, "Cocoa compositor paints the content view", Continue); -#endif QCOMPARE(w.paintedRegion, w.visibleRegion() & sibling.visibleRegion().translated(siblingOffset)); -#ifdef QT_MAC_USE_COCOA - QEXPECT_FAIL(0, "Cocoa compositor paints the content view", Continue); -#endif QCOMPARE(w.paintedRegion, (w.visibleRegion() - child.visibleRegion().translated(childOffset)) & sibling.visibleRegion().translated(siblingOffset)); @@ -4833,7 +4801,8 @@ void tst_QWidget::update() QCOMPARE(sibling.paintedRegion, sibling.visibleRegion()); #ifdef QT_MAC_USE_COCOA - QEXPECT_FAIL(0, "Cocoa compositor paints child and sibling", Continue); + if (child.internalWinId()) // child is native + QEXPECT_FAIL(0, "Cocoa compositor paints child and sibling", Continue); #endif QCOMPARE(child.numPaintEvents, 0); QCOMPARE(child.visibleRegion(), @@ -5464,6 +5433,7 @@ public: rect.width(), rect.height()); \ QCOMPARE(pixmap.size(), rect.size()); \ QPixmap expectedPixmap(pixmap); /* ensure equal formats */ \ + expectedPixmap.detach(); \ expectedPixmap.fill(color); \ QImage image = pixmap.toImage(); \ uint alphaCorrection = image.format() == QImage::Format_RGB32 ? 0xff000000 : 0; \ @@ -5510,9 +5480,6 @@ void tst_QWidget::moveChild() QTest::qWait(30); const QPoint tlwOffset = parent.geometry().topLeft(); -#ifdef QT_MAC_USE_COCOA - QEXPECT_FAIL(0, "Cocoa compositor paints the entire content view, even when opaque", Continue); -#endif QTRY_COMPARE(parent.r, QRegion(parent.rect()) - child.geometry()); QTRY_COMPARE(child.r, QRegion(child.rect())); VERIFY_COLOR(child.geometry().translated(tlwOffset), diff --git a/tests/auto/qwidget/tst_qwidget_mac_helpers.h b/tests/auto/qwidget/tst_qwidget_mac_helpers.h index f310aef..b341971 100644 --- a/tests/auto/qwidget/tst_qwidget_mac_helpers.h +++ b/tests/auto/qwidget/tst_qwidget_mac_helpers.h @@ -39,9 +39,20 @@ ** ****************************************************************************/ #include <QtCore/QString> -class QWidget; +#include <QtCore/QPair> +#include <QtGui/QWidget> #pragma once // Yeah, it's deprecated in general, but it's standard practive for Mac OS X. QString nativeWindowTitle(QWidget *widget, Qt::WindowState state); bool nativeWindowModified(QWidget *widget); + +#ifndef QT_MAC_USE_COCOA +typedef QPair<QWidget *, HIViewRef> WidgetViewPair; +bool testAndRelease(const HIViewRef view); +WidgetViewPair createAndRetain(QWidget * const parent = 0); +#else +typedef QPair<QWidget *, WId> WidgetViewPair; +bool testAndRelease(const WId); +WidgetViewPair createAndRetain(QWidget * const parent = 0); +#endif diff --git a/tests/auto/qwidget/tst_qwidget_mac_helpers.mm b/tests/auto/qwidget/tst_qwidget_mac_helpers.mm index 0572a4c..e1f23b0 100644 --- a/tests/auto/qwidget/tst_qwidget_mac_helpers.mm +++ b/tests/auto/qwidget/tst_qwidget_mac_helpers.mm @@ -72,3 +72,47 @@ bool nativeWindowModified(QWidget *widget) return [qt_mac_window_for(widget) isDocumentEdited]; #endif } + +#ifndef QT_MAC_USE_COCOA +bool testAndRelease(const HIViewRef view) +{ +// qDebug() << CFGetRetainCount(view); + if (CFGetRetainCount(view) != 2) + return false; + CFRelease(view); + CFRelease(view); + return true; +} + +WidgetViewPair createAndRetain(QWidget * const parent) +{ + QWidget * const widget = new QWidget(parent); + const HIViewRef view = (HIViewRef)widget->winId(); + // Retain twice so we can safely call CFGetRetaintCount even if the retain count + // is off by one because of a double release. + CFRetain(view); + CFRetain(view); + return qMakePair(widget, view); +} +#else +bool testAndRelease(const WId view) +{ + if ([id(view) retainCount] != 2) + return false; + [id(view) release]; + [id(view) release]; + return true; +} + +WidgetViewPair createAndRetain(QWidget * const parent) +{ + QWidget * const widget = new QWidget(parent); + const WId view = widget->winId(); + // Retain twice so we can safely call retainCount even if the retain count + // is off by one because of a double release. + [id(view) retain]; + [id(view) retain]; + return qMakePair(widget, view); +} +#endif + -- cgit v0.12 From 1b6656ea26d2a82a8763e8f3759b0ac683fca57a Mon Sep 17 00:00:00 2001 From: Jeremy Katz <jeremy.katz@nokia.com> Date: Mon, 17 Jan 2011 14:37:17 +0100 Subject: Implementation of QNetworkProxyFactory::systemProxyForQuery() for Symbian This implementation replaces the default do-nothing version, querying the device's commsdat for appropriate entries. Task-number: QTBUG-13857 Reviewed by: Jeremy Katz et al. --- dist/changes-4.7.2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dist/changes-4.7.2 b/dist/changes-4.7.2 index d443d88..0d93052 100644 --- a/dist/changes-4.7.2 +++ b/dist/changes-4.7.2 @@ -133,6 +133,10 @@ Qt for Symbian * [QTBUG-11436] Added a MediaObject property which allows the client to specify which Internet Access Point should be used for streaming. + - QNetworkProxyFactory + * [QTBUG-13857] Added systemProxyForQuery() for Symbian, allowing + network proxies configured on the device to be used by applications. + Qt for Embedded Linux --------------------- -- cgit v0.12 From 81351f2c6f9a939e4c34cb3be6280d396c21941f Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Mon, 17 Jan 2011 15:44:44 +0200 Subject: Fix one character displacement for cursor in line edits The variable m_inlinePosition was not updated when m_preeditString was cleared in QCoeFepInputContext. This resulted in cursor displaying up one character beyond where it logically should have been when using HW Qwerty keyboard on E7 and similar devices. Task-number: QTBUG-16238 Reviewed-by: axis --- src/gui/inputmethod/qcoefepinputcontext_s60.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index ff199b1..1bef64d 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -706,6 +706,7 @@ void QCoeFepInputContext::CancelFepInlineEdit() QInputMethodEvent event(QLatin1String(""), attributes); event.setCommitString(QLatin1String(""), 0, 0); m_preeditString.clear(); + m_inlinePosition = 0; sendEvent(event); } @@ -853,6 +854,7 @@ void QCoeFepInputContext::commitCurrentString(bool cancelFepTransaction) QInputMethodEvent event(QLatin1String(""), attributes); event.setCommitString(m_preeditString, 0, 0); m_preeditString.clear(); + m_inlinePosition = 0; sendEvent(event); m_hasTempPreeditString = false; -- cgit v0.12 From 500b76e801bf82d1a473641a3746b3d5adab5beb Mon Sep 17 00:00:00 2001 From: Konstantin Tokarev <annulen@yandex.ru> Date: Mon, 17 Jan 2011 15:14:56 +0100 Subject: don't misdetect powermac host systems when determining target arch Task-number: QTBUG-6150 Merge-request: 2549 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- mkspecs/features/mac/default_post.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/mac/default_post.prf b/mkspecs/features/mac/default_post.prf index 4999762..273094d 100644 --- a/mkspecs/features/mac/default_post.prf +++ b/mkspecs/features/mac/default_post.prf @@ -7,7 +7,7 @@ load(default_post) # PowerPC-based systems. Note that this logic assumes that Qt has been # configured with an architecture that is usable on the system. qt:!isEmpty(QT_CONFIG) { - contains(QMAKE_HOST.arch, ppc) { + contains(QMAKE_HOST.arch, ppc)|contains(QMAKE_HOST.arch, "Power Macintosh") { !contains(QT_CONFIG, ppc64):contains(QT_CONFIG, ppc):CONFIG += ppc contains(QT_CONFIG, ppc64):!contains(QT_CONFIG, ppc):CONFIG += ppc64 } else { -- cgit v0.12 From 7a7c36d80c1f84ca493c29bf8d4e0bd447740b8d Mon Sep 17 00:00:00 2001 From: marce villarino <mvillarino@gmail.com> Date: Mon, 17 Jan 2011 15:44:44 +0100 Subject: Updates to Galician localization Merge-request: 1024 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- translations/qt_gl.ts | 2862 ++++++++++++++++++++++---------------------- translations/qt_help_gl.ts | 320 +++++ 2 files changed, 1749 insertions(+), 1433 deletions(-) create mode 100644 translations/qt_help_gl.ts diff --git a/translations/qt_gl.ts b/translations/qt_gl.ts index 1f3e02e..23e71c2 100644 --- a/translations/qt_gl.ts +++ b/translations/qt_gl.ts @@ -5,7 +5,7 @@ <name>CloseButton</name> <message> <source>Close Tab</source> - <translation>Pechar a lingüeta</translation> + <translation>Pechar a lapela</translation> </message> </context> <context> @@ -51,30 +51,6 @@ </message> </context> <context> - <name>QApplication</name> - <message> - <source>QT_LAYOUT_DIRECTION</source> - <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> - <translation>LTR</translation> - </message> - <message> - <source>Activate</source> - <translation>Activar</translation> - </message> - <message> - <source>Activates the program's main window</source> - <translation>Activa a fiestra principal do programa</translation> - </message> - <message> - <source>Executable '%1' requires Qt %2, found Qt %3.</source> - <translation>O executábel «%1» require de Qt %2, e achouse Qt %3.</translation> - </message> - <message> - <source>Incompatible Qt Library Error</source> - <translation>Erro de bibliotecas Qt incompatíbeis</translation> - </message> -</context> -<context> <name>Phonon::</name> <message> <source>Notifications</source> @@ -134,7 +110,7 @@ máis preferencia ou está configurado especificamente para este fluxo.</html <message> <source>Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled</source> - <translation>Aviso: Non semella ter instaladas as extensións básicas de GStreamer. + <translation>Aviso: Non semella ter instalados os complementos básicos de GStreamer. Desactivouse todo o soporte de son e vídeo</translation> </message> </context> @@ -155,7 +131,7 @@ Comprobe a instalación de GStreamer e verifique que ten instalado libgstreamer- </message> <message> <source>Plugin codec installation failed for codec: %0</source> - <translation>Fallou a instalación da extensión dun códec: %0</translation> + <translation>Fallou a instalación do complemento dun códec: %0</translation> </message> <message> <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> @@ -172,7 +148,7 @@ reproducir este contido: %0</translation> </message> <message> <source>Could not locate media source.</source> - <translation>Non foi posíbel localizar a orixe do medio.</translation> + <translation>Non foi posíbel atopar a orixe do medio.</translation> </message> <message> <source>Could not open audio device. The device is already in use.</source> @@ -223,7 +199,7 @@ reproducir este contido: %0</translation> </message> <message> <source>Path not found</source> - <translation>Non se atopou a rota</translation> + <translation>Non se atopou a ruta</translation> </message> <message> <source>In use</source> @@ -348,6 +324,10 @@ reproducir este contido: %0</translation> <source>Playback complete</source> <translation>Completouse a reprodución</translation> </message> + <message> + <source>Download error</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>Phonon::MMF::AbstractVideoPlayer</name> @@ -467,6 +447,10 @@ reproducir este contido: %0</translation> <source>Error opening source: media type could not be determined</source> <translation>Erro ao abrir a fonte: non foi posíbel determinar o tipo de medio</translation> </message> + <message> + <source>Failed to set requested IAP</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>Phonon::MMF::StereoWidening</name> @@ -752,7 +736,7 @@ reproducir este contido: %0</translation> </message> <message> <source>Find Directory</source> - <translation>Procurar un cartafol</translation> + <translation>Buscar un cartafol</translation> </message> <message> <source>Directories</source> @@ -772,7 +756,7 @@ File not found. Check path and filename.</source> <translation>%1 Non se atopou o ficheiro. -Verifique a rota e o nome do ficheiro.</translation> +Verifique a ruta e o nome do ficheiro.</translation> </message> <message> <source>All Files (*.*)</source> @@ -936,31 +920,31 @@ para </message> <message> <source>Contains commands to manipulate the window</source> - <translation>Contén ordes para manipular a fiestra</translation> + <translation>Contén ordes para manipular a xanela</translation> </message> <message> <source>Puts a minimized window back to normal</source> - <translation>Volta unha fiestra minimizada ao tamaño normal</translation> + <translation>Volta unha xanela minimizada ao tamaño normal</translation> </message> <message> <source>Moves the window out of the way</source> - <translation>Vota a un lado a fiestra</translation> + <translation>Vota a un lado a xanela</translation> </message> <message> <source>Puts a maximized window back to normal</source> - <translation>Volta unha fiestra maximizada ao tamaño normal</translation> + <translation>Volta unha xanela maximizada ao tamaño normal</translation> </message> <message> <source>Makes the window full screen</source> - <translation>Pon a fiestra a pantalla completa</translation> + <translation>Pon a xanela a pantalla completa</translation> </message> <message> <source>Closes the window</source> - <translation>Pecha a fiestra</translation> + <translation>Pecha a xanela</translation> </message> <message> <source>Displays the name of the window and contains controls to manipulate it</source> - <translation>Mostra o nome da fiestra e contén controles para manipulala</translation> + <translation>Mostra o nome da xanela e contén controles para manipulala</translation> </message> </context> <context> @@ -1064,176 +1048,6 @@ para </message> </context> <context> - <name>QHttp</name> - <message> - <source>Connection refused</source> - <translation>Rexeitouse a conexión</translation> - </message> - <message> - <source>Connection closed</source> - <translation>Pechouse a conexión</translation> - </message> - <message> - <source>Proxy requires authentication</source> - <translation>O proxy require autenticación</translation> - </message> - <message> - <source>Host requires authentication</source> - <translation>O servidor require autenticación</translation> - </message> - <message> - <source>Data corrupted</source> - <translation>Datos corrompidos</translation> - </message> - <message> - <source>Unknown protocol specified</source> - <translation>Especificouse un protocolo descoñecido</translation> - </message> - <message> - <source>SSL handshake failed</source> - <translation>Fallou a negociación de SSL</translation> - </message> - <message> - <source>HTTPS connection requested but SSL support not compiled in</source> - <translation>Pediuse unha conexión HTTPS pero non se compilou con soporte de SSL</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Erro descoñecido</translation> - </message> - <message> - <source>Request aborted</source> - <translation>Pedido abortado</translation> - </message> - <message> - <source>No server set to connect to</source> - <translation>Non se indicou ningún servidor co que conectar</translation> - </message> - <message> - <source>Wrong content length</source> - <translation>Longitude do contido incorrecta</translation> - </message> - <message> - <source>Server closed connection unexpectedly</source> - <translation>O servidor pechou a conexión inesperadamente</translation> - </message> - <message> - <source>Connection refused (or timed out)</source> - <translation>Rexeitouse a conexión (ou esgouto o tempo-límite)</translation> - </message> - <message> - <source>Host %1 not found</source> - <translation>Non se atopou o servidor %1</translation> - </message> - <message> - <source>HTTP request failed</source> - <translation>O pedido HTTP fallou</translation> - </message> - <message> - <source>Invalid HTTP response header</source> - <translation>A cabeceira da resposta HTTP non é válida</translation> - </message> - <message> - <source>Unknown authentication method</source> - <translation>Método descoñecido de autenticación</translation> - </message> - <message> - <source>Proxy authentication required</source> - <translation>Requírese de autenticación no proxy</translation> - </message> - <message> - <source>Authentication required</source> - <translation>Requírese de autenticación</translation> - </message> - <message> - <source>Invalid HTTP chunked body</source> - <translation>Corpo HTTP en pedazos non válido</translation> - </message> - <message> - <source>Error writing response to device</source> - <translation>Erro ao escribir a resposta no dispositivo</translation> - </message> - <message> - <source>Host %1 found</source> - <translation>Atopouse o servidor %1</translation> - </message> - <message> - <source>Connected to host %1</source> - <translation>Conectado co servidor %1</translation> - </message> - <message> - <source>Connection to %1 closed</source> - <translation>Pechouse a conexión con %1</translation> - </message> - <message> - <source>Host found</source> - <translation>Atopouse un servidor</translation> - </message> - <message> - <source>Connected to host</source> - <translation>Conectado co servidor</translation> - </message> -</context> -<context> - <name>QSocks5SocketEngine</name> - <message> - <source>Connection to proxy refused</source> - <translation>A conexión co proxy foi rexeitada</translation> - </message> - <message> - <source>Connection to proxy closed prematurely</source> - <translation>A conexión co proxy pechouse antes de tempo</translation> - </message> - <message> - <source>Proxy host not found</source> - <translation>Non se atopou o servidor proxy</translation> - </message> - <message> - <source>Connection to proxy timed out</source> - <translation>A conexión co proxy esgotou o tempo-límite</translation> - </message> - <message> - <source>Proxy authentication failed</source> - <translation>Fallou a autenticación co proxy</translation> - </message> - <message> - <source>Proxy authentication failed: %1</source> - <translation>Fallou a autenticación no proxy: %1</translation> - </message> - <message> - <source>SOCKS version 5 protocol error</source> - <translation>Erro do protocolo SOCKS versión 5</translation> - </message> - <message> - <source>General SOCKSv5 server failure</source> - <translation>Fallo xeral do servidor SOCKSv5</translation> - </message> - <message> - <source>Connection not allowed by SOCKSv5 server</source> - <translation>O servidor SOCKSv5 non permitiu a conexión</translation> - </message> - <message> - <source>TTL expired</source> - <translation>Esgotouse o TTL</translation> - </message> - <message> - <source>SOCKSv5 command not supported</source> - <translation>A orde SOCKSv5 non está soportada</translation> - </message> - <message> - <source>Address type not supported</source> - <translation>Tipo de enderezo non soportado</translation> - </message> - <message> - <source>Unknown SOCKSv5 proxy error code 0x%1</source> - <translation>Código de erro descoñecido (0x%1) do proxy SOCKSv5</translation> - </message> - <message> - <source>Network operation timed out</source> - <translation>A operación de rede esgotou o tempo-límite</translation> - </message> -</context> -<context> <name>QAbstractSpinBox</name> <message> <source>&Select All</source> @@ -1256,43 +1070,27 @@ para </message> </context> <context> - <name>QCheckBox</name> - <message> - <source>Uncheck</source> - <translation>Desmarcar</translation> - </message> - <message> - <source>Check</source> - <translation>Marcar</translation> - </message> + <name>QApplication</name> <message> - <source>Toggle</source> - <translation>Conmutar</translation> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation>LTR</translation> </message> -</context> -<context> - <name>QPushButton</name> <message> - <source>Open</source> - <translation>Abrir</translation> + <source>Activate</source> + <translation>Activar</translation> </message> -</context> -<context> - <name>QRadioButton</name> <message> - <source>Check</source> - <translation>Marcar</translation> + <source>Activates the program's main window</source> + <translation>Activa a xanela principal do programa</translation> </message> -</context> -<context> - <name>QToolButton</name> <message> - <source>Press</source> - <translation>Premer</translation> + <source>Executable '%1' requires Qt %2, found Qt %3.</source> + <translation>O executábel «%1» require de Qt %2, e atopouse Qt %3.</translation> </message> <message> - <source>Open</source> - <translation>Abrir</translation> + <source>Incompatible Qt Library Error</source> + <translation>Erro de bibliotecas Qt incompatíbeis</translation> </message> </context> <context> @@ -1315,6 +1113,21 @@ para </message> </context> <context> + <name>QCheckBox</name> + <message> + <source>Uncheck</source> + <translation>Desmarcar</translation> + </message> + <message> + <source>Check</source> + <translation>Marcar</translation> + </message> + <message> + <source>Toggle</source> + <translation>Conmutar</translation> + </message> +</context> +<context> <name>QColorDialog</name> <message> <source>Hu&e:</source> @@ -1381,22 +1194,11 @@ para </message> </context> <context> - <name>QTabBar</name> + <name>QCoreApplication</name> <message> - <source>Scroll Left</source> - <translation>Desprazar cara a esquerda</translation> - </message> - <message> - <source>Scroll Right</source> - <translation>Desprazar cara a dereita</translation> - </message> -</context> -<context> - <name>QCoreApplication</name> - <message> - <source>%1: already exists</source> - <comment>QSystemSemaphore</comment> - <translation>%1: xa existe</translation> + <source>%1: already exists</source> + <comment>QSystemSemaphore</comment> + <translation>%1: xa existe</translation> </message> <message> <source>%1: does not exist</source> @@ -1409,6 +1211,11 @@ para <translation>%1: esgotou os recursos</translation> </message> <message> + <source>%1: permission denied</source> + <comment>QSystemSemaphore</comment> + <translation type="unfinished">%1: negouse o permiso</translation> + </message> + <message> <source>%1: unknown error %2</source> <comment>QSystemSemaphore</comment> <translation>%1: erro descoñecido %2</translation> @@ -1430,29 +1237,6 @@ para </message> </context> <context> - <name>QSystemSemaphore</name> - <message> - <source>%1: permission denied</source> - <translation>%1: negouse o permiso</translation> - </message> - <message> - <source>%1: already exists</source> - <translation>%1: xa existe</translation> - </message> - <message> - <source>%1: does not exist</source> - <translation>%1: non existe</translation> - </message> - <message> - <source>%1: out of resources</source> - <translation>%1: esgotou os recursos</translation> - </message> - <message> - <source>%1: unknown error %2</source> - <translation>%1: erro descoñecido %2</translation> - </message> -</context> -<context> <name>QDB2Driver</name> <message> <source>Unable to connect</source> @@ -1499,46 +1283,6 @@ para </message> </context> <context> - <name>QODBCResult</name> - <message> - <source>Unable to fetch last</source> - <translation>Non foi posíbel acadar o último</translation> - </message> - <message> - <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> - <translation>QODBCResult::reset: Non foi posíbel estabelecer «SQL_CURSOR_STATIC» como -atributo da sentenza. Verifique a configuración do controlador ODBC</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Non foi posíbel executar a sentenza</translation> - </message> - <message> - <source>Unable to fetch</source> - <translation>Non foi posíbel acadar</translation> - </message> - <message> - <source>Unable to fetch next</source> - <translation>Non foi posíbel acadar o seguinte</translation> - </message> - <message> - <source>Unable to fetch first</source> - <translation>Non foi posíbel acadar o primeiro</translation> - </message> - <message> - <source>Unable to fetch previous</source> - <translation>Non foi posíbel acadar o anterior</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Non foi posíbel preparar a sentenza</translation> - </message> - <message> - <source>Unable to bind variable</source> - <translation>Non foi posíbel asociar a variábel</translation> - </message> -</context> -<context> <name>QDateTimeEdit</name> <message> <source>AM</source> @@ -1561,11 +1305,11 @@ atributo da sentenza. Verifique a configuración do controlador ODBC</translatio <name>QDeclarativeAbstractAnimation</name> <message> <source>Cannot animate non-existent property "%1"</source> - <translation>Non se pode animar a propriedade inexistente «%1»</translation> + <translation>Non se pode animar a propiedade inexistente «%1»</translation> </message> <message> <source>Cannot animate read-only property "%1"</source> - <translation>Non se pode animar a propriedade só para lectura «%1»</translation> + <translation>Non se pode animar a propiedade só para lectura «%1»</translation> </message> <message> <source>Animation is an abstract class</source> @@ -1580,42 +1324,6 @@ atributo da sentenza. Verifique a configuración do controlador ODBC</translatio </message> </context> <context> - <name>QDeclarativeParentAnimation</name> - <message> - <source>Unable to preserve appearance under complex transform</source> - <translation>Non é posíbel conservar a aparencia con transformación complexa</translation> - </message> - <message> - <source>Unable to preserve appearance under non-uniform scale</source> - <translation>Non é posíbel conservar a aparencia con escalado non uniforme</translation> - </message> - <message> - <source>Unable to preserve appearance under scale of 0</source> - <translation>Non é posíbel conservar a aparencia con escala de 0</translation> - </message> -</context> -<context> - <name>QDeclarativePauseAnimation</name> - <message> - <source>Cannot set a duration of < 0</source> - <translation>Non se pode indicar unha duración < 0</translation> - </message> -</context> -<context> - <name>QDeclarativePropertyAnimation</name> - <message> - <source>Cannot set a duration of < 0</source> - <translation>Non se pode indicar unha duración < 0</translation> - </message> -</context> -<context> - <name>QDeclarativeXmlListModel</name> - <message> - <source>Qt was built without support for xmlpatterns</source> - <translation>Qt construíuse sen soporte para xmlpatterns</translation> - </message> -</context> -<context> <name>QDeclarativeAnchors</name> <message> <source>Possible anchor loop detected on fill.</source> @@ -1675,20 +1383,6 @@ superior, inferior nin vcenter.</translation> </message> </context> <context> - <name>QDeclarativeKeyNavigationAttached</name> - <message> - <source>KeyNavigation is only available via attached properties</source> - <translation>KeyNavigation só está dispoñíbel mediante as propriedades anexadas</translation> - </message> -</context> -<context> - <name>QDeclarativeKeysAttached</name> - <message> - <source>Keys is only available via attached properties</source> - <translation>Keys só está dispoñíbel mediante as propriedades anexadas</translation> - </message> -</context> -<context> <name>QDeclarativeBehavior</name> <message> <source>Cannot change the animation assigned to a Behavior.</source> @@ -1699,85 +1393,85 @@ superior, inferior nin vcenter.</translation> <name>QDeclarativeBinding</name> <message> <source>Binding loop detected for property "%1"</source> - <translation>Detectouse un ciclo de unión para a propriedade «%1»</translation> + <translation>Detectouse un ciclo de unión para a propiedade «%1»</translation> </message> </context> <context> <name>QDeclarativeCompiledBindings</name> <message> <source>Binding loop detected for property "%1"</source> - <translation>Detectouse un ciclo de unión para a propriedade «%1»</translation> + <translation>Detectouse un ciclo de unión para a propiedade «%1»</translation> </message> </context> <context> <name>QDeclarativeCompiler</name> <message> <source>Invalid property assignment: "%1" is a read-only property</source> - <translation>Asignación de propriedade non válida: «%1» é unha propriedade só para lectura</translation> + <translation>Asignación de propiedade non válida: «%1» é unha propiedade só para lectura</translation> </message> <message> <source>Invalid property assignment: unknown enumeration</source> - <translation>Asignación de propriedade non válida: enumeración descoñecida</translation> + <translation>Asignación de propiedade non válida: enumeración descoñecida</translation> </message> <message> <source>Invalid property assignment: string expected</source> - <translation>Asignación de propriedade non válida: agardábase unha cadea</translation> + <translation>Asignación de propiedade non válida: agardábase unha cadea</translation> </message> <message> <source>Invalid property assignment: url expected</source> - <translation>Asignación de propriedade non válida: agardábase un URL</translation> + <translation>Asignación de propiedade non válida: agardábase un URL</translation> </message> <message> <source>Invalid property assignment: unsigned int expected</source> - <translation>Asignación de propriedade non válida: agardábase un unsigned int</translation> + <translation>Asignación de propiedade non válida: agardábase un unsigned int</translation> </message> <message> <source>Invalid property assignment: int expected</source> - <translation>Asignación de propriedade non válida: agardábase un int</translation> + <translation>Asignación de propiedade non válida: agardábase un int</translation> </message> <message> <source>Invalid property assignment: number expected</source> - <translation>Asignación de propriedade non válida: agardábase un número</translation> + <translation>Asignación de propiedade non válida: agardábase un número</translation> </message> <message> <source>Invalid property assignment: color expected</source> - <translation>Asignación de propriedade non válida: agardábase unha cor</translation> + <translation>Asignación de propiedade non válida: agardábase unha cor</translation> </message> <message> <source>Invalid property assignment: date expected</source> - <translation>Asignación de propriedade non válida: agardábase unha date</translation> + <translation>Asignación de propiedade non válida: agardábase unha date</translation> </message> <message> <source>Invalid property assignment: time expected</source> - <translation>Asignación de propriedade non válida: agardábase un time</translation> + <translation>Asignación de propiedade non válida: agardábase un time</translation> </message> <message> <source>Invalid property assignment: datetime expected</source> - <translation>Asignación de propriedade non válida: agardábase un datetime</translation> + <translation>Asignación de propiedade non válida: agardábase un datetime</translation> </message> <message> <source>Invalid property assignment: point expected</source> - <translation>Asignación de propriedade non válida: agardábase un punto</translation> + <translation>Asignación de propiedade non válida: agardábase un punto</translation> </message> <message> <source>Invalid property assignment: size expected</source> - <translation>Asignación de propriedade non válida: agardábase un tamaño</translation> + <translation>Asignación de propiedade non válida: agardábase un tamaño</translation> </message> <message> <source>Invalid property assignment: rect expected</source> - <translation>Asignación de propriedade non válida: agardábase un rect</translation> + <translation>Asignación de propiedade non válida: agardábase un rect</translation> </message> <message> <source>Invalid property assignment: boolean expected</source> - <translation>Asignación de propriedade non válida: agardábase un booleano</translation> + <translation>Asignación de propiedade non válida: agardábase un booleano</translation> </message> <message> <source>Invalid property assignment: 3D vector expected</source> - <translation>Asignación de propriedade non válida: agardábase un vector 3D</translation> + <translation>Asignación de propiedade non válida: agardábase un vector 3D</translation> </message> <message> <source>Invalid property assignment: unsupported type "%1"</source> - <translation>Asignación de propriedade non válida: tipo non soportado «%1»</translation> + <translation>Asignación de propiedade non válida: tipo non soportado «%1»</translation> </message> <message> <source>Element is not creatable.</source> @@ -1785,7 +1479,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Component elements may not contain properties other than id</source> - <translation>Os elementos compoñentes non poden conter máis propriedades que o id</translation> + <translation>Os elementos compoñentes non poden conter máis propiedades que o id</translation> </message> <message> <source>Invalid component id specification</source> @@ -1801,7 +1495,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Component objects cannot declare new properties.</source> - <translation>Os obxectos compoñentes non poden declarar novas propriedades.</translation> + <translation>Os obxectos compoñentes non poden declarar novas propiedades.</translation> </message> <message> <source>Component objects cannot declare new signals.</source> @@ -1829,15 +1523,15 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Empty property assignment</source> - <translation>Asignación baleira de propriedade</translation> + <translation>Asignación baleira de propiedade</translation> </message> <message> <source>Attached properties cannot be used here</source> - <translation>As propriedades anexas non se poden empregar aquí</translation> + <translation>As propiedades anexas non se poden empregar aquí</translation> </message> <message> <source>Non-existent attached object</source> - <translation>Anexáronse propriedades inexistentes</translation> + <translation>Anexáronse propiedades inexistentes</translation> </message> <message> <source>Invalid attached object assignment</source> @@ -1845,11 +1539,11 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Cannot assign to non-existent default property</source> - <translation>Non se pode asignar a unha propriedade predeterminada inexistente</translation> + <translation>Non se pode asignar a unha propiedade predeterminada inexistente</translation> </message> <message> <source>Cannot assign to non-existent property "%1"</source> - <translation>Non se pode asignar a unha propriedade inexistente «%1»</translation> + <translation>Non se pode asignar a unha propiedade inexistente «%1»</translation> </message> <message> <source>Invalid use of namespace</source> @@ -1857,35 +1551,35 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Not an attached property name</source> - <translation>Non é un nome de propriedade anexa</translation> + <translation>Non é un nome de propiedade anexa</translation> </message> <message> <source>Invalid use of id property</source> - <translation>Uso non válido da propriedade id</translation> + <translation>Uso non válido da propiedade id</translation> </message> <message> <source>Property has already been assigned a value</source> - <translation>Xa se lle asignou un valor a esta propriedade</translation> + <translation>Xa se lle asignou un valor a esta propiedade</translation> </message> <message> <source>Invalid grouped property access</source> - <translation>Acceso non válido a unha propriedade agrupada</translation> + <translation>Acceso non válido a unha propiedade agrupada</translation> </message> <message> <source>Cannot assign a value directly to a grouped property</source> - <translation>Non se pode asignar directamente un valor a unha propriedade agrupada</translation> + <translation>Non se pode asignar directamente un valor a unha propiedade agrupada</translation> </message> <message> <source>Invalid property use</source> - <translation>Uso non válido da propriedade</translation> + <translation>Uso non válido da propiedade</translation> </message> <message> <source>Property assignment expected</source> - <translation>Agardábase unha asignación de propriedade</translation> + <translation>Agardábase unha asignación de propiedade</translation> </message> <message> <source>Single property assignment expected</source> - <translation>Agardábase unha única asignación a propriedade</translation> + <translation>Agardábase unha única asignación a propiedade</translation> </message> <message> <source>Unexpected object assignment</source> @@ -1905,15 +1599,19 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Cannot assign multiple values to a script property</source> - <translation>Non se poden asignar varios valores a unha propriedade de script</translation> + <translation>Non se poden asignar varios valores a unha propiedade de script</translation> </message> <message> <source>Invalid property assignment: script expected</source> - <translation>Asignación de propriedade non válida: agardábase un script</translation> + <translation>Asignación de propiedade non válida: agardábase un script</translation> + </message> + <message> + <source>Cannot assign multiple values to a singular property</source> + <translation type="unfinished"></translation> </message> <message> <source>Cannot assign object to property</source> - <translation>Non se pode asignar un obxecto a unha propriedade</translation> + <translation>Non se pode asignar un obxecto a unha propiedade</translation> </message> <message> <source>"%1" cannot operate on "%2"</source> @@ -1921,19 +1619,19 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Duplicate default property</source> - <translation>Propriedade predeterminada duplicada</translation> + <translation>Propiedade predeterminada duplicada</translation> </message> <message> <source>Duplicate property name</source> - <translation>Nome de propriedade duplicado</translation> + <translation>Nome de propiedade duplicado</translation> </message> <message> <source>Property names cannot begin with an upper case letter</source> - <translation>Os nomes das propriedades non poden comezar por maiúscula</translation> + <translation>Os nomes das propiedades non poden comezar por maiúscula</translation> </message> <message> <source>Illegal property name</source> - <translation>Nome ilegal de propriedade</translation> + <translation>Nome ilegal de propiedade</translation> </message> <message> <source>Duplicate signal name</source> @@ -1961,19 +1659,19 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Property value set multiple times</source> - <translation>O valor dunha propriedade indicouse varias veces</translation> + <translation>O valor dunha propiedade indicouse varias veces</translation> </message> <message> <source>Invalid property nesting</source> - <translation>Aniñamento non válido de propriedade</translation> + <translation>Aniñamento non válido de propiedade</translation> </message> <message> <source>Cannot override FINAL property</source> - <translation>Non se pode sobrescribir a propriedade FINAL</translation> + <translation>Non se pode sobrescribir a propiedade FINAL</translation> </message> <message> <source>Invalid property type</source> - <translation>Tipo de propriedade non válido</translation> + <translation>Tipo de propiedade non válido</translation> </message> <message> <source>Invalid empty ID</source> @@ -1993,23 +1691,31 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>ID illegally masks global JavaScript property</source> - <translation>O ID enmascara ilegalmente unha propriedade JavaScript global</translation> + <translation>O ID enmascara ilegalmente unha propiedade JavaScript global</translation> </message> <message> <source>No property alias location</source> - <translation>Falta a localización dun alcume dunha propriedade</translation> + <translation>Falta a localización dun alcume dunha propiedade</translation> </message> <message> <source>Invalid alias location</source> <translation>Localización non válida dun alcume</translation> </message> <message> + <source>Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Alias property exceeds alias bounds</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Invalid alias reference. An alias reference must be specified as <id> or <id>.<property></source> - <translation>Referencianon válida a un alcume. Unha referencia a un alcume debe indicarse como <id> ou como <id>.<propriedade></translation> + <translation type="obsolete">Referencia non válida a un alcume. Unha referencia a un alcume debe indicarse como <id> ou como <id>.<propiedade></translation> </message> <message> <source>Invalid alias reference. Unable to find id "%1"</source> - <translation>Referencia non válida a un alcume. Non foi posíbel achar o id «%1»</translation> + <translation>Referencia non válida a un alcume. Non foi posíbel atopar o id «%1»</translation> </message> </context> <context> @@ -2023,26 +1729,26 @@ superior, inferior nin vcenter.</translation> <name>QDeclarativeCompositeTypeManager</name> <message> <source>Resource %1 unavailable</source> - <translation>O recurso %1 non está dispoñíbel</translation> + <translation type="obsolete">O recurso %1 non está dispoñíbel</translation> </message> <message> <source>Namespace %1 cannot be used as a type</source> - <translation>O espazo de nomes %1 non se pode empregar como un tipo</translation> + <translation type="obsolete">O espazo de nomes %1 non se pode empregar como un tipo</translation> </message> <message> <source>%1 %2</source> - <translation>%1 %2</translation> + <translation type="obsolete">%1 %2</translation> </message> <message> <source>Type %1 unavailable</source> - <translation>O tipo %1 non está dispoñíbel</translation> + <translation type="obsolete">O tipo %1 non está dispoñíbel</translation> </message> </context> <context> <name>QDeclarativeConnections</name> <message> <source>Cannot assign to non-existent property "%1"</source> - <translation>Non é posíbel asignar a unha propriedade non existente «%1»</translation> + <translation>Non é posíbel asignar a unha propiedade non existente «%1»</translation> </message> <message> <source>Connections: nested objects not allowed</source> @@ -2069,7 +1775,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Version mismatch: expected %1, found %2</source> - <translation>Non se corresponden as versións: agardábase a %1 pero achouse a %2</translation> + <translation>Non se corresponden as versións: agardábase a %1 pero atopouse a %2</translation> </message> <message> <source>SQL transaction failed</source> @@ -2088,26 +1794,30 @@ superior, inferior nin vcenter.</translation> <name>QDeclarativeFlipable</name> <message> <source>front is a write-once property</source> - <translation>front é unha propriedade só para escrita</translation> + <translation>front é unha propiedade só para escrita</translation> </message> <message> <source>back is a write-once property</source> - <translation>bach é unha propriedade só para escrita</translation> + <translation>back é unha propiedade só para escrita</translation> </message> </context> <context> <name>QDeclarativeImportDatabase</name> <message> + <source>cannot load module "%1": File name case mismatch for "%2"</source> + <translation type="unfinished"></translation> + </message> + <message> <source>module "%1" definition "%2" not readable</source> <translation>a definición «%2» no módulo «%1» non é lexíbel</translation> </message> <message> <source>plugin cannot be loaded for module "%1": %2</source> - <translation>non foi posíbel cargar a extensión para o módulo «%1»: %2</translation> + <translation>non foi posíbel cargar o complemento para o módulo «%1»: %2</translation> </message> <message> <source>module "%1" plugin "%2" not found</source> - <translation>non se atopou a extensión «%2» do módulo «%1»</translation> + <translation>non se atopou o complemento «%2» do módulo «%1»</translation> </message> <message> <source>module "%1" version %2.%3 is not installed</source> @@ -2139,7 +1849,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>is ambiguous. Found in %1 and in %2</source> - <translation>é ambíguo. Atopouse en %1 e en %2</translation> + <translation>é ambiguo. Atopouse en %1 e en %2</translation> </message> <message> <source>is ambiguous. Found in %1 in version %2.%3 and %4.%5</source> @@ -2153,6 +1863,24 @@ superior, inferior nin vcenter.</translation> <source>is not a type</source> <translation>non é un tipo</translation> </message> + <message> + <source>File name case mismatch for "%2"</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QDeclarativeKeyNavigationAttached</name> + <message> + <source>KeyNavigation is only available via attached properties</source> + <translation>KeyNavigation só está dispoñíbel mediante as propiedades anexadas</translation> + </message> +</context> +<context> + <name>QDeclarativeKeysAttached</name> + <message> + <source>Keys is only available via attached properties</source> + <translation>Keys só está dispoñíbel mediante as propiedades anexadas</translation> + </message> </context> <context> <name>QDeclarativeListModel</name> @@ -2190,15 +1918,15 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>ListElement: cannot use reserved "id" property</source> - <translation>Elemento de lista: non pode empregar a propriedade «id» porque está reservada</translation> + <translation>Elemento de lista: non pode empregar a propiedade «id» porque está reservada</translation> </message> <message> <source>ListElement: cannot use script for property value</source> - <translation>Elemento de lista: non pode empregar script como valor de propriedade</translation> + <translation>Elemento de lista: non pode empregar script como valor de propiedade</translation> </message> <message> <source>ListModel: undefined property '%1'</source> - <translation>Modelo de lista: a propriedade «%1» non está definida</translation> + <translation>Modelo de lista: a propiedade «%1» non está definida</translation> </message> </context> <context> @@ -2209,6 +1937,21 @@ superior, inferior nin vcenter.</translation> </message> </context> <context> + <name>QDeclarativeParentAnimation</name> + <message> + <source>Unable to preserve appearance under complex transform</source> + <translation>Non é posíbel conservar a aparencia con transformación complexa</translation> + </message> + <message> + <source>Unable to preserve appearance under non-uniform scale</source> + <translation>Non é posíbel conservar a aparencia con escalado non uniforme</translation> + </message> + <message> + <source>Unable to preserve appearance under scale of 0</source> + <translation>Non é posíbel conservar a aparencia con escala de 0</translation> + </message> +</context> +<context> <name>QDeclarativeParentChange</name> <message> <source>Unable to preserve appearance under complex transform</source> @@ -2231,13 +1974,17 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Illegal character</source> - <translation>Caracter ilegal</translation> + <translation>Carácter ilegal</translation> </message> <message> <source>Unclosed string at end of line</source> <translation>Cadea non pechada no fin dunha liña</translation> </message> <message> + <source>Illegal escape squence</source> + <translation type="obsolete">Secuencia de escape ilegal</translation> + </message> + <message> <source>Illegal escape sequence</source> <translation>Secuencia de escape ilegal</translation> </message> @@ -2263,7 +2010,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Unterminated regular expression backslash sequence</source> - <translation>Secuencia de expresión regular non terminda con contrabarra</translation> + <translation>Secuencia de expresión regular non terminada con contrabarra</translation> </message> <message> <source>Unterminated regular expression class</source> @@ -2283,7 +2030,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Property value set multiple times</source> - <translation>O valor da propriedade estabeleceuse varias veces</translation> + <translation>O valor da propiedade estabeleceuse varias veces</translation> </message> <message> <source>Expected type name</source> @@ -2291,19 +2038,19 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Invalid import qualifier ID</source> - <translation>ID do calificador de importación non válido</translation> + <translation>ID do cualificador de importación non válido</translation> </message> <message> <source>Reserved name "Qt" cannot be used as an qualifier</source> - <translation>O nome reservado «Qt» non se pode empregar como calificador</translation> + <translation>O nome reservado «Qt» non se pode empregar como cualificador</translation> </message> <message> <source>Script import qualifiers must be unique.</source> - <translation>Os calificadores de importación de script deben ser únicos.</translation> + <translation>Os cualificadores de importación de script deben ser únicos.</translation> </message> <message> <source>Script import requires a qualifier</source> - <translation>A importación de script require dun calificador</translation> + <translation>A importación de script require dun cualificador</translation> </message> <message> <source>Library import requires a version</source> @@ -2315,19 +2062,19 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Invalid property type modifier</source> - <translation>Modificador de tipo da propriedade non válido</translation> + <translation>Modificador de tipo da propiedade non válido</translation> </message> <message> <source>Unexpected property type modifier</source> - <translation>Modificador do tipo da propriedade non agardado</translation> + <translation>Modificador do tipo da propiedade non agardado</translation> </message> <message> <source>Expected property type</source> - <translation>Agardábase o tipo dunha propriedade</translation> + <translation>Agardábase o tipo dunha propiedade</translation> </message> <message> <source>Readonly not yet supported</source> - <translation>Aínda non se soporta o só para leitura</translation> + <translation>Aínda non se soporta o só para lectura</translation> </message> <message> <source>JavaScript declaration outside Script element</source> @@ -2335,6 +2082,13 @@ superior, inferior nin vcenter.</translation> </message> </context> <context> + <name>QDeclarativePauseAnimation</name> + <message> + <source>Cannot set a duration of < 0</source> + <translation>Non se pode indicar unha duración < 0</translation> + </message> +</context> +<context> <name>QDeclarativePixmap</name> <message> <source>Error decoding: %1: %2</source> @@ -2350,6 +2104,13 @@ superior, inferior nin vcenter.</translation> </message> </context> <context> + <name>QDeclarativePropertyAnimation</name> + <message> + <source>Cannot set a duration of < 0</source> + <translation>Non se pode indicar unha duración < 0</translation> + </message> +</context> +<context> <name>QDeclarativePropertyChanges</name> <message> <source>PropertyChanges does not support creating state-specific objects.</source> @@ -2357,11 +2118,11 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Cannot assign to non-existent property "%1"</source> - <translation>Non é posíbel asignar á propriedade inexistente «%1»</translation> + <translation>Non é posíbel asignar á propiedade inexistente «%1»</translation> </message> <message> <source>Cannot assign to read-only property "%1"</source> - <translation>Non é posíbel asignar a unha propriedade só para lectura «%1»</translation> + <translation>Non é posíbel asignar a unha propiedade só para lectura «%1»</translation> </message> </context> <context> @@ -2376,6 +2137,25 @@ superior, inferior nin vcenter.</translation> </message> </context> <context> + <name>QDeclarativeTypeLoader</name> + <message> + <source>Script %1 unavailable</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Type %1 unavailable</source> + <translation type="unfinished">O tipo %1 non está dispoñíbel</translation> + </message> + <message> + <source>Namespace %1 cannot be used as a type</source> + <translation type="unfinished">O espazo de nomes %1 non se pode empregar como un tipo</translation> + </message> + <message> + <source>%1 %2</source> + <translation type="unfinished">%1 %2</translation> + </message> +</context> +<context> <name>QDeclarativeVME</name> <message> <source>Unable to create object of type %1</source> @@ -2383,7 +2163,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Cannot assign value %1 to property %2</source> - <translation>Non é posíbel asignar o valor %1 á propriedade %2</translation> + <translation>Non é posíbel asignar o valor %1 á propiedade %2</translation> </message> <message> <source>Cannot assign object type %1 with no default method</source> @@ -2395,7 +2175,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Cannot assign an object to signal property %1</source> - <translation>Non é posíbel asignar un obxecto á propriedade de sinal %1</translation> + <translation>Non é posíbel asignar un obxecto á propiedade de sinal %1</translation> </message> <message> <source>Cannot assign object to list</source> @@ -2403,7 +2183,7 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Cannot assign object to interface property</source> - <translation>Non é posíbel asignar un obxecto a unha propriedade dunha interface</translation> + <translation>Non é posíbel asignar un obxecto a unha propiedade dunha interface</translation> </message> <message> <source>Unable to create attached object</source> @@ -2411,14 +2191,21 @@ superior, inferior nin vcenter.</translation> </message> <message> <source>Cannot set properties on %1 as it is null</source> - <translation>Non se poden definir propriedades de %1 porque é nulo</translation> + <translation>Non se poden definir propiedades de %1 porque é nulo</translation> </message> </context> <context> <name>QDeclarativeVisualDataModel</name> <message> <source>Delegate component must be Item type.</source> - <translation>O componente delegado debe ser do tipo Item.</translation> + <translation>O compoñente delegado debe ser do tipo Item.</translation> + </message> +</context> +<context> + <name>QDeclarativeXmlListModel</name> + <message> + <source>Qt was built without support for xmlpatterns</source> + <translation>Qt construíuse sen soporte para xmlpatterns</translation> </message> </context> <context> @@ -2436,21 +2223,6 @@ superior, inferior nin vcenter.</translation> </message> </context> <context> - <name>QObject</name> - <message> - <source>"%1" duplicates a previous role name and will be disabled.</source> - <translation>«%1» duplica un nome de rol anterior e desactivarase.</translation> - </message> - <message> - <source>invalid query: "%1"</source> - <translation>pescuda non válida: «%1»</translation> - </message> - <message> - <source>PulseAudio Sound Server</source> - <translation>Servidor de son PulseAudio</translation> - </message> -</context> -<context> <name>QDial</name> <message> <source>QDial</source> @@ -2466,149 +2238,37 @@ superior, inferior nin vcenter.</translation> </message> </context> <context> - <name>QDoubleSpinBox</name> + <name>QDialog</name> <message> - <source>More</source> - <translation>Máis</translation> + <source>Done</source> + <translation>Feito</translation> </message> <message> - <source>Less</source> - <translation>Menos</translation> + <source>What's This?</source> + <translation>Que é isto?</translation> </message> </context> <context> - <name>QScrollBar</name> + <name>QDialogButtonBox</name> <message> - <source>Line up</source> - <translation>Aliñar en riba</translation> + <source>OK</source> + <translation>Aceptar</translation> </message> <message> - <source>Position</source> - <translation>Posición</translation> + <source>&OK</source> + <translation>&Aceptar</translation> </message> <message> - <source>Line down</source> - <translation>Aliñar en baixo</translation> + <source>&Save</source> + <translation>&Gardar</translation> </message> <message> - <source>Scroll here</source> - <translation>Desprazar cara aquí</translation> + <source>Save</source> + <translation>Gardar</translation> </message> <message> - <source>Left edge</source> - <translation>Borde esquerdo</translation> - </message> - <message> - <source>Top</source> - <translation>Cume</translation> - </message> - <message> - <source>Right edge</source> - <translation>Borde dereito</translation> - </message> - <message> - <source>Bottom</source> - <translation>Fondo</translation> - </message> - <message> - <source>Page left</source> - <translation>Páxina á esquerda</translation> - </message> - <message> - <source>Page up</source> - <translation>Páxina en riba</translation> - </message> - <message> - <source>Page right</source> - <translation>Páxina á dereita</translation> - </message> - <message> - <source>Page down</source> - <translation>Páxina en baixo</translation> - </message> - <message> - <source>Scroll left</source> - <translation>Desprazar cara á esquerda</translation> - </message> - <message> - <source>Scroll up</source> - <translation>Desprazar cara arriba</translation> - </message> - <message> - <source>Scroll right</source> - <translation>Desprazar cara á dereita</translation> - </message> - <message> - <source>Scroll down</source> - <translation>Desprazar cara abaixo</translation> - </message> -</context> -<context> - <name>QSlider</name> - <message> - <source>Page left</source> - <translation>Páxina á esquerda</translation> - </message> - <message> - <source>Page up</source> - <translation>Páxina en riba</translation> - </message> - <message> - <source>Position</source> - <translation>Posición</translation> - </message> - <message> - <source>Page right</source> - <translation>Páxina á dereita</translation> - </message> - <message> - <source>Page down</source> - <translation>Páxina en baixo</translation> - </message> -</context> -<context> - <name>QSpinBox</name> - <message> - <source>More</source> - <translation>Máis</translation> - </message> - <message> - <source>Less</source> - <translation>Menos</translation> - </message> -</context> -<context> - <name>QDialog</name> - <message> - <source>Done</source> - <translation>Feito</translation> - </message> - <message> - <source>What's This?</source> - <translation>Que é isto?</translation> - </message> -</context> -<context> - <name>QDialogButtonBox</name> - <message> - <source>OK</source> - <translation>Aceptar</translation> - </message> - <message> - <source>&OK</source> - <translation>&Aceptar</translation> - </message> - <message> - <source>&Save</source> - <translation>&Gardar</translation> - </message> - <message> - <source>Save</source> - <translation>Gardar</translation> - </message> - <message> - <source>Open</source> - <translation>Abrir</translation> + <source>Open</source> + <translation>Abrir</translation> </message> <message> <source>&Cancel</source> @@ -2688,67 +2348,108 @@ superior, inferior nin vcenter.</translation> </message> </context> <context> - <name>QMessageBox</name> + <name>QDirModel</name> <message> - <source>Show Details...</source> - <translation>Mostrar os detalles...</translation> + <source>Name</source> + <translation>Nome</translation> </message> <message> - <source>Hide Details...</source> - <translation>Agochar os detalles...</translation> + <source>Size</source> + <translation>Tamaño</translation> </message> <message> - <source>OK</source> - <translation>Aceptar</translation> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>Tipo</translation> </message> <message> - <source>Help</source> - <translation>Axuda</translation> + <source>Type</source> + <comment>All other platforms</comment> + <translation>Tipo</translation> </message> <message> - <source><h3>About Qt</h3><p>This program uses Qt version %1.</p></source> - <translation><h3>Acerca de Qt</h3><p>Este programa emprega a versión %1 de Qt.</p></translation> + <source>Date Modified</source> + <translation>Data de modificación</translation> </message> +</context> +<context> + <name>QDockWidget</name> <message> - <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation><p>Qt é un toolkit de C++ para o desenvolvemento de programas multiplataforma.</p> <p>Qt fornece portabilidade entre MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux e as principais variantes comerciais de Unix cun único código fonte. Qt tamén está dispoñíbel para dispositivos incrustados como Qt para Embedded Linux e Qt para Windows CE.</p> -<p>Qt está dispoñíbel en tres opcións de licenzas diferentes deseñadas para adaptarse ás necesidades dos diferentes usuarios.</p> -</p>Qt distribuída sob o acordo de licenza comercial é adecuado para o desenvolvemento de software proprietario -ou comercial onde non é preciso compartir ningún código fonte con terceiras partes ou que non poden cumprir os termos das licenzas GNU LGPL versión 2.1 nin da versión 3.0.</p> -<p>Qt sob a licenza GNU General Public License versión 2.1 é apropriada para o desenvolvemento de programas Qt (proprietario ou de fontes abertas) supoñendo que poda cumprir cos termos e condicións da licenza GNU GPL versión 2.1.</p> -<p>Qt sob a licenza GNU General Public License versión 3.0 é apropriada para o desenvolvemento de programas Qt onde desexe empregar tales programas en combinación con software suxeito aos termos da GNU GPL versión 3.0 ou onde desexe cumprir cos termos da GNU GPL versión 3.0.</p> -<p>Consulte <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> para ler un resumo das licenzas de Qt.</p> -<p>Copyright (C) 2011 Nokia Corporation ou as súas subsidiarias.</p> -<p>Qt é un produto de Nokia. Consulte <a href="http://qt.nokia.com/">qt.nokia.com</a> para máis información.</p></translation> + <source>Close</source> + <translation>Pechar</translation> </message> <message> - <source>About Qt</source> - <translation>Acerca de Qt</translation> + <source>Dock</source> + <translation>Acoplar</translation> + </message> + <message> + <source>Float</source> + <translation>Flutuante</translation> </message> </context> <context> - <name>QDirModel</name> + <name>QDoubleSpinBox</name> <message> - <source>Name</source> - <translation>Nome</translation> + <source>More</source> + <translation>Máis</translation> </message> <message> - <source>Size</source> - <translation>Tamaño</translation> + <source>Less</source> + <translation>Menos</translation> </message> +</context> +<context> + <name>QErrorMessage</name> <message> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation>Tipo</translation> + <source>Debug Message:</source> + <translation>Mensaxe de depuración:</translation> </message> <message> - <source>Type</source> - <comment>All other platforms</comment> - <translation>Tipo</translation> + <source>Warning:</source> + <translation>Aviso:</translation> </message> <message> - <source>Date Modified</source> - <translation>Data de modificación</translation> + <source>Fatal Error:</source> + <translation>Erro fatal:</translation> + </message> + <message> + <source>&Show this message again</source> + <translation>&Mostrar esta mensaxe de novo</translation> + </message> + <message> + <source>&OK</source> + <translation>&Aceptar</translation> + </message> +</context> +<context> + <name>QFile</name> + <message> + <source>Destination file exists</source> + <translation>O ficheiro de destino xa existe</translation> + </message> + <message> + <source>Will not rename sequential file using block copy</source> + <translation>Non se mudará o nome do ficheiro secuencial empregando a copia de bloques</translation> + </message> + <message> + <source>Cannot remove source file</source> + <translation>Non é posíbel eliminar o ficheiro de orixe</translation> + </message> + <message> + <source>Cannot open %1 for input</source> + <translation>Non é posíbel abrir %1 como entrada</translation> + </message> + <message> + <source>Cannot open for output</source> + <translation>Non foi posíbel abrir o ficheiro de saída</translation> + </message> + <message> + <source>Failure to write block</source> + <translation>Non foi posíbel escribir o bloque</translation> + </message> + <message> + <source>Cannot create %1 for output</source> + <translation>Non foi posíbel crear %1 para a saída</translation> </message> </context> <context> @@ -2815,7 +2516,7 @@ ou comercial onde non é preciso compartir ningún código fonte con terceiras p </message> <message> <source>Find Directory</source> - <translation>Procurar un cartafol</translation> + <translation>Buscar un cartafol</translation> </message> <message> <source>Open</source> @@ -2878,7 +2579,7 @@ ou comercial onde non é preciso compartir ningún código fonte con terceiras p Directory not found. Please verify the correct directory name was given.</source> <translation>%1 -Non se achou o cartafol. +Non se atopou o cartafol. Verifique que se indicase o nome correcto.</translation> </message> <message> @@ -3024,103 +2725,34 @@ Desexa aínda así borralo?</translation> </message> </context> <context> - <name>QDockWidget</name> + <name>QFontDatabase</name> <message> - <source>Close</source> - <translation>Pechar</translation> + <source>Normal</source> + <translation>Normal</translation> </message> <message> - <source>Dock</source> - <translation>Acoplar</translation> + <source>Bold</source> + <translation>Negriña</translation> </message> <message> - <source>Float</source> - <translation>Flutuante</translation> + <source>Demi Bold</source> + <translation>Demi negriña</translation> </message> -</context> -<context> - <name>QErrorMessage</name> <message> - <source>Debug Message:</source> - <translation>Mensaxe de depuración:</translation> + <source>Black</source> + <translation>Escura</translation> </message> <message> - <source>Warning:</source> - <translation>Aviso:</translation> + <source>Demi</source> + <translation>Demi</translation> </message> <message> - <source>Fatal Error:</source> - <translation>Erro fatal:</translation> + <source>Light</source> + <translation>Clara</translation> </message> <message> - <source>&Show this message again</source> - <translation>&Mostrar esta mensaxe de novo</translation> - </message> - <message> - <source>&OK</source> - <translation>&Aceptar</translation> - </message> -</context> -<context> - <name>QFile</name> - <message> - <source>Destination file exists</source> - <translation>O ficheiro de destino xa existe</translation> - </message> - <message> - <source>Will not rename sequential file using block copy</source> - <translation>Non se mudará o nome do ficheiro secuencial empregando a copia de bloques</translation> - </message> - <message> - <source>Cannot remove source file</source> - <translation>Non é posíbel eliminar o ficheiro de orixe</translation> - </message> - <message> - <source>Cannot open %1 for input</source> - <translation>Non é posíbel abrir %1 como entrada</translation> - </message> - <message> - <source>Cannot open for output</source> - <translation>Non foi posíbel abrir o ficheiro de saída</translation> - </message> - <message> - <source>Failure to write block</source> - <translation>Non foi posíbel escribir o bloque</translation> - </message> - <message> - <source>Cannot create %1 for output</source> - <translation>Non foi posíbel crear %1 para a saída</translation> - </message> -</context> -<context> - <name>QFontDatabase</name> - <message> - <source>Normal</source> - <translation>Normal</translation> - </message> - <message> - <source>Bold</source> - <translation>Negriña</translation> - </message> - <message> - <source>Demi Bold</source> - <translation>Demi negriña</translation> - </message> - <message> - <source>Black</source> - <translation>Escura</translation> - </message> - <message> - <source>Demi</source> - <translation>Demi</translation> - </message> - <message> - <source>Light</source> - <translation>Clara</translation> - </message> - <message> - <source>Italic</source> - <translation>Cursiva</translation> + <source>Italic</source> + <translation>Cursiva</translation> </message> <message> <source>Oblique</source> @@ -3442,6 +3074,117 @@ Desexa aínda así borralo?</translation> </message> </context> <context> + <name>QHttp</name> + <message> + <source>Connection refused</source> + <translation>Rexeitouse a conexión</translation> + </message> + <message> + <source>Connection closed</source> + <translation>Pechouse a conexión</translation> + </message> + <message> + <source>Proxy requires authentication</source> + <translation>O proxy require autenticación</translation> + </message> + <message> + <source>Host requires authentication</source> + <translation>O servidor require autenticación</translation> + </message> + <message> + <source>Data corrupted</source> + <translation>Datos corrompidos</translation> + </message> + <message> + <source>Unknown protocol specified</source> + <translation>Especificouse un protocolo descoñecido</translation> + </message> + <message> + <source>SSL handshake failed</source> + <translation>Fallou a negociación de SSL</translation> + </message> + <message> + <source>HTTPS connection requested but SSL support not compiled in</source> + <translation>Pediuse unha conexión HTTPS pero non se compilou con soporte de SSL</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Erro descoñecido</translation> + </message> + <message> + <source>Request aborted</source> + <translation>Pedido abortado</translation> + </message> + <message> + <source>No server set to connect to</source> + <translation>Non se indicou ningún servidor co que conectar</translation> + </message> + <message> + <source>Wrong content length</source> + <translation>Lonxitude do contido incorrecta</translation> + </message> + <message> + <source>Server closed connection unexpectedly</source> + <translation>O servidor pechou a conexión inesperadamente</translation> + </message> + <message> + <source>Connection refused (or timed out)</source> + <translation>Rexeitouse a conexión (ou esgotou o tempo-límite)</translation> + </message> + <message> + <source>Host %1 not found</source> + <translation>Non se atopou o servidor %1</translation> + </message> + <message> + <source>HTTP request failed</source> + <translation>O pedido HTTP fallou</translation> + </message> + <message> + <source>Invalid HTTP response header</source> + <translation>A cabeceira da resposta HTTP non é válida</translation> + </message> + <message> + <source>Unknown authentication method</source> + <translation>Método descoñecido de autenticación</translation> + </message> + <message> + <source>Proxy authentication required</source> + <translation>Requírese de autenticación no proxy</translation> + </message> + <message> + <source>Authentication required</source> + <translation>Requírese de autenticación</translation> + </message> + <message> + <source>Invalid HTTP chunked body</source> + <translation>Corpo HTTP en pedazos non válido</translation> + </message> + <message> + <source>Error writing response to device</source> + <translation>Erro ao escribir a resposta no dispositivo</translation> + </message> + <message> + <source>Host %1 found</source> + <translation>Atopouse o servidor %1</translation> + </message> + <message> + <source>Connected to host %1</source> + <translation>Conectado co servidor %1</translation> + </message> + <message> + <source>Connection to %1 closed</source> + <translation>Pechouse a conexión con %1</translation> + </message> + <message> + <source>Host found</source> + <translation>Atopouse un servidor</translation> + </message> + <message> + <source>Connected to host</source> + <translation>Conectado co servidor</translation> + </message> +</context> +<context> <name>QHttpSocketEngine</name> <message> <source>Did not receive HTTP response from proxy</source> @@ -3631,15 +3374,15 @@ Desexa aínda así borralo?</translation> <name>QLibrary</name> <message> <source>Could not mmap '%1': %2</source> - <translation>Non foi posíbel mmap «%1»: %2</translation> + <translation type="obsolete">Non foi posíbel mmap «%1»: %2</translation> </message> <message> <source>Plugin verification data mismatch in '%1'</source> - <translation>Erro de concordancia na verificación dos datos da extensión en «%1»</translation> + <translation>Erro de concordancia na verificación dos datos do complemento en «%1»</translation> </message> <message> <source>Could not unmap '%1': %2</source> - <translation>Non foi posíbel unmap «%1»: %2</translation> + <translation type="obsolete">Non foi posíbel unmap «%1»: %2</translation> </message> <message> <source>The shared library was not found.</source> @@ -3647,21 +3390,20 @@ Desexa aínda así borralo?</translation> </message> <message> <source>The file '%1' is not a valid Qt plugin.</source> - <translation>O ficheiro «%1» non é unha extensión válida de Qt.</translation> + <translation>O ficheiro «%1» non é un complemento válido de Qt.</translation> </message> <message> <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> - <translation>A extensión «%1» utiliza unha biblioteca Qt non compatíbel. (%2.%3.%4) [%5]</translation> + <translation>O complemento «%1» utiliza unha biblioteca Qt non compatíbel. (%2.%3.%4) [%5]</translation> </message> <message> <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> - <translation>A extensión «%1» utiliza unha biblioteca Qt non compatíbel. Agardábase a + <translation>O complemento «%1» utiliza unha biblioteca Qt non compatíbel. Agardábase a chave de compilación «%2», obtívose a «%3»</translation> </message> <message> <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> - <translation>A extensión «%1» utiliza unha biblioteca Qt non compatíbel (Non é posíbel -misturar as bibliotecas de depuración coas publicadas).</translation> + <translation>O complemento «%1» utiliza unha biblioteca Qt non compatíbel (Non é posíbel mesturar as bibliotecas de depuración coas publicadas).</translation> </message> <message> <source>Unknown error</source> @@ -3952,6 +3694,57 @@ misturar as bibliotecas de depuración coas publicadas).</translation> </message> </context> <context> + <name>QMessageBox</name> + <message> + <source>Show Details...</source> + <translation>Mostrar os detalles...</translation> + </message> + <message> + <source>Hide Details...</source> + <translation>Acochar os detalles...</translation> + </message> + <message> + <source>OK</source> + <translation>Aceptar</translation> + </message> + <message> + <source>Help</source> + <translation>Axuda</translation> + </message> + <message> + <source><h3>About Qt</h3><p>This program uses Qt version %1.</p></source> + <translation><h3>Acerca de Qt</h3><p>Este programa emprega a versión %1 de Qt.</p></translation> + </message> + <message> + <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation><p>Qt é un toolkit de C++ para o desenvolvemento de programas multiplataforma.</p> <p>Qt fornece portabilidade entre MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux e as principais variantes comerciais de Unix cun único código fonte. Qt tamén está dispoñíbel para dispositivos incrustados como Qt para Embedded Linux e Qt para Windows CE.</p> +<p>Qt está dispoñíbel en tres opcións de licenzas diferentes deseñadas para adaptarse ás necesidades dos diferentes usuarios.</p> +</p>Qt distribuída sob o acordo de licenza comercial é adecuado para o desenvolvemento de software proprietario +ou comercial onde non é preciso compartir ningún código fonte con terceiras partes ou que non poden cumprir os termos das licenzas GNU LGPL versión 2.1 nin da versión 3.0.</p> +<p>Qt sob a licenza GNU General Public License versión 2.1 é apropriada para o desenvolvemento de programas Qt (proprietario ou de fontes abertas) supoñendo que poda cumprir cos termos e condicións da licenza GNU GPL versión 2.1.</p> +<p>Qt sob a licenza GNU General Public License versión 3.0 é apropriada para o desenvolvemento de programas Qt onde desexe empregar tales programas en combinación con software suxeito aos termos da GNU GPL versión 3.0 ou onde desexe cumprir cos termos da GNU GPL versión 3.0.</p> +<p>Consulte <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> para ler un resumo das licenzas de Qt.</p> +<p>Copyright (C) 2011 Nokia Corporation ou as súas subsidiarias.</p> +<p>Qt é un produto de Nokia. Consulte <a href="http://qt.nokia.com/">qt.nokia.com</a> para máis información.</p></translation> + </message> + <message> + <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><p>Qt é un toolkit de C++ para o desenvolvemento de programas multiplataforma.</p> <p>Qt fornece portabilidade entre MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux e as principais variantes comerciais de Unix cun único código fonte. Qt tamén está dispoñíbel para dispositivos incrustados como Qt para Embedded Linux e Qt para Windows CE.</p> +<p>Qt está dispoñíbel en tres opcións de licenzas diferentes deseñadas para adaptarse ás necesidades dos diferentes usuarios.</p> +</p>Qt distribuída sob o acordo de licenza comercial é adecuado para o desenvolvemento de software propietario +ou comercial onde non é preciso compartir ningún código fonte con terceiras partes ou que non poden cumprir os termos das licenzas GNU LGPL versión 2.1 nin da versión 3.0.</p> +<p>Qt sob a licenza GNU General Public License versión 2.1 é apropiada para o desenvolvemento de programas Qt (propietario ou de fontes abertas) supoñendo que poda cumprir cos termos e condicións da licenza GNU GPL versión 2.1.</p> +<p>Qt sob a licenza GNU General Public License versión 3.0 é apropiada para o desenvolvemento de programas Qt onde desexe empregar tales programas en combinación con software suxeito aos termos da GNU GPL versión 3.0 ou onde desexe cumprir cos termos da GNU GPL versión 3.0.</p> +<p>Consulte <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> para ler un resumo das licenzas de Qt.</p> +<p>Copyright (C) 2010 Nokia Corporation ou as súas subsidiarias.</p> +<p>Qt é un produto de Nokia. Consulte <a href="http://qt.nokia.com/">qt.nokia.com</a> para máis información.</p></translation> + </message> + <message> + <source>About Qt</source> + <translation>Acerca de Qt</translation> + </message> +</context> +<context> <name>QMultiInputContext</name> <message> <source>Select IM</source> @@ -4118,7 +3911,7 @@ texto</translation> </message> <message> <source>Cannot open %1: Path is a directory</source> - <translation>Non é posíbel abrir %1: A rota é un directorio</translation> + <translation>Non é posíbel abrir %1: A ruta é un directorio</translation> </message> <message> <source>Error opening %1: %2</source> @@ -4164,6 +3957,13 @@ texto</translation> </message> </context> <context> + <name>QNetworkAccessManager</name> + <message> + <source>Network access is disabled.</source> + <translation>O acceso á rede está desactivado.</translation> + </message> +</context> +<context> <name>QNetworkReply</name> <message> <source>Error downloading %1 - server replied: %2</source> @@ -4183,13 +3983,6 @@ texto</translation> </message> </context> <context> - <name>QNetworkAccessManager</name> - <message> - <source>Network access is disabled.</source> - <translation>O acceso á rede está desactivado.</translation> - </message> -</context> -<context> <name>QNetworkReplyImpl</name> <message> <source>Operation canceled</source> @@ -4325,30 +4118,217 @@ texto</translation> </message> </context> <context> - <name>QPPDOptionsModel</name> + <name>QODBCResult</name> <message> - <source>Name</source> - <translation>Nome</translation> + <source>Unable to fetch last</source> + <translation>Non foi posíbel acadar o último</translation> </message> <message> - <source>Value</source> - <translation>Valor</translation> + <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> + <translation>QODBCResult::reset: Non foi posíbel estabelecer «SQL_CURSOR_STATIC» como +atributo da sentenza. Verifique a configuración do controlador ODBC</translation> </message> -</context> -<context> - <name>QPrintDialog</name> <message> - <source>&Options >></source> - <translation>&Opcións >></translation> + <source>Unable to execute statement</source> + <translation>Non foi posíbel executar a sentenza</translation> </message> <message> - <source>&Print</source> - <translation>&Imprimir</translation> + <source>Unable to fetch</source> + <translation>Non foi posíbel acadar</translation> </message> <message> - <source>&Options <<</source> - <translation>&Opcións <<</translation> - </message> + <source>Unable to fetch next</source> + <translation>Non foi posíbel acadar o seguinte</translation> + </message> + <message> + <source>Unable to fetch first</source> + <translation>Non foi posíbel acadar o primeiro</translation> + </message> + <message> + <source>Unable to fetch previous</source> + <translation>Non foi posíbel acadar o anterior</translation> + </message> + <message> + <source>Unable to prepare statement</source> + <translation>Non foi posíbel preparar a sentenza</translation> + </message> + <message> + <source>Unable to bind variable</source> + <translation>Non foi posíbel asociar a variábel</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>"%1" duplicates a previous role name and will be disabled.</source> + <translation>«%1» duplica un nome de rol anterior e desactivarase.</translation> + </message> + <message> + <source>invalid query: "%1"</source> + <translation>pescuda non válida: «%1»</translation> + </message> + <message> + <source>PulseAudio Sound Server</source> + <translation>Servidor de son PulseAudio</translation> + </message> +</context> +<context> + <name>QPPDOptionsModel</name> + <message> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <source>Value</source> + <translation>Valor</translation> + </message> +</context> +<context> + <name>QPSQLDriver</name> + <message> + <source>Unable to connect</source> + <translation>Non foi posíbel conectar</translation> + </message> + <message> + <source>Could not begin transaction</source> + <translation>Non foi posíbel comezar a transacción</translation> + </message> + <message> + <source>Could not commit transaction</source> + <translation>Non foi posíbel entregar a transacción</translation> + </message> + <message> + <source>Could not rollback transaction</source> + <translation>Non foi posíbel anular a transacción</translation> + </message> + <message> + <source>Unable to subscribe</source> + <translation>Non foi posíbel subscribirse</translation> + </message> + <message> + <source>Unable to unsubscribe</source> + <translation>Non foi posíbel anular a subscrición</translation> + </message> +</context> +<context> + <name>QPSQLResult</name> + <message> + <source>Unable to create query</source> + <translation>Non foi posíbel crear a consulta</translation> + </message> + <message> + <source>Unable to prepare statement</source> + <translation>Non foi posíbel preparar a sentenza</translation> + </message> +</context> +<context> + <name>QPageSetupWidget</name> + <message> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <source>Paper</source> + <translation>Papel</translation> + </message> + <message> + <source>Page size:</source> + <translation>Tamaño da páxina:</translation> + </message> + <message> + <source>Width:</source> + <translation>Largura:</translation> + </message> + <message> + <source>Height:</source> + <translation>Altura:</translation> + </message> + <message> + <source>Paper source:</source> + <translation>Fonte do papel:</translation> + </message> + <message> + <source>Orientation</source> + <translation>Orientación</translation> + </message> + <message> + <source>Portrait</source> + <translation>Retrato</translation> + </message> + <message> + <source>Landscape</source> + <translation>Apaisado</translation> + </message> + <message> + <source>Reverse landscape</source> + <translation>Apaisado invertido</translation> + </message> + <message> + <source>Reverse portrait</source> + <translation>Retrato invertido</translation> + </message> + <message> + <source>Margins</source> + <translation>Marxes</translation> + </message> + <message> + <source>top margin</source> + <translation>marxe superior</translation> + </message> + <message> + <source>left margin</source> + <translation>marxe esquerda</translation> + </message> + <message> + <source>right margin</source> + <translation>marxe dereita</translation> + </message> + <message> + <source>bottom margin</source> + <translation>marxe inferior</translation> + </message> + <message> + <source>Centimeters (cm)</source> + <translation>Centímetros (cm)</translation> + </message> + <message> + <source>Millimeters (mm)</source> + <translation>Milímetros (mm)</translation> + </message> + <message> + <source>Inches (in)</source> + <translation>Polgadas (pol)</translation> + </message> + <message> + <source>Points (pt)</source> + <translation>Puntos (pt)</translation> + </message> +</context> +<context> + <name>QPluginLoader</name> + <message> + <source>The plugin was not loaded.</source> + <translation>O complemento non se cargou.</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Erro descoñecido</translation> + </message> +</context> +<context> + <name>QPrintDialog</name> + <message> + <source>&Options >></source> + <translation>&Opcións >></translation> + </message> + <message> + <source>&Print</source> + <translation>&Imprimir</translation> + </message> + <message> + <source>&Options <<</source> + <translation>&Opcións <<</translation> + </message> <message> <source>Print to File (PDF)</source> <translation>Imprimir nun ficheiro (PDF)</translation> @@ -4643,173 +4623,41 @@ Desexa sobrescribilo?</translation> <source>US Common #10 Envelope (105 x 241 mm)</source> <translation>Sobre US Common #10 (105 x 241 mm)</translation> </message> - <message> - <source>Print all</source> - <translation>Imprimir todas</translation> - </message> - <message> - <source>Print selection</source> - <translation>Imprimir a selección</translation> - </message> - <message> - <source>Print range</source> - <translation>Intervalo de impresión</translation> - </message> - <message> - <source>Print current page</source> - <translation>Imprimir a páxina actual</translation> - </message> - <message> - <source>The 'From' value cannot be greater than the 'To' value.</source> - <translation>O valor «de» non pode ser maior do que o valor «até».</translation> - </message> - <message> - <source>OK</source> - <translation>Aceptar</translation> - </message> - <message> - <source>locally connected</source> - <translation>conectado localmente</translation> - </message> - <message> - <source>Aliases: %1</source> - <translation>Alcumes: %1</translation> - </message> - <message> - <source>unknown</source> - <translation>descoñecido</translation> - </message> -</context> -<context> - <name>QPSQLDriver</name> - <message> - <source>Unable to connect</source> - <translation>Non foi posíbel conectar</translation> - </message> - <message> - <source>Could not begin transaction</source> - <translation>Non foi posíbel comezar a transacción</translation> - </message> - <message> - <source>Could not commit transaction</source> - <translation>Non foi posíbel entregar a transacción</translation> - </message> - <message> - <source>Could not rollback transaction</source> - <translation>Non foi posíbel anular a transacción</translation> - </message> - <message> - <source>Unable to subscribe</source> - <translation>Non foi posíbel subscribirse</translation> - </message> - <message> - <source>Unable to unsubscribe</source> - <translation>Non foi posíbel anular a subscrición</translation> - </message> -</context> -<context> - <name>QPSQLResult</name> - <message> - <source>Unable to create query</source> - <translation>Non foi posíbel crear a consulta</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Non foi posíbel preparar a sentenza</translation> - </message> -</context> -<context> - <name>QPageSetupWidget</name> - <message> - <source>Form</source> - <translation>Formulario</translation> - </message> - <message> - <source>Paper</source> - <translation>Papel</translation> - </message> - <message> - <source>Page size:</source> - <translation>Tamaño da páxina:</translation> - </message> - <message> - <source>Width:</source> - <translation>Largura:</translation> - </message> - <message> - <source>Height:</source> - <translation>Altura:</translation> - </message> - <message> - <source>Paper source:</source> - <translation>Fonte do papel:</translation> - </message> - <message> - <source>Orientation</source> - <translation>Orientación</translation> - </message> - <message> - <source>Portrait</source> - <translation>Retrato</translation> - </message> - <message> - <source>Landscape</source> - <translation>Apaisado</translation> - </message> - <message> - <source>Reverse landscape</source> - <translation>Apaisado invertido</translation> - </message> - <message> - <source>Reverse portrait</source> - <translation>Retrato invertido</translation> - </message> - <message> - <source>Margins</source> - <translation>Marxes</translation> - </message> - <message> - <source>top margin</source> - <translation>marxe superior</translation> - </message> - <message> - <source>left margin</source> - <translation>marxe esquerda</translation> + <message> + <source>Print all</source> + <translation>Imprimir todas</translation> </message> <message> - <source>right margin</source> - <translation>marxe dereita</translation> + <source>Print selection</source> + <translation>Imprimir a selección</translation> </message> <message> - <source>bottom margin</source> - <translation>marxe inferior</translation> + <source>Print range</source> + <translation>Intervalo de impresión</translation> </message> <message> - <source>Centimeters (cm)</source> - <translation>Centímetros (cm)</translation> + <source>Print current page</source> + <translation>Imprimir a páxina actual</translation> </message> <message> - <source>Millimeters (mm)</source> - <translation>Milímetros (mm)</translation> + <source>The 'From' value cannot be greater than the 'To' value.</source> + <translation>O valor «de» non pode ser maior do que o valor «até».</translation> </message> <message> - <source>Inches (in)</source> - <translation>Polgadas (pol)</translation> + <source>OK</source> + <translation>Aceptar</translation> </message> <message> - <source>Points (pt)</source> - <translation>Puntos (pt)</translation> + <source>locally connected</source> + <translation>conectado localmente</translation> </message> -</context> -<context> - <name>QPluginLoader</name> <message> - <source>The plugin was not loaded.</source> - <translation>A extensión non se cargou.</translation> + <source>Aliases: %1</source> + <translation>Alcumes: %1</translation> </message> <message> - <source>Unknown error</source> - <translation>Erro descoñecido</translation> + <source>unknown</source> + <translation>descoñecido</translation> </message> </context> <context> @@ -5013,11 +4861,11 @@ Desexa sobrescribilo?</translation> </message> <message> <source>P&roperties</source> - <translation>P&ropriedades</translation> + <translation>P&ropiedades</translation> </message> <message> <source>Location:</source> - <translation>Localización:</translation> + <translation>Lugar:</translation> </message> <message> <source>Preview</source> @@ -5083,6 +4931,20 @@ Desexa sobrescribilo?</translation> </message> </context> <context> + <name>QPushButton</name> + <message> + <source>Open</source> + <translation>Abrir</translation> + </message> +</context> +<context> + <name>QRadioButton</name> + <message> + <source>Check</source> + <translation>Marcar</translation> + </message> +</context> +<context> <name>QRegExp</name> <message> <source>no error occurred</source> @@ -5248,13 +5110,6 @@ Desexa sobrescribilo?</translation> </message> </context> <context> - <name>QScriptNewBreakpointWidget</name> - <message> - <source>Close</source> - <translation>Pechar</translation> - </message> -</context> -<context> <name>QScriptDebugger</name> <message> <source>Go to Line</source> @@ -5338,7 +5193,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>&Find in Script...</source> - <translation>Procurar no &script...</translation> + <translation>Buscar no &script...</translation> </message> <message> <source>Ctrl+F</source> @@ -5346,7 +5201,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Find &Next</source> - <translation>Procurar o &seguinte</translation> + <translation>Buscar o &seguinte</translation> </message> <message> <source>F3</source> @@ -5354,7 +5209,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Find &Previous</source> - <translation>Procurar o &anterior</translation> + <translation>Buscar o &anterior</translation> </message> <message> <source>Shift+F3</source> @@ -5393,7 +5248,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped</source> - <translation><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;A procura retornou</translation> + <translation><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;A busca retornou</translation> </message> </context> <context> @@ -5469,11 +5324,11 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Error Log</source> - <translation>Rexisto de erros</translation> + <translation>Rexistro de erros</translation> </message> <message> <source>Search</source> - <translation>Procurar</translation> + <translation>Buscar</translation> </message> <message> <source>View</source> @@ -5485,6 +5340,80 @@ Desexa sobrescribilo?</translation> </message> </context> <context> + <name>QScriptNewBreakpointWidget</name> + <message> + <source>Close</source> + <translation>Pechar</translation> + </message> +</context> +<context> + <name>QScrollBar</name> + <message> + <source>Line up</source> + <translation>Aliñar en riba</translation> + </message> + <message> + <source>Position</source> + <translation>Posición</translation> + </message> + <message> + <source>Line down</source> + <translation>Aliñar en baixo</translation> + </message> + <message> + <source>Scroll here</source> + <translation>Desprazar cara aquí</translation> + </message> + <message> + <source>Left edge</source> + <translation>Borde esquerdo</translation> + </message> + <message> + <source>Top</source> + <translation>Cume</translation> + </message> + <message> + <source>Right edge</source> + <translation>Borde dereito</translation> + </message> + <message> + <source>Bottom</source> + <translation>Fondo</translation> + </message> + <message> + <source>Page left</source> + <translation>Páxina á esquerda</translation> + </message> + <message> + <source>Page up</source> + <translation>Páxina en riba</translation> + </message> + <message> + <source>Page right</source> + <translation>Páxina á dereita</translation> + </message> + <message> + <source>Page down</source> + <translation>Páxina en baixo</translation> + </message> + <message> + <source>Scroll left</source> + <translation>Desprazar cara á esquerda</translation> + </message> + <message> + <source>Scroll up</source> + <translation>Desprazar cara arriba</translation> + </message> + <message> + <source>Scroll right</source> + <translation>Desprazar cara á dereita</translation> + </message> + <message> + <source>Scroll down</source> + <translation>Desprazar cara abaixo</translation> + </message> +</context> +<context> <name>QSharedMemory</name> <message> <source>%1: unable to set key on lock</source> @@ -5556,7 +5485,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>%1: not attached</source> - <translation>%1: non adxuntado</translation> + <translation>%1: non anexado</translation> </message> <message> <source>%1: size query failed</source> @@ -5754,7 +5683,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Search</source> - <translation>Procurar</translation> + <translation>Buscar</translation> </message> <message> <source>Standby</source> @@ -6046,7 +5975,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Rotate Windows</source> - <translation>Xirar as fiestras</translation> + <translation>Xirar as xanelas</translation> </message> <message> <source>Rotation PB</source> @@ -6206,7 +6135,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Page Down</source> - <translation>Página Abaixo</translation> + <translation>Páxina Abaixo</translation> </message> <message> <source>Caps Lock</source> @@ -6277,7 +6206,7 @@ Desexa sobrescribilo?</translation> <message> <source>Toggle Call/Hangup</source> <extracomment>Button that will hang up if we're in call, or make a call if we're not.</extracomment> - <translation>Comutar chamar/colgar</translation> + <translation>Conmutar chamar/colgar</translation> </message> <message> <source>Flip</source> @@ -6285,7 +6214,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Voice Dial</source> - <extracomment>Button to trigger voice dialling</extracomment> + <extracomment>Button to trigger voice dialing</extracomment> <translation>Chamar mediante voz</translation> </message> <message> @@ -6449,6 +6378,88 @@ Desexa sobrescribilo?</translation> </message> </context> <context> + <name>QSlider</name> + <message> + <source>Page left</source> + <translation>Páxina á esquerda</translation> + </message> + <message> + <source>Page up</source> + <translation>Páxina en riba</translation> + </message> + <message> + <source>Position</source> + <translation>Posición</translation> + </message> + <message> + <source>Page right</source> + <translation>Páxina á dereita</translation> + </message> + <message> + <source>Page down</source> + <translation>Páxina en baixo</translation> + </message> +</context> +<context> + <name>QSocks5SocketEngine</name> + <message> + <source>Connection to proxy refused</source> + <translation>A conexión co proxy foi rexeitada</translation> + </message> + <message> + <source>Connection to proxy closed prematurely</source> + <translation>A conexión co proxy pechouse antes de tempo</translation> + </message> + <message> + <source>Proxy host not found</source> + <translation>Non se atopou o servidor proxy</translation> + </message> + <message> + <source>Connection to proxy timed out</source> + <translation>A conexión co proxy esgotou o tempo-límite</translation> + </message> + <message> + <source>Proxy authentication failed</source> + <translation>Fallou a autenticación co proxy</translation> + </message> + <message> + <source>Proxy authentication failed: %1</source> + <translation>Fallou a autenticación no proxy: %1</translation> + </message> + <message> + <source>SOCKS version 5 protocol error</source> + <translation>Erro do protocolo SOCKS versión 5</translation> + </message> + <message> + <source>General SOCKSv5 server failure</source> + <translation>Fallo xeral do servidor SOCKSv5</translation> + </message> + <message> + <source>Connection not allowed by SOCKSv5 server</source> + <translation>O servidor SOCKSv5 non permitiu a conexión</translation> + </message> + <message> + <source>TTL expired</source> + <translation>Esgotouse o TTL</translation> + </message> + <message> + <source>SOCKSv5 command not supported</source> + <translation>A orde SOCKSv5 non está soportada</translation> + </message> + <message> + <source>Address type not supported</source> + <translation>Tipo de enderezo non soportado</translation> + </message> + <message> + <source>Unknown SOCKSv5 proxy error code 0x%1</source> + <translation>Código de erro descoñecido (0x%1) do proxy SOCKSv5</translation> + </message> + <message> + <source>Network operation timed out</source> + <translation>A operación de rede esgotou o tempo-límite</translation> + </message> +</context> +<context> <name>QSoftKeyManager</name> <message> <source>Ok</source> @@ -6476,6 +6487,17 @@ Desexa sobrescribilo?</translation> </message> </context> <context> + <name>QSpinBox</name> + <message> + <source>More</source> + <translation>Máis</translation> + </message> + <message> + <source>Less</source> + <translation>Menos</translation> + </message> +</context> +<context> <name>QSql</name> <message> <source>Delete</source> @@ -6578,11 +6600,11 @@ Desexa sobrescribilo?</translation> </message> <message> <source>The basicConstraints path length parameter has been exceeded</source> - <translation>Superouse a lonxitude da rota do parámetro basicConstraints</translation> + <translation>Superouse a lonxitude da ruta do parámetro basicConstraints</translation> </message> <message> <source>The supplied certificate is unsuitable for this purpose</source> - <translation>O certificado fornecido non é apropriada para este propósito</translation> + <translation>O certificado fornecido non é apropiada para este propósito</translation> </message> <message> <source>The root CA certificate is not trusted for this purpose</source> @@ -6594,11 +6616,11 @@ Desexa sobrescribilo?</translation> </message> <message> <source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source> - <translation>O certificado emisor do candidado actual rexeitouse porque o nome do asunto non coincide co do emisor do certificado actual</translation> + <translation>O certificado emisor do candidato actual rexeitouse porque o nome do asunto non coincide co do emisor do certificado actual</translation> </message> <message> <source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source> - <translation>O certificado emisor do candidado actual rexeitouse porque o nome do emisor e o número de serie están presentes pero non coinciden co identificador da autoridade da chave do certificado actual</translation> + <translation>O certificado emisor do candidato actual rexeitouse porque o nome do emisor e o número de serie están presentes pero non coinciden co identificador da autoridade da chave do certificado actual</translation> </message> <message> <source>The peer did not present any certificate</source> @@ -6681,14 +6703,48 @@ Desexa sobrescribilo?</translation> </message> </context> <context> + <name>QSystemSemaphore</name> + <message> + <source>%1: permission denied</source> + <translation>%1: negouse o permiso</translation> + </message> + <message> + <source>%1: already exists</source> + <translation>%1: xa existe</translation> + </message> + <message> + <source>%1: does not exist</source> + <translation>%1: non existe</translation> + </message> + <message> + <source>%1: out of resources</source> + <translation>%1: esgotou os recursos</translation> + </message> + <message> + <source>%1: unknown error %2</source> + <translation>%1: erro descoñecido %2</translation> + </message> +</context> +<context> <name>QTDSDriver</name> <message> <source>Unable to open connection</source> <translation>Non foi posíbel abrir a conexión</translation> </message> <message> - <source>Unable to use database</source> - <translation>Non foi posíbel empregar a base de datos</translation> + <source>Unable to use database</source> + <translation>Non foi posíbel empregar a base de datos</translation> + </message> +</context> +<context> + <name>QTabBar</name> + <message> + <source>Scroll Left</source> + <translation>Desprazar cara a esquerda</translation> + </message> + <message> + <source>Scroll Right</source> + <translation>Desprazar cara a dereita</translation> </message> </context> <context> @@ -6734,6 +6790,53 @@ Desexa sobrescribilo?</translation> </message> </context> <context> + <name>QToolButton</name> + <message> + <source>Press</source> + <translation>Premer</translation> + </message> + <message> + <source>Open</source> + <translation>Abrir</translation> + </message> +</context> +<context> + <name>QUdpSocket</name> + <message> + <source>This platform does not support IPv6</source> + <translation>Esta plataforma non admite IPv6</translation> + </message> +</context> +<context> + <name>QUndoGroup</name> + <message> + <source>Undo</source> + <translation>Desfacer</translation> + </message> + <message> + <source>Redo</source> + <translation>Facer de novo</translation> + </message> +</context> +<context> + <name>QUndoModel</name> + <message> + <source><empty></source> + <translation><baleiro></translation> + </message> +</context> +<context> + <name>QUndoStack</name> + <message> + <source>Undo</source> + <translation>Desfacer</translation> + </message> + <message> + <source>Redo</source> + <translation>Facer de novo</translation> + </message> +</context> +<context> <name>QUnicodeControlCharacterMenu</name> <message> <source>LRM Left-to-right mark</source> @@ -6781,42 +6884,6 @@ Desexa sobrescribilo?</translation> </message> </context> <context> - <name>QUdpSocket</name> - <message> - <source>This platform does not support IPv6</source> - <translation>Esta plataforma non admite IPv6</translation> - </message> -</context> -<context> - <name>QUndoGroup</name> - <message> - <source>Undo</source> - <translation>Desfacer</translation> - </message> - <message> - <source>Redo</source> - <translation>Facer de novo</translation> - </message> -</context> -<context> - <name>QUndoModel</name> - <message> - <source><empty></source> - <translation><baleiro></translation> - </message> -</context> -<context> - <name>QUndoStack</name> - <message> - <source>Undo</source> - <translation>Desfacer</translation> - </message> - <message> - <source>Redo</source> - <translation>Facer de novo</translation> - </message> -</context> -<context> <name>QWebFrame</name> <message> <source>Request cancelled</source> @@ -6879,7 +6946,7 @@ Desexa sobrescribilo?</translation> <message> <source>This is a searchable index. Enter search keywords: </source> <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> - <translation>Este é un índice con capacidade de procura. Introduza as palabras chave da procura: </translation> + <translation>Este é un índice con capacidade de busca. Introduza as palabras chave da busca: </translation> </message> <message> <source>Choose File</source> @@ -6894,7 +6961,7 @@ Desexa sobrescribilo?</translation> <message> <source>Open in New Window</source> <comment>Open in New Window context menu item</comment> - <translation>Abrir nunha fiestra nova</translation> + <translation>Abrir nunha xanela nova</translation> </message> <message> <source>Save Link...</source> @@ -6964,7 +7031,7 @@ Desexa sobrescribilo?</translation> <message> <source>No Guesses Found</source> <comment>No Guesses Found context menu item</comment> - <translation>Non se acharon conxecturas</translation> + <translation>Non se atoparon conxecturas</translation> </message> <message> <source>Ignore</source> @@ -6979,7 +7046,7 @@ Desexa sobrescribilo?</translation> <message> <source>Search The Web</source> <comment>Search The Web context menu item</comment> - <translation>Procurar na web</translation> + <translation>Buscar na web</translation> </message> <message> <source>Look Up In Dictionary</source> @@ -7084,22 +7151,22 @@ Desexa sobrescribilo?</translation> <message> <source>No recent searches</source> <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> - <translation>Non se procurou nada</translation> + <translation>Non se buscou nada</translation> </message> <message> <source>Recent searches</source> <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> - <translation>Procuras recentes</translation> + <translation>Buscas recentes</translation> </message> <message> <source>Clear recent searches</source> <comment>menu item in Recent Searches menu that empties menu's contents</comment> - <translation>Limpar as procuras recentes</translation> + <translation>Limpar as buscas recentes</translation> </message> <message> <source>Missing Plug-in</source> <comment>Label text to be used when a plug-in is missing</comment> - <translation>Falta a extensión</translation> + <translation>Falta o complemento</translation> </message> <message> <source>Unknown</source> @@ -7129,7 +7196,7 @@ Desexa sobrescribilo?</translation> <message> <source>Video Element</source> <comment>Media controller element</comment> - <translation>Elemento de video</translation> + <translation>Elemento de vídeo</translation> </message> <message> <source>Mute Button</source> @@ -7239,7 +7306,7 @@ Desexa sobrescribilo?</translation> <message> <source>Movie time scrubber thumb</source> <comment>Media controller element</comment> - <translation>Minuatura do cursor de posición do filme</translation> + <translation>Miniatura do cursor de posición do filme</translation> </message> <message> <source>Rewind movie</source> @@ -7881,7 +7948,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Start tag expected.</source> - <translation>Agardábase unha etiquera de inicio.</translation> + <translation>Agardábase unha etiqueta de inicio.</translation> </message> <message> <source>NDATA in parameter entity declaration.</source> @@ -7893,7 +7960,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>%1 is an invalid processing instruction name.</source> - <translation>%1 é un nome non válido de intrucción de procesamento.</translation> + <translation>%1 é un nome non válido de instrución de procesamento.</translation> </message> <message> <source>Invalid processing instruction name.</source> @@ -7925,7 +7992,7 @@ Desexa sobrescribilo?</translation> </message> <message> <source>Invalid character reference.</source> - <translation>Referencia a un caracter non válido.</translation> + <translation>Referencia a un carácter non válido.</translation> </message> </context> <context> @@ -8124,15 +8191,16 @@ Desexa sobrescribilo?</translation> </message> <message> <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source> - <translation type="unfinished"></translation> + <translation>O nome de destino nunha instrución de procesamento non pode ser %1 en ningunha combinación de maiúsculas nin minúsculas, polo que +%2 non é válido.</translation> </message> <message> <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> - <translation type="unfinished"></translation> + <translation>%1 non é un nome válido de destino dunha instrución de procesamento. Debe ser un valor %2, p. ex. %3.</translation> </message> <message> <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> - <translation>O último paso nunha rota debe conter ou nodos ou valores atómicos. Non pode ser unha mistura dos dous.</translation> + <translation>O último paso nunha ruta debe conter ou nodos ou valores atómicos. Non pode ser unha mistura dos dous.</translation> </message> <message> <source>The data of a processing instruction cannot contain the string %1</source> @@ -8202,1627 +8270,1555 @@ Desexa sobrescribilo?</translation> </message> <message> <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> - <translation type="unfinished">%1 debe estar seguido por %2 ou %3, non na fin da cadea substituta.</translation> + <translation>%1 debe estar seguido por %2 ou %3, non na fin da cadea substituta.</translation> </message> <message> <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> - <translation type="unfinished">Na cadea substituta, %1 debe ir seguido de cando menos un díxito cando non -estea escapada.</translation> + <translation>Na cadea substituta, %1 debe ir seguido de cando menos un díxito cando non estea escapada.</translation> </message> <message> <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> - <translation type="unfinished">Na cadea substituta, %1 só pode ser usado para escaparse a si mesmo ou %2, -non %3.</translation> + <translation>Na cadea substituta %1 só pode ser usado para escaparse a si mesmo ou a %2, non a %3.</translation> </message> <message> <source>%1 matches newline characters</source> - <translation type="unfinished">%1 casa con caracteres de nova liña</translation> + <translation>%1 casa con caracteres de nova liña</translation> </message> <message> <source>%1 and %2 match the start and end of a line.</source> - <translation type="unfinished">%1 e %2 casan con comezo e fin de liña</translation> + <translation>%1 e %2 casan con comezo e fin de liña.</translation> </message> <message> <source>Matches are case insensitive</source> - <translation type="unfinished">As concordancias non son sensíbeis á capitalización</translation> + <translation>As concordancias non son sensíbeis á capitalización</translation> </message> <message> <source>Whitespace characters are removed, except when they appear in character classes</source> - <translation type="unfinished">Os espazos en branco son eliminados, excepto se aparecen en clases de -caracteres</translation> + <translation>Os espazos en branco son eliminados, excepto se aparecen en clases de caracteres</translation> </message> <message> <source>%1 is an invalid regular expression pattern: %2</source> - <translation type="unfinished">%1 é un padrón non válido de expresión regular: %2</translation> + <translation>%1 é un padrón non válido de expresión regular: %2</translation> </message> <message> <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> - <translation type="unfinished">%1 é unha bandeira non válida de expresión regular. As valedoiras son:</translation> + <translation>%1 é unha bandeira non válida de expresión regular. As valedoiras son:</translation> </message> <message> <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> - <translation type="unfinished">Se o primeiro argumento é a secuencia baleira ou unha cadea de lonxitude -cero (sen espazo de nomes), non se pode especificar un prefixo. -Especificouse o prefixo %1.</translation> + <translation>Se o primeiro argumento é a secuencia baleira ou unha cadea de lonxitude cero (sen espazo de nomes), non se pode especificar un prefixo. Especificouse o prefixo %1.</translation> </message> <message> <source>It will not be possible to retrieve %1.</source> - <translation type="unfinished">Non será posíbel acadar %1.</translation> + <translation>Non será posíbel acadar %1.</translation> </message> <message> <source>The default collection is undefined</source> - <translation type="unfinished">Non se definiu a colección predeterminada.</translation> + <translation>Non se definiu a colección predeterminada</translation> </message> <message> <source>%1 cannot be retrieved</source> - <translation type="unfinished">Non é posíbel acadar %1</translation> + <translation>Non é posíbel acadar %1</translation> </message> <message> <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> - <translation type="unfinished">A forma de normalización %1 non está soportada. As formas soportadas son %2, -%3, %4, %5 e ningunha, i.e. a cadea en branco (sen normalización).</translation> + <translation>A forma de normalización %1 non está soportada. As formas soportadas son %2, %3, %4, %5 e ningunha, i.e. a cadea en branco (sen normalización).</translation> </message> <message> <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> - <translation type="unfinished">O desprazamento de zona debe estar no intervalo %1..%2 inclusive. %3 está -fora de intervalo.</translation> + <translation>O desprazamento de zona debe estar no intervalo %1..%2 inclusive. %3 está fora de intervalo.</translation> </message> <message> <source>%1 is not a whole number of minutes.</source> - <translation type="unfinished">%1 non é un número absoluto de minutos.</translation> + <translation>%1 non é un número absoluto de minutos.</translation> </message> <message> <source>The URI cannot have a fragment</source> - <translation type="unfinished">A URI non pode ter un anaco</translation> + <translation>A URI non pode ter un anaco</translation> </message> <message> <source>Required cardinality is %1; got cardinality %2.</source> - <translation type="unfinished">A cardinalidade requirida é %1; obtívose a cardinalidade %2.</translation> + <translation>A cardinalidade requirida é %1; obtívose a cardinalidade %2.</translation> </message> <message> <source>The item %1 did not match the required type %2.</source> - <translation type="unfinished">O ítem %1 non é do tipo requirido %2.</translation> + <translation>O elemento %1 non é do tipo requirido %2.</translation> </message> <message> <source>The variable %1 is unused</source> - <translation type="unfinished">A variábel %1 non é usada</translation> + <translation>A variábel %1 non é usada</translation> </message> <message> <source>W3C XML Schema identity constraint selector</source> - <translation type="unfinished">Selector de restrición de identidade do esquema XML do W3C</translation> + <translation>Selector de restrición de identidade do esquema XML do W3C</translation> </message> <message> <source>W3C XML Schema identity constraint field</source> - <translation type="unfinished">Campo de restrición de identidade do esquema XML do W3C</translation> + <translation>Campo de restrición de identidade do esquema XML do W3C</translation> </message> <message> <source>A construct was encountered which is disallowed in the current language(%1).</source> - <translation type="unfinished">Atopouse unha construción que non está permitida na linguaxe actual (%1).</translation> + <translation>Atopouse unha construción que non está permitida na linguaxe actual (%1).</translation> </message> <message> <source>%1 is an unknown schema type.</source> - <translation type="unfinished">%1 é un tipo de esquema descoñecido.</translation> + <translation>%1 é un tipo de esquema descoñecido.</translation> </message> <message> <source>A template with name %1 has already been declared.</source> - <translation type="unfinished">Xa se declarou un modelo co nome %1.</translation> + <translation>Xa se declarou un modelo co nome %1.</translation> </message> <message> <source>%1 is not a valid numeric literal.</source> - <translation type="unfinished">%1 non é un texto numérico válido.</translation> + <translation>%1 non é un texto numérico válido.</translation> </message> <message> <source>Only one %1 declaration can occur in the query prolog.</source> - <translation type="unfinished">Só pode haber unha declaración de %1 no prólogo da procura.</translation> + <translation>Só pode haber unha declaración de %1 no prólogo da procura.</translation> </message> <message> <source>The initialization of variable %1 depends on itself</source> - <translation type="unfinished">A inicialización da variábel %1 depende de si mesma</translation> + <translation>A inicialización da variábel %1 depende de si mesma</translation> </message> <message> <source>No variable with name %1 exists</source> - <translation type="unfinished">Non hai ningunha variábel chamada %1</translation> + <translation>Non hai ningunha variábel chamada %1</translation> </message> <message> <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> - <translation type="unfinished">Non está soportada a versión %1. A versión soportada de XQuery é a 1.0.</translation> + <translation>Non está soportada a versión %1. A versión soportada de XQuery é a 1.0.</translation> </message> <message> <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> - <translation type="unfinished">A codificación %1 non é válida. Só debe conter caracteres Latinos, non pode -conter espazos, e debe casar coa expresión regular %2.</translation> + <translation>A codificación %1 non é válida. Só debe conter caracteres Latinos, non pode conter espazos, e debe casar coa expresión regular %2.</translation> </message> <message> <source>No function with signature %1 is available</source> - <translation type="unfinished">Non está dispoñíbel ningunha función coa sinatura %1</translation> + <translation>Non está dispoñíbel ningunha función coa sinatura %1</translation> </message> <message> <source>A default namespace declaration must occur before function, variable, and option declarations.</source> - <translation type="unfinished">Debe haber unha declaración dun espazo de nomes predeterminado antes das -declaracións de funcións, variábeis e opcións.</translation> + <translation>Debe haber unha declaración dun espazo de nomes predeterminado antes das declaracións de funcións, variábeis e opcións.</translation> </message> <message> <source>Namespace declarations must occur before function, variable, and option declarations.</source> - <translation type="unfinished">Debe haber declaracións dun espazo de nomes antes das declaracións de -funcións, variábeis e opcións.</translation> + <translation>Debe haber declaracións dun espazo de nomes antes das declaracións de funcións, variábeis e opcións.</translation> </message> <message> <source>Module imports must occur before function, variable, and option declarations.</source> - <translation type="unfinished">As importacións de módulos deben estar antes das declaracións de funcións, -variábeis e opcións.</translation> + <translation>As importacións de módulos deben estar antes das declaracións de funcións, variábeis e opcións.</translation> </message> <message> <source>The keyword %1 cannot occur with any other mode name.</source> - <translation type="unfinished">A palabra-chave %1 só pode aparecer con calquera outro nome de modo.</translation> + <translation>A palabra-chave %1 só pode aparecer con calquera outro nome de modo.</translation> </message> <message> <source>The value of attribute %1 must be of type %2, which %3 isn't.</source> - <translation type="unfinished">O valor do atributo %1 debe ser do tipo %2 e %3 non o é.</translation> + <translation>O valor do atributo %1 debe ser do tipo %2 e %3 non o é.</translation> </message> <message> <source>It is not possible to redeclare prefix %1.</source> - <translation type="unfinished">Non é posíbel declarar de novo o prefixo %1.</translation> + <translation>Non é posíbel declarar de novo o prefixo %1.</translation> </message> <message> <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source> - <translation type="unfinished">Non foi posíbel atopar o prefixo %1. Por omisión, xa está vinculado co -espazo de nomes %2.</translation> + <translation>Non foi posíbel vincular o prefixo %1. Por omisión, xa está vinculado co espazo de nomes %2.</translation> </message> <message> <source>Prefix %1 is already declared in the prolog.</source> - <translation type="unfinished">O prefixo %1 xa está declarado no prólogo.</translation> + <translation>O prefixo %1 xa está declarado no prólogo.</translation> </message> <message> <source>The name of an option must have a prefix. There is no default namespace for options.</source> - <translation type="unfinished">O nome dunha opción debe ter un prefixo. Non hai un espazo de nomes -predeterminado para as opcións.</translation> + <translation>O nome dunha opción debe ter un prefixo. Non hai un espazo de nomes predeterminado para as opcións.</translation> </message> <message> <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> - <translation type="unfinished">A funcionalidade de Importación de Esquema non está soportada, polo tanto -non pode haber declaracións %1.</translation> + <translation>A funcionalidade de Importación de Esquema non está soportada, polo tanto non pode haber declaracións %1.</translation> </message> <message> <source>The target namespace of a %1 cannot be empty.</source> - <translation type="unfinished">O espazo de nomes de destino dun %1 non pode estar en branco.</translation> + <translation>O espazo de nomes de destino dun %1 non pode estar en branco.</translation> </message> <message> <source>The module import feature is not supported</source> - <translation type="unfinished">A funcionalidade de importación de módulos non está soportada</translation> + <translation>A funcionalidade de importación de módulos non está soportada</translation> </message> <message> <source>A variable with name %1 has already been declared.</source> - <translation type="unfinished">Xa foi declarada unha variábel co nome %1.</translation> + <translation>Xa foi declarada unha variábel co nome %1.</translation> </message> <message> <source>No value is available for the external variable with name %1.</source> - <translation type="unfinished">Non se dispón de ningún valor para a variábel externa chamada %1.</translation> + <translation>Non se dispón de ningún valor para a variábel externa chamada %1.</translation> </message> <message> <source>A stylesheet function must have a prefixed name.</source> - <translation type="unfinished">As funcións de folla de estilo deben ter un nome con prefixo.</translation> + <translation>As funcións de folla de estilo deben ter un nome con prefixo.</translation> </message> <message> <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> - <translation type="unfinished">O espazo de nomes das funcións definidas polo usuario non pode estar en -branco (probe co prefixo predefinido %1, que está para casos como este)</translation> + <translation>O espazo de nomes das funcións definidas polo usuario non pode estar en branco (probe co prefixo predefinido %1, que está para casos como este)</translation> </message> <message> <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> - <translation type="unfinished">O espazo de nomes %1 está reservado; polo tanto as funcións definidas polo -usuario non poden usalo. Ténteo co prefixo predefinido %2, que está para -casos como este.</translation> + <translation>O espazo de nomes %1 está reservado; polo tanto as funcións definidas polo usuario non poden usalo. Ténteo co prefixo predefinido %2, que está para casos como este.</translation> </message> <message> <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> - <translation type="unfinished">O espazo de nomes dunha función definida polo usuario nun módulo de -biblioteca debe ser equivalente ao espazo de nomes do módulo. Con outras -verbas: debe ser %1 no canto de %2</translation> + <translation>O espazo de nomes dunha función definida polo usuario nun módulo de biblioteca debe ser equivalente ao espazo de nomes do módulo. Con outras verbas: debe ser %1 no canto de %2</translation> </message> <message> <source>A function already exists with the signature %1.</source> - <translation type="unfinished">Xa existe unha función coa sinatura %1.</translation> + <translation>Xa existe unha función coa sinatura %1.</translation> </message> <message> <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> - <translation type="unfinished">Non se soportan as funcións externas. Todas as funcións soportadas poden ser -usadas directamente, non fai falla declaralas como externas</translation> + <translation>Non se soportan as funcións externas. Todas as funcións soportadas poden ser usadas directamente, non fai falla declaralas como externas</translation> </message> <message> <source>An argument with name %1 has already been declared. Every argument name must be unique.</source> - <translation type="unfinished">Xa foi declarado un argumento co nome %1. O nome de cada argumento debe ser -único.</translation> + <translation>Xa foi declarado un argumento co nome %1. O nome de cada argumento debe ser único.</translation> </message> <message> <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> - <translation type="unfinished">Cando se emprega unha función %1 para procurar nun patrón, o argumento debe -ser unha referencia variábel ou unha cadea literal.</translation> + <translation>Cando se emprega unha función %1 para procurar nun patrón, o argumento debe ser unha referencia variábel ou unha cadea literal.</translation> </message> <message> <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> - <translation type="unfinished">Nun patrón XSL-T, o primeiro argumento da función %1 cando sexa empregada -para facer procuras debe ser unha cadea de texto.</translation> + <translation>Nun patrón XSL-T, o primeiro argumento da función %1 cando sexa empregada para facer procuras debe ser unha cadea de texto.</translation> </message> <message> <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> - <translation type="unfinished">Nun patrón XSL-T, o primeiro argumento da función %1 cando sexa empregada -para facer procuras debe ser unha cadea de texto ou unha referencia variábel.</translation> + <translation>Nun patrón XSL-T, o primeiro argumento da función %1 cando sexa empregada para facer procuras debe ser unha cadea de texto ou unha referencia variábel.</translation> </message> <message> <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> - <translation type="unfinished">Nun patrón XSL-T, a función %1 non pode ter un terceiro argumento.</translation> + <translation>Nun patrón XSL-T, a función %1 non pode ter un terceiro argumento.</translation> </message> <message> <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> - <translation type="unfinished">Nun patrón XSL-T, só pode empregar para procuras as funcións %1 e %2, non a % -3.</translation> + <translation>Nun patrón XSL-T, só pode empregar para procuras as funcións %1 e %2, non a %3.</translation> </message> <message> <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> - <translation type="unfinished">Nun patrón XSL-T non pode empregarse o eixo %1, só os %2 e %3.</translation> + <translation>Nun patrón XSL-T non pode empregarse o eixo %1, só os %2 e %3.</translation> </message> <message> <source>%1 is an invalid template mode name.</source> - <translation type="unfinished">%1 non é un nome de modo válido do modelo.</translation> + <translation>%1 non é un nome de modo válido do modelo.</translation> </message> <message> <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> - <translation type="unfinished">O nome dunha variábel asociada a unha expresión for debe ser diferente da -variábel posicional. Por isto, as dúas variábeis chamadas %1 chocan.</translation> + <translation>O nome dunha variábel asociada a unha expresión for debe ser diferente da variábel posicional. Por isto, as dúas variábeis chamadas %1 chocan.</translation> </message> <message> <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> - <translation type="unfinished">Non está soportada a funcionalidade de Validación do Esquema. Polo tanto, as -expresións %1 non poden ser usadas.</translation> + <translation>Non está soportada a funcionalidade de Validación do Esquema. Polo tanto, as expresións %1 non poden ser usadas.</translation> </message> <message> <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> - <translation type="unfinished">Non está soportada ningunha das expresións pragma. Polo tanto, debe haber -presente unha expresión de reserva</translation> + <translation>Non está soportada ningunha das expresións pragma. Polo tanto, debe haber presente unha expresión de reserva</translation> </message> <message> <source>Each name of a template parameter must be unique; %1 is duplicated.</source> - <translation type="unfinished">Os nomes dos parámetros do modelo deben ser únicos, %1 está duplicado.</translation> + <translation>Os nomes dos parámetros do modelo deben ser únicos, %1 está duplicado.</translation> </message> <message> <source>The %1-axis is unsupported in XQuery</source> - <translation type="unfinished">Non está soportado o eixo %1 en XQuery</translation> + <translation>Non está soportado o eixo %1 en XQuery</translation> </message> <message> <source>No function with name %1 is available.</source> - <translation type="unfinished">Non hai ningunha función chamada %1.</translation> + <translation>Non hai ningunha función chamada %1.</translation> </message> <message> <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> - <translation type="unfinished">A URI do espazo de nomes non pode ser unha cadea valeira cando se estexa a -asociar cun prefixo, %1.</translation> + <translation>A URI do espazo de nomes non pode ser unha cadea valeira cando se estea a asociar cun prefixo, %1.</translation> </message> <message> <source>%1 is an invalid namespace URI.</source> - <translation type="unfinished">%1 non é unha URI válida de espazo de nomes.</translation> + <translation>%1 non é unha URI válida de espazo de nomes.</translation> </message> <message> <source>It is not possible to bind to the prefix %1</source> - <translation type="unfinished">Non é posíbel asociar co prefixo %1</translation> + <translation>Non é posíbel asociar co prefixo %1</translation> </message> <message> <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation type="unfinished">O espazo de nomes %1 só pode estar vinculado a %2 (e está, en calquera caso, -predeclarado).</translation> + <translation>O espazo de nomes %1 só pode estar vinculado a %2 (e está, en calquera caso, predeclarado).</translation> </message> <message> <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation type="unfinished">O prefixo %1 só pode estar vinculado a %2 (e está, en calquera caso, -predeclarado).</translation> + <translation>O prefixo %1 só pode estar vinculado a %2 (e está, en calquera caso, predeclarado).</translation> </message> <message> <source>Two namespace declaration attributes have the same name: %1.</source> - <translation type="unfinished">Dous atributos na declaración dun espazo de nomes teñen o mesmo nome: %1.</translation> + <translation>Dous atributos na declaración dun espazo de nomes teñen o mesmo nome: %1.</translation> </message> <message> <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> - <translation type="unfinished">A URI do espazo de nomes debe ser constante e non pode conter expresións.</translation> + <translation>A URI do espazo de nomes debe ser constante e non pode conter expresións.</translation> </message> <message> <source>An attribute with name %1 has already appeared on this element.</source> - <translation type="unfinished">Xa apareceu un atributo co nome %1 neste elemento.</translation> + <translation>Xa apareceu un atributo co nome %1 neste elemento.</translation> </message> <message> <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> - <translation type="unfinished">Hai un construtor directo dun elemento que non está ben formado. %1 remata -con %2.</translation> + <translation>Hai un construtor directo dun elemento que non está ben formado. %1 remata con %2.</translation> </message> <message> <source>The name %1 does not refer to any schema type.</source> - <translation type="unfinished">O nome %1 non se refire a ningún tipo de esquema.</translation> + <translation>O nome %1 non se refire a ningún tipo de esquema.</translation> </message> <message> <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> - <translation type="unfinished">%1 é un tipo complexo. Non é posíbel converter a tipos complexos. Porén, si -que pode converter a tipos atómicos como %2.</translation> + <translation>%1 é un tipo complexo. Non é posíbel converter a tipos complexos. Porén, si que pode converter a tipos atómicos como %2.</translation> </message> <message> <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> - <translation type="unfinished">%1 non é un tipo atómico. Só é posíbel converter a tipos atómicos.</translation> + <translation>%1 non é un tipo atómico. Só é posíbel converter a tipos atómicos.</translation> </message> <message> <source>%1 is not a valid name for a processing-instruction.</source> - <translation type="unfinished">%1 non é un nome válido para unha instrución de procesamento.</translation> + <translation>%1 non é un nome válido para unha instrución de procesamento.</translation> </message> <message> <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> - <translation type="unfinished">%1 non está nas declaracións de atributos ao alcance. Lembre que non está -soportada a funcionalidade de importación de esquemas.</translation> + <translation>%1 non está nas declaracións de atributos ao alcance. Lembre que non está soportada a funcionalidade de importación de esquemas.</translation> </message> <message> <source>The name of an extension expression must be in a namespace.</source> - <translation type="unfinished">O nome dunha expresión de extensión debe estar nun espazo de nomes.</translation> + <translation>O nome dunha expresión de extensión debe estar nun espazo de nomes.</translation> </message> <message> <source>Element %1 is not allowed at this location.</source> - <translation type="unfinished">Neste lugar non se permite o elemento %1.</translation> + <translation>Neste lugar non se permite o elemento %1.</translation> </message> <message> <source>Text nodes are not allowed at this location.</source> - <translation type="unfinished">Neste lugar non se permiten nodos de texto.</translation> + <translation>Neste lugar non se permiten nodos de texto.</translation> </message> <message> <source>Parse error: %1</source> - <translation type="unfinished">Erro de procesamento: %1</translation> + <translation>Erro de procesamento: %1</translation> </message> <message> <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> - <translation type="unfinished">O valor do atributo da versión de XSL-T debe ser un valor do tipo %1, e %2 -non o é.</translation> + <translation>O valor do atributo da versión de XSL-T debe ser un valor do tipo %1, e %2 non o é.</translation> </message> <message> <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> - <translation type="unfinished">A executar unha folla de estilos XSL-T 1.0 cun procesador 2.0.</translation> + <translation>A executar unha folla de estilos XSL-T 1.0 cun procesador 2.0.</translation> </message> <message> <source>Unknown XSL-T attribute %1.</source> - <translation type="unfinished">Non se coñece o atributo XSL-T %1.</translation> + <translation>Non se coñece o atributo XSL-T %1.</translation> </message> <message> <source>Attribute %1 and %2 are mutually exclusive.</source> - <translation type="unfinished">Os atributos %1 e %2 exclúense mutuamente.</translation> + <translation>Os atributos %1 e %2 exclúense mutuamente.</translation> </message> <message> <source>In a simplified stylesheet module, attribute %1 must be present.</source> - <translation type="unfinished">Nun módulo de folla de estilos simplificada debe estar presente o atributo % -1.</translation> + <translation>Nun módulo de folla de estilos simplificada debe estar presente o atributo %1.</translation> </message> <message> <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> - <translation type="unfinished">Se o elemento %1 non ten o atributo %2 non pode ter os atributos %3 nin %4.</translation> + <translation>Se o elemento %1 non ten o atributo %2 non pode ter os atributos %3 nin %4.</translation> </message> <message> <source>Element %1 must have at least one of the attributes %2 or %3.</source> - <translation type="unfinished">O elemento %1 debe ter polo menos un dos atributos %2 ou %3.</translation> + <translation>O elemento %1 debe ter polo menos un dos atributos %2 ou %3.</translation> </message> <message> <source>At least one mode must be specified in the %1-attribute on element %2.</source> - <translation type="unfinished">Debe especificarse polo menos un modo no atributo %1 do elemento %2.</translation> + <translation>Debe especificarse polo menos un modo no atributo %1 do elemento %2.</translation> </message> <message> <source>Element %1 must come last.</source> - <translation type="unfinished">O elemento %1 debe ir o último.</translation> + <translation>O elemento %1 debe ir o último.</translation> </message> <message> <source>At least one %1-element must occur before %2.</source> - <translation type="unfinished">Debe estar presente polo menos un elemento %1 antes de %2.</translation> + <translation>Debe estar presente polo menos un elemento %1 antes de %2.</translation> </message> <message> <source>Only one %1-element can appear.</source> - <translation type="unfinished">Só pode aparecer un elemento %1.</translation> + <translation>Só pode aparecer un elemento %1.</translation> </message> <message> <source>At least one %1-element must occur inside %2.</source> - <translation type="unfinished">Debe estar presente polo menos un elemento %1 dentro de %2.</translation> + <translation>Debe estar presente polo menos un elemento %1 dentro de %2.</translation> </message> <message> <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> - <translation type="unfinished">Non se pode empregar un construtor de secuencia cando o atributo %1 está -presente en %2.</translation> + <translation>Non se pode empregar un construtor de secuencia cando o atributo %1 está presente en %2.</translation> </message> <message> <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> - <translation type="unfinished">O elemento %1 debe ter ou un atributo %2 ou un construtor de secuencia.</translation> + <translation>O elemento %1 debe ter ou un atributo %2 ou un construtor de secuencia.</translation> </message> <message> <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> - <translation type="unfinished">Non se pode subministrar un valor predeterminado mediante un atributo %1 nin -un construtor de secuencia cando se require un parámetro.</translation> + <translation>Non se pode subministrar un valor predeterminado mediante un atributo %1 nin un construtor de secuencia cando se require un parámetro.</translation> </message> <message> <source>Element %1 cannot have children.</source> - <translation type="unfinished">O elemento %1 non pode ter fillos.</translation> + <translation>O elemento %1 non pode ter fillos.</translation> </message> <message> <source>Element %1 cannot have a sequence constructor.</source> - <translation type="unfinished">O elemento %1 non pode ter un construtor de secuencia.</translation> + <translation>O elemento %1 non pode ter un construtor de secuencia.</translation> </message> <message> <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> - <translation type="unfinished">O atributo %1 non pode aparecer en %2 cando é filla de %3.</translation> + <translation>O atributo %1 non pode aparecer en %2 cando é filla de %3.</translation> </message> <message> <source>A parameter in a function cannot be declared to be a tunnel.</source> - <translation type="unfinished">Non se pode declarar como túnel un parámetro nunha función.</translation> + <translation>Non se pode declarar como túnel un parámetro nunha función.</translation> </message> <message> <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> - <translation type="unfinished">Este procesador non é coñecedor do Schema e polo tanto %1 non pode -empregarse.</translation> + <translation>Este procesador non é coñecedor do Schema e polo tanto %1 non pode empregarse.</translation> </message> <message> <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> - <translation type="unfinished">Os elementos da folla de estilo de máximo nivel debe estar nun espazo de -nomes non nulo, e %1 non o é.</translation> + <translation>Os elementos da folla de estilo de máximo nivel debe estar nun espazo de nomes non nulo, e %1 non o é.</translation> </message> <message> <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> - <translation type="unfinished">O valor do atributo %1 no elemento %2 debe ser %3 ou %4, non %5.</translation> + <translation>O valor do atributo %1 no elemento %2 debe ser %3 ou %4, non %5.</translation> </message> <message> <source>Attribute %1 cannot have the value %2.</source> - <translation type="unfinished">O atributo %1 non pode ter o valor %2.</translation> + <translation>O atributo %1 non pode ter o valor %2.</translation> </message> <message> <source>The attribute %1 can only appear on the first %2 element.</source> - <translation type="unfinished">O atributo %1 só pode aparecer no primeiro elemento %2.</translation> + <translation>O atributo %1 só pode aparecer no primeiro elemento %2.</translation> </message> <message> <source>At least one %1 element must appear as child of %2.</source> - <translation type="unfinished">Debe aparecer cando menos un elemento %1 como fillo de %2.</translation> + <translation>Debe aparecer cando menos un elemento %1 como fillo de %2.</translation> </message> <message> <source>Empty particle cannot be derived from non-empty particle.</source> - <translation type="unfinished">Unha partícula baleira non pode derivarse dunha non baleira.</translation> + <translation>Unha partícula baleira non pode derivarse dunha non baleira.</translation> </message> <message> <source>Derived particle is missing element %1.</source> - <translation type="unfinished">Na partícula derivada falta o elemento %1.</translation> + <translation>Na partícula derivada falta o elemento %1.</translation> </message> <message> <source>Derived element %1 is missing value constraint as defined in base particle.</source> - <translation type="unfinished">No elemento derivado %1 falta a restrición aos valores definida na partícula -de base.</translation> + <translation>No elemento derivado %1 falta a restrición aos valores definida na partícula de base.</translation> </message> <message> <source>Derived element %1 has weaker value constraint than base particle.</source> - <translation type="unfinished">O elemento derivado %1 ten unha restrición aos valores máis feble do que a -da súa partícula de base.</translation> + <translation>O elemento derivado %1 ten unha restrición aos valores máis feble do que a da súa partícula de base.</translation> </message> <message> <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source> - <translation type="unfinished">A restrición de valor fixo do elemento %1 é diferente da de valor da -partícula base.</translation> + <translation>A restrición de valor fixo do elemento %1 é diferente da de valor da partícula base.</translation> </message> <message> <source>Derived element %1 cannot be nillable as base element is not nillable.</source> - <translation type="unfinished">O elemento derivado %1 non se pode anular porque o elemento de base non se -pode anular.</translation> + <translation>O elemento derivado %1 non se pode anular porque o elemento de base non se pode anular.</translation> </message> <message> <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source> - <translation type="unfinished">O bloque de restricións do elemento derivado %1 non pode ser máis feble do -que son as do elemento de base.</translation> + <translation>O bloque de restricións do elemento derivado %1 non pode ser máis feble do que son as do elemento de base.</translation> </message> <message> <source>Simple type of derived element %1 cannot be validly derived from base element.</source> - <translation type="unfinished">O tipo simple do elemento derivado %1 non se pode derivar con validez a -partir do elemento de base.</translation> + <translation>O tipo simple do elemento derivado %1 non se pode derivar con validez a partir do elemento de base.</translation> </message> <message> <source>Complex type of derived element %1 cannot be validly derived from base element.</source> - <translation type="unfinished">O tipo complexo do elemento derivado %1 non se pode derivar con validez a -partir do elemento de base.</translation> + <translation>O tipo complexo do elemento derivado %1 non se pode derivar con validez a partir do elemento de base.</translation> </message> <message> <source>Element %1 is missing in derived particle.</source> - <translation type="unfinished">Falta o elemento %1 na partícula derivada.</translation> + <translation>Falta o elemento %1 na partícula derivada.</translation> </message> <message> <source>Element %1 does not match namespace constraint of wildcard in base particle.</source> - <translation type="unfinished">O elemento %1 non casa coa restrición do espazo de nomes de comodín na -partícula de base.</translation> + <translation>O elemento %1 non casa coa restrición do espazo de nomes de comodín na partícula de base.</translation> </message> <message> <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source> - <translation type="unfinished">O comodín da partícula derivada non é un subconxunto válido do da partícula -de base.</translation> + <translation>O carácter de substitución da partícula derivada non é un subconxunto válido do da partícula de base.</translation> </message> <message> <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source> - <translation type="unfinished">O processContent do comodín na partícula derivada é máis feble que o do -comodín na partícula de base.</translation> + <translation>O processContent do comodín na partícula derivada é máis feble que o do comodín na partícula de base.</translation> </message> <message> <source>Derived particle allows content that is not allowed in the base particle.</source> - <translation type="unfinished">A partícula derivada permite contido non permitido na partícula de base.</translation> + <translation>A partícula derivada permite contido non permitido na partícula de base.</translation> </message> <message> <source>%1 has inheritance loop in its base type %2.</source> - <translation type="unfinished">%1 ten un bucle de herdanza no seu tipo base %2.</translation> + <translation>%1 ten un bucle de herdanza no seu tipo base %2.</translation> </message> <message> <source>Circular inheritance of base type %1.</source> - <translation type="unfinished">Herdanza circular do tipo de base %1.</translation> + <translation>Herdanza circular do tipo de base %1.</translation> </message> <message> <source>Circular inheritance of union %1.</source> - <translation type="unfinished">Herdanza circular da unión %1.</translation> + <translation>Herdanza circular da unión %1.</translation> </message> <message> <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source> - <translation type="unfinished">Non se permite que %1 derive de %2 debido a unha restrición xa que o este -defíneo como final.</translation> + <translation>Non se permite que %1 derive de %2 debido a unha restrición xa que o este defíneo como final.</translation> </message> <message> <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source> - <translation type="unfinished">Non se permite que %1 derive de %2 por extensión debido a unha restrición xa -que o este defíneo como final.</translation> + <translation>Non se permite que %1 derive de %2 por extensión debido a unha restrición xa que o este defíneo como final.</translation> </message> <message> <source>Base type of simple type %1 cannot be complex type %2.</source> - <translation type="unfinished">O tipo base do tipo simple %1 non pode ser do tipo complexo %2.</translation> + <translation>O tipo base do tipo simple %1 non pode ser do tipo complexo %2.</translation> </message> <message> <source>Simple type %1 cannot have direct base type %2.</source> - <translation type="unfinished">O tipo simple %1 non pode ter unha base directa do tipo %2.</translation> + <translation>O tipo simple %1 non pode ter unha base directa do tipo %2.</translation> </message> <message> <source>Simple type %1 is not allowed to have base type %2.</source> - <translation type="unfinished">Ao tipo simple %1 non se lle permite ter unha base do tipo %2.</translation> + <translation>Ao tipo simple %1 non se lle permite ter unha base do tipo %2.</translation> </message> <message> <source>Simple type %1 can only have simple atomic type as base type.</source> - <translation type="unfinished">O tipo simple %1 só pode ter un tipo atómico simple como tipo de base.</translation> + <translation>O tipo simple %1 só pode ter un tipo atómico simple como tipo de base.</translation> </message> <message> <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source> - <translation type="unfinished">O tipo simple %1 non pode derivar do %2 xa que este define a restrición como -final.</translation> + <translation>O tipo simple %1 non pode derivar do %2 xa que este define a restrición como final.</translation> </message> <message> <source>Variety of item type of %1 must be either atomic or union.</source> - <translation type="unfinished">A variedade do tipo de elemento de %1 debe ser ou ou atómico ou unión.</translation> + <translation>A variedade do tipo de elemento de %1 debe ser ou ou atómico ou unión.</translation> </message> <message> <source>Variety of member types of %1 must be atomic.</source> - <translation type="unfinished">A variedade dos tipos membro de %1 debe sen atómica.</translation> + <translation>A variedade dos tipos membro de %1 debe sen atómica.</translation> </message> <message> <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source> - <translation type="unfinished">Non se permite que %1 derive de %2 por lista xa que esta defínea como final.</translation> + <translation>Non se permite que %1 derive de %2 por lista xa que esta defínea como final.</translation> </message> <message> <source>Simple type %1 is only allowed to have %2 facet.</source> - <translation type="unfinished">Só se permite que o tipo simple %1 teña a faceta %2.</translation> + <translation>Só se permite que o tipo simple %1 teña a faceta %2.</translation> </message> <message> <source>Base type of simple type %1 must have variety of type list.</source> - <translation type="unfinished">O tipo base do tipo simple %1 debe ser variedade do tipo lista.</translation> + <translation>O tipo base do tipo simple %1 debe ser variedade do tipo lista.</translation> </message> <message> <source>Base type of simple type %1 has defined derivation by restriction as final.</source> - <translation type="unfinished">O tipo base do tipo simple %1 definiu a derivación por restrición como final.</translation> + <translation>O tipo base do tipo simple %1 definiu a derivación por restrición como final.</translation> </message> <message> <source>Item type of base type does not match item type of %1.</source> - <translation type="unfinished">O tipo de elemento do tipo de base non casa co tipo de elemento de %1.</translation> + <translation>O tipo de elemento do tipo de base non casa co tipo de elemento de %1.</translation> </message> <message> <source>Simple type %1 contains not allowed facet type %2.</source> - <translation type="unfinished">O tipo simple %1 contén unha faceta non permitida do tipo %2.</translation> + <translation>O tipo simple %1 contén unha faceta non permitida do tipo %2.</translation> </message> <message> <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source> - <translation type="unfinished">Non se permite que %1 derive de %2 por unión xa que este defínea como final.</translation> + <translation>Non se permite que %1 derive de %2 por unión xa que este defínea como final.</translation> </message> <message> <source>%1 is not allowed to have any facets.</source> - <translation type="unfinished">%1 non pode ter ningunha faceta.</translation> + <translation>%1 non pode ter ningunha faceta.</translation> </message> <message> <source>Base type %1 of simple type %2 must have variety of union.</source> - <translation type="unfinished">O tipo de base %1 do tipo simple %2 debe ser unha variedade de unión.</translation> + <translation>O tipo de base %1 do tipo simple %2 debe ser unha variedade de unión.</translation> </message> <message> <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source> - <translation type="unfinished">Non se permite que o tipo base %1 do tipo simple %2 teña restrición no -atributo %3.</translation> + <translation>Non se permite que o tipo base %1 do tipo simple %2 teña restrición no atributo %3.</translation> </message> <message> <source>Member type %1 cannot be derived from member type %2 of %3's base type %4.</source> - <translation type="unfinished">O tipo membro %1 non se pode derivar do tipo membro %2 do tipo base %4 de %3.</translation> + <translation>O tipo membro %1 non se pode derivar do tipo membro %2 do tipo base %4 de %3.</translation> </message> <message> <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source> - <translation type="unfinished">O método de derivación de %1 debe ser por extensión porque o tipo base %2 é -un tipo simple.</translation> + <translation>O método de derivación de %1 debe ser por extensión porque o tipo base %2 é un tipo simple.</translation> </message> <message> <source>Complex type %1 has duplicated element %2 in its content model.</source> - <translation type="unfinished">O tipo complexo %1 contén por duplicado o elemento %2 no seu modelo de -contido.</translation> + <translation>O tipo complexo %1 contén por duplicado o elemento %2 no seu modelo de contido.</translation> </message> <message> <source>Complex type %1 has non-deterministic content.</source> - <translation type="unfinished">O tipo complexo %1 ten contido non determinista.</translation> + <translation>O tipo complexo %1 ten contido non determinista.</translation> </message> <message> <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source> - <translation type="unfinished">Os atributos do tipo complexo %1 non son unha extensión válida dos atributos -do tipo base %2: %3.</translation> + <translation>Os atributos do tipo complexo %1 non son unha extensión válida dos atributos do tipo base %2: %3.</translation> </message> <message> <source>Content model of complex type %1 is not a valid extension of content model of %2.</source> - <translation type="unfinished">O modelo de contido do tipo complexo %1 non é unha extensión válida do -modelo de contido de %2.</translation> + <translation>O modelo de contido do tipo complexo %1 non é unha extensión válida do modelo de contido de %2.</translation> </message> <message> <source>Complex type %1 must have simple content.</source> - <translation type="unfinished">O tipo complexo %1 debe ter contido simple.</translation> + <translation>O tipo complexo %1 debe ter contido simple.</translation> </message> <message> <source>Complex type %1 must have the same simple type as its base class %2.</source> - <translation type="unfinished">O tipo complexo %1 debe ter o mesmo tipo simple que a súa clase de base %2.</translation> + <translation>O tipo complexo %1 debe ter o mesmo tipo simple que a súa clase de base %2.</translation> </message> <message> <source>Complex type %1 cannot be derived from base type %2%3.</source> - <translation type="unfinished">O tipo complexo %1 non pode derivarse do tipo de base %2%3.</translation> + <translation>O tipo complexo %1 non pode derivarse do tipo de base %2%3.</translation> </message> <message> <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source> - <translation type="unfinished">Os atributos do tipo complexo %1 non son unha restrición válida baseada nos -atributos do tipo base %2: %3.</translation> + <translation>Os atributos do tipo complexo %1 non son unha restrición válida baseada nos atributos do tipo base %2: %3.</translation> </message> <message> <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source> - <translation type="unfinished">O tipo complexo %1 con contido simple non se pode derivar do tipo de base -complexo %2.</translation> + <translation>O tipo complexo %1 con contido simple non se pode derivar do tipo de base complexo %2.</translation> </message> <message> <source>Item type of simple type %1 cannot be a complex type.</source> - <translation type="unfinished">O tipo de elemento do tipo simple %1 non pode ser un tipo complexo.</translation> + <translation>O tipo de elemento do tipo simple %1 non pode ser un tipo complexo.</translation> </message> <message> <source>Member type of simple type %1 cannot be a complex type.</source> - <translation type="unfinished">O tipo membro do tipo simple %1 non pode ser un tipo complexo.</translation> + <translation>O tipo membro do tipo simple %1 non pode ser un tipo complexo.</translation> </message> <message> <source>%1 is not allowed to have a member type with the same name as itself.</source> - <translation type="unfinished">Non se permite que %1 teña un tipo membro co mesmo nome ca el.</translation> + <translation>Non se permite que %1 teña un tipo membro co mesmo nome ca el.</translation> </message> <message> <source>%1 facet collides with %2 facet.</source> - <translation type="unfinished">A faceta %1 entra en conflito doa %2.</translation> + <translation>A faceta %1 entra en conflito doa %2.</translation> </message> <message> <source>%1 facet must have the same value as %2 facet of base type.</source> - <translation type="unfinished">A faceta %1 debe ter o mesmo valor que a %2 do tipo de base.</translation> + <translation>A faceta %1 debe ter o mesmo valor que a %2 do tipo de base.</translation> </message> <message> <source>%1 facet must be equal or greater than %2 facet of base type.</source> - <translation type="unfinished">A faceta %1 debe ser maior ou igual que a %2 do tipo de base.</translation> + <translation>A faceta %1 debe ser maior ou igual que a %2 do tipo de base.</translation> </message> <message> <source>%1 facet must be less than or equal to %2 facet of base type.</source> - <translation type="unfinished">A faceta %1 debe ser menor que ou igual que a %2 do tipo de base.</translation> + <translation>A faceta %1 debe ser menor que ou igual que a %2 do tipo de base.</translation> </message> <message> <source>%1 facet contains invalid regular expression</source> - <translation type="unfinished">A faceta %1 contén unha expresión regular non válida</translation> + <translation>A faceta %1 contén unha expresión regular non válida</translation> </message> <message> <source>Unknown notation %1 used in %2 facet.</source> - <translation type="unfinished">Empregouse a notación non válida %1 na faceta %2.</translation> + <translation>Empregouse a notación non válida %1 na faceta %2.</translation> </message> <message> <source>%1 facet contains invalid value %2: %3.</source> - <translation type="unfinished">A faceta %1 contén o valor non válido %2: %3.</translation> + <translation>A faceta %1 contén o valor non válido %2: %3.</translation> </message> <message> <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source> - <translation type="unfinished">A faceta %1 non pode ser %2 nin %3 se a faceta %4 do tipo de base é %5.</translation> + <translation>A faceta %1 non pode ser %2 nin %3 se a faceta %4 do tipo de base é %5.</translation> </message> <message> <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source> - <translation type="unfinished">A faceta %1 non pode ser %2 se a faceta %3 do tipo de base é %4.</translation> + <translation>A faceta %1 non pode ser %2 se a faceta %3 do tipo de base é %4.</translation> </message> <message> <source>%1 facet must be less than or equal to %2 facet.</source> - <translation type="unfinished">A faceta %1 debe ser menor que ou igual que a %2.</translation> + <translation>A faceta %1 debe ser menor que ou igual que a %2.</translation> </message> <message> <source>%1 facet must be less than %2 facet of base type.</source> - <translation type="unfinished">A faceta %1 debe ser menor que a faceta %2 do tipo de base.</translation> + <translation>A faceta %1 debe ser menor que a faceta %2 do tipo de base.</translation> </message> <message> <source>%1 facet and %2 facet cannot appear together.</source> - <translation type="unfinished">As facetas %1 e %2 non poden aparecer xuntas.</translation> + <translation>As facetas %1 e %2 non poden aparecer xuntas.</translation> </message> <message> <source>%1 facet must be greater than %2 facet of base type.</source> - <translation type="unfinished">A faceta %1 debe ser maior que a faceta %2 do tipo de base.</translation> + <translation>A faceta %1 debe ser maior que a faceta %2 do tipo de base.</translation> </message> <message> <source>%1 facet must be less than %2 facet.</source> - <translation type="unfinished">A faceta %1 debe ser menor que a %2.</translation> + <translation>A faceta %1 debe ser menor que a %2.</translation> </message> <message> <source>%1 facet must be greater than or equal to %2 facet of base type.</source> - <translation type="unfinished">A faceta %1 deber ser maior ou igual que a faceta %2 do tipo de base.</translation> + <translation>A faceta %1 deber ser maior ou igual que a faceta %2 do tipo de base.</translation> </message> <message> <source>Simple type contains not allowed facet %1.</source> - <translation type="unfinished">O tipo simple contén a faceta non permitida %1.</translation> + <translation>O tipo simple contén a faceta non permitida %1.</translation> </message> <message> <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source> - <translation type="unfinished">As facetas %1, %2, %3, %4, %5 e %6 non están permitidas cando se deriva por -lista.</translation> + <translation>As facetas %1, %2, %3, %4, %5 e %6 non están permitidas cando se deriva por lista.</translation> </message> <message> <source>Only %1 and %2 facets are allowed when derived by union.</source> - <translation type="unfinished">Só se permiten as facetas %1 e %2 cando se deriva por unión.</translation> + <translation>Só se permiten as facetas %1 e %2 cando se deriva por unión.</translation> </message> <message> <source>%1 contains %2 facet with invalid data: %3.</source> - <translation type="unfinished">%1 contén a faceta %2 con datos non válidos: %3.</translation> + <translation>%1 contén a faceta %2 con datos non válidos: %3.</translation> </message> <message> <source>Attribute group %1 contains attribute %2 twice.</source> - <translation type="unfinished">O grupo de atributos %1 contén o atributo %2 dúas veces.</translation> + <translation>O grupo de atributos %1 contén o atributo %2 dúas veces.</translation> </message> <message> <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source> - <translation type="unfinished">O grupo de atributos %1 contén dous atributos diferentes con tipos derivados -de %2</translation> + <translation>O grupo de atributos %1 contén dous atributos diferentes con tipos derivados de %2.</translation> </message> <message> <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation type="unfinished">O grupo de atributos %1 contén o atributo %2, que ten restrición de valores -pero un tipo que herda de %3.</translation> + <translation>O grupo de atributos %1 contén o atributo %2, que ten restrición de valores pero un tipo que herda de %3.</translation> </message> <message> <source>Complex type %1 contains attribute %2 twice.</source> - <translation type="unfinished">O tipo complexo %1 contén o atributo %2 dúas veces.</translation> + <translation>O tipo complexo %1 contén o atributo %2 dúas veces.</translation> </message> <message> <source>Complex type %1 contains two different attributes that both have types derived from %2.</source> - <translation type="unfinished">O tipo complexo %1 contén dous atributos diferentes con tipos derivados de %2.</translation> + <translation>O tipo complexo %1 contén dous atributos diferentes con tipos derivados de %2.</translation> </message> <message> <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation type="unfinished">O tipo complexo %1 contén o atributo %2, que ten restrición de valores pero -un tipo que herda de %3.</translation> + <translation>O tipo complexo %1 contén o atributo %2, que ten restrición de valores pero un tipo que herda de %3.</translation> </message> <message> <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source> - <translation type="unfinished">O elemento %1 non se lle permite ter unha restrición de valores se o seu tipo -de base -é complexo.</translation> + <translation>O elemento %1 non se lle permite ter unha restrición de valores se o seu tipo de base é complexo.</translation> </message> <message> <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source> - <translation type="unfinished">O elemento %1 non se lle permite ter unha restrición de valores se o seu tipo -deriva de %2.</translation> + <translation>O elemento %1 non se lle permite ter unha restrición de valores se o seu tipo deriva de %2.</translation> </message> <message> <source>Value constraint of element %1 is not of elements type: %2.</source> - <translation type="unfinished">A restrición aos valores do elemento %1 non é do tipo elementos: %2.</translation> + <translation>A restrición aos valores do elemento %1 non é do tipo elementos: %2.</translation> </message> <message> <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source> - <translation type="unfinished">Non se permite que o elemento %1 teña afiliación a grupo de substitución xa -que -non é un elemento global.</translation> + <translation>Non se permite que o elemento %1 teña afiliación a grupo de substitución xa que non é un elemento global.</translation> </message> <message> <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source> - <translation type="unfinished">O tipo do elemento %1 non pode derivarse do tipo de afiliación ao grupo de -substitución.</translation> + <translation>O tipo do elemento %1 non pode derivarse do tipo de afiliación ao grupo de substitución.</translation> </message> <message> <source>Value constraint of attribute %1 is not of attributes type: %2.</source> - <translation type="unfinished">A restrición aos valores do atributo %1 non é ao tipo do atributo: %2.</translation> + <translation>A restrición aos valores do atributo %1 non é ao tipo do atributo: %2.</translation> </message> <message> <source>Attribute %1 has value constraint but has type derived from %2.</source> - <translation type="unfinished">O atributo %1 ten restrición de valores pero ten tipo derivado de %2.</translation> + <translation>O atributo %1 ten restrición de valores pero ten tipo derivado de %2.</translation> </message> <message> <source>%1 attribute in derived complex type must be %2 like in base type.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 no tipo complexo derivado debe ser %2 como no tipo de base.</translation> </message> <message> <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source> - <translation type="unfinished">O atributo %1 do tipo complexo derivado debe ter unha restrición de valores -%2 -como no tipo de base.</translation> + <translation>O atributo %1 do tipo complexo derivado debe ter unha restrición de valores %2 como no tipo de base.</translation> </message> <message> <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 do tipo complexo derivado debe ter a mesma restrición a valores %2 como no tipo de base.</translation> </message> <message> <source>Attribute %1 in derived complex type must have %2 value constraint.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 no tipo complexo derivado debe ter a restrición a valores %2.</translation> </message> <message> <source>processContent of base wildcard must be weaker than derived wildcard.</source> - <translation type="unfinished"></translation> + <translation>O processContent do comodín de base debe ser máis feble que o do comodín de derivado.</translation> </message> <message> <source>Element %1 exists twice with different types.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 existe dúas veces con tipos diferentes.</translation> </message> <message> <source>Particle contains non-deterministic wildcards.</source> - <translation type="unfinished"></translation> + <translation>A partícula contén caracteres de substitución non deterministas.</translation> </message> <message> <source>Base attribute %1 is required but derived attribute is not.</source> - <translation type="unfinished"></translation> + <translation>Requírese o atributo de base %1 pero non o derivado.</translation> </message> <message> <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source> - <translation type="unfinished"></translation> + <translation>O tipo do atributo derivado %1 non se pode derivar con validez a partir do tipo do atributo de base.</translation> </message> <message> <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source> - <translation type="unfinished"></translation> + <translation>A restrición de valores do atributo derivado %1 non casa coa do atributo de base.</translation> </message> <message> <source>Derived attribute %1 does not exist in the base definition.</source> - <translation type="unfinished"></translation> + <translation>O atributo derivado %1 non existe na definición da base.</translation> </message> <message> <source>Derived attribute %1 does not match the wildcard in the base definition.</source> - <translation type="unfinished"></translation> + <translation>O atributo derivado %1 non casa co carácter de substitución na definición da base.</translation> </message> <message> <source>Base attribute %1 is required but missing in derived definition.</source> - <translation type="unfinished"></translation> + <translation>Requírese o atributo de base %1 pero falta na definición derivada.</translation> </message> <message> <source>Derived definition contains an %1 element that does not exists in the base definition</source> - <translation type="unfinished"></translation> + <translation>A definición derivada contén un elemento %1 que non existe na definición da base</translation> </message> <message> <source>Derived wildcard is not a subset of the base wildcard.</source> - <translation type="unfinished"></translation> + <translation>O carácter de substitución derivado non é un conxunto do de base.</translation> </message> <message> <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source> - <translation type="unfinished"></translation> + <translation>O %1 do comodín derivado non é unha restrición válido do %2 do comodín base</translation> </message> <message> <source>Attribute %1 from base type is missing in derived type.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 do tipo base falta no tipo derivado.</translation> </message> <message> <source>Type of derived attribute %1 differs from type of base attribute.</source> - <translation type="unfinished"></translation> + <translation>O tipo do atributo derivado %1 é diferente do tipo do atributo base.</translation> </message> <message> <source>Base definition contains an %1 element that is missing in the derived definition</source> - <translation type="unfinished"></translation> + <translation>A definición base contén un elemento %1 que falta na definición derivada</translation> </message> <message> <source>Can not process unknown element %1, expected elements are: %2.</source> - <translation type="unfinished"></translation> + <translation>Non se pode procesar o elemento %1, os elementos agardados son: %2.</translation> </message> <message> <source>Element %1 is not allowed in this scope, possible elements are: %2.</source> - <translation type="unfinished">Non se permite o elemento %1 neste ámbito, os elementos posíbeis son: %2.</translation> + <translation>Non se permite o elemento %1 neste ámbito, os elementos posíbeis son: %2.</translation> </message> <message> <source>Child element is missing in that scope, possible child elements are: %1.</source> - <translation type="unfinished"></translation> + <translation>O elemento fillo falta nese ámbito, os posíbeis son: %1.</translation> </message> <message> <source>Document is not a XML schema.</source> - <translation type="unfinished"></translation> + <translation>O documento non é un esquema XML.</translation> </message> <message> <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 do elemento %2 ten contido non válido: {%3} non é un valor do tipo %4.</translation> </message> <message> <source>%1 attribute of %2 element contains invalid content: {%3}.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 do elemento %2 ten contido non válido: {%3}.</translation> </message> <message> <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source> - <translation type="unfinished"></translation> + <translation>O espazo de nomes de destino %1 do esquema incluído é diferente do %2, que se especificou no esquema incluínte.</translation> </message> <message> <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source> - <translation type="unfinished"></translation> + <translation>O espazo de nomes de destino %1 do esquema importado é diferente do %2, que se especificou no esquema importador.</translation> </message> <message> <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source> - <translation type="unfinished"></translation> + <translation>Non se permite que o elemento %1 teña o mesmo valor do atributo %2 que o espazo de nomes de destino %3.</translation> </message> <message> <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source> - <translation type="unfinished"></translation> + <translation>Non se permite un elemento %1 sen o atributo %2 dentro dun esquema sen espazo de nomes de destino.</translation> </message> <message> <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source> - <translation type="unfinished"></translation> + <translation>Non se permite o elemento %1 dentro do elemento %2 se está presente o atributo %3.</translation> </message> <message> <source>%1 element has neither %2 attribute nor %3 child element.</source> - <translation type="unfinished">O elemento %1 non ten nin o atributo %2 nin o elemento fillo %3.</translation> + <translation>O elemento %1 non ten nin o atributo %2 nin o elemento fillo %3.</translation> </message> <message> <source>%1 element with %2 child element must not have a %3 attribute.</source> - <translation type="unfinished"></translation> + <translation>Un elemento %1 cun elemento fillo %2 non pode ter un atributo %3.</translation> </message> <message> <source>%1 attribute of %2 element must be %3 or %4.</source> - <translation type="unfinished">O atributo %1 do elemento %2 debe ser %3 ou %4.</translation> + <translation>O atributo %1 do elemento %2 debe ser %3 ou %4.</translation> </message> <message> <source>%1 attribute of %2 element must have a value of %3.</source> - <translation type="unfinished">O atributo %1 do elemento %2 debe ter un valor de %3.</translation> + <translation>O atributo %1 do elemento %2 debe ter un valor de %3.</translation> </message> <message> <source>%1 attribute of %2 element must have a value of %3 or %4.</source> - <translation type="unfinished">O atributo %1 do elemento %2 debe ter un valor de %3 ou %4.</translation> + <translation>O atributo %1 do elemento %2 debe ter un valor de %3 ou %4.</translation> </message> <message> <source>%1 element must not have %2 and %3 attribute together.</source> - <translation type="unfinished">O elemento %1 non debe ter á vez os atributos %2 e %3.</translation> + <translation>O elemento %1 non debe ter á vez os atributos %2 e %3.</translation> </message> <message> <source>Content of %1 attribute of %2 element must not be from namespace %3.</source> - <translation type="unfinished"></translation> + <translation>O contido do atributo %1 do elemento %2 non debe proceder do espazo de nomes %3.</translation> </message> <message> <source>%1 attribute of %2 element must not be %3.</source> - <translation type="unfinished">O atributo %1 do elemento %2 non debe ser %3.</translation> + <translation>O atributo %1 do elemento %2 non debe ser %3.</translation> </message> <message> <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 do elemento %2 debe ter o mesmo valor %3 porque se indicou o atributo %4.</translation> </message> <message> <source>Specifying use='prohibited' inside an attribute group has no effect.</source> - <translation type="unfinished">Indicar use='prohibited' dentro dun grupo de atributos non ten efecto.</translation> + <translation>Indicar use='prohibited' dentro dun grupo de atributos non ten efecto.</translation> </message> <message> <source>%1 element must have either %2 or %3 attribute.</source> - <translation type="unfinished">O elemento %1 debe ter o do atributo %2 ou o %3.</translation> + <translation>O elemento %1 debe ter o do atributo %2 ou o %3.</translation> </message> <message> <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source> - <translation type="unfinished">O elemento %1 debe ter ou o atributo %2 ou un elemento fillo %3 ou %4.</translation> + <translation>O elemento %1 debe ter ou o atributo %2 ou un elemento fillo %3 ou %4.</translation> </message> <message> <source>%1 element requires either %2 or %3 attribute.</source> - <translation type="unfinished">O elemento %1 require o atributo %2 ou o %3.</translation> + <translation>O elemento %1 require o atributo %2 ou o %3.</translation> </message> <message> <source>Text or entity references not allowed inside %1 element</source> - <translation type="unfinished">Non se permite referencias nin texto nin a entidades dentro dun elemento %1</translation> + <translation>Non se permite referencias nin texto nin a entidades dentro dun elemento %1</translation> </message> <message> <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 do elemento %2 debe conter %3, %4 ou unha listaxe de URI.</translation> </message> <message> <source>%1 element is not allowed in this context.</source> - <translation type="unfinished"></translation> + <translation>Non se permite o elemento %1 neste contexto.</translation> </message> <message> <source>%1 attribute of %2 element has larger value than %3 attribute.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 do elemento %2 ten un valor maior do que o atributo %3.</translation> </message> <message> <source>Prefix of qualified name %1 is not defined.</source> - <translation type="unfinished"></translation> + <translation>Non se definiu o prefixo do nome cualificado %1.</translation> </message> <message> <source>%1 attribute of %2 element must either contain %3 or the other values.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 do elemento %2 debe conter %3 ou os outros valores.</translation> </message> <message> <source>Component with ID %1 has been defined previously.</source> - <translation type="unfinished"></translation> + <translation>Xa se definiu anteriormente unha compoñente co ID %1.</translation> </message> <message> <source>Element %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>Xa se definiu o elemento %1.</translation> </message> <message> <source>Attribute %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>Xa se definiu o atributo %1.</translation> </message> <message> <source>Type %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>Xa se definiu o tipo %1.</translation> </message> <message> <source>Attribute group %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>Xa se definiu o grupo de atributos %1.</translation> </message> <message> <source>Element group %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>Xa se definiu o grupo de elementos %1.</translation> </message> <message> <source>Notation %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>Xa se definiu a notación %1.</translation> </message> <message> <source>Identity constraint %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>Xa se definiu a restrición de identidade %1.</translation> </message> <message> <source>Duplicated facets in simple type %1.</source> - <translation type="unfinished"></translation> + <translation>Hai facetas duplicadas no tipo simple %1.</translation> </message> <message> <source>%1 references unknown %2 or %3 element %4.</source> - <translation type="unfinished"></translation> + <translation>%1 fai referencia a un %4 dun elemento %2 ou %3 descoñecido.</translation> </message> <message> <source>%1 references identity constraint %2 that is no %3 or %4 element.</source> - <translation type="unfinished"></translation> + <translation>%1 fai referencia á restrición de identidade %2 que non é nin un elemento %3 nin %4.</translation> </message> <message> <source>%1 has a different number of fields from the identity constraint %2 that it references.</source> - <translation type="unfinished"></translation> + <translation>%1 ten unha cantidade diferentes de campos que a restrición de identidade %2 á que fai referencia.</translation> </message> <message> <source>Base type %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>O tipo base %1 do elemento %2 non se pode resolver.</translation> </message> <message> <source>Item type %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>O tipo de elemento %1 de %2 non se pode resolver.</translation> </message> <message> <source>Member type %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>O tipo de membro %1 de %2 non se pode resolver.</translation> </message> <message> <source>Type %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>O tipo %1 do elemento %2 non se pode resolver.</translation> </message> <message> <source>Base type %1 of complex type cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>O tipo base %1 do tipo complexo non se pode resolver.</translation> </message> <message> <source>%1 cannot have complex base type that has a %2.</source> - <translation type="unfinished"></translation> + <translation>%1 non pode ter un tipo de base complexo que teña un %2.</translation> </message> <message> <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source> - <translation type="unfinished"></translation> + <translation>O modelo de contido do tipo complexo %1 contén un elemento %2 polo que non se pode derivar por extensión a partir dun tipo non baleiro.</translation> </message> <message> <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source> - <translation type="unfinished"></translation> + <translation>Non se pode derivar o tipo complexo %1 mediante extensión de %2 xa que este contén elementos %3 no seu modelo de contido.</translation> </message> <message> <source>Type of %1 element must be a simple type, %2 is not.</source> - <translation type="unfinished"></translation> + <translation>O tipo do elemento %1 debe ser un tipo simple, e %2 non o é.</translation> </message> <message> <source>Substitution group %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>Non se pode resolver o grupo de substitución %1 do elemento %2.</translation> </message> <message> <source>Substitution group %1 has circular definition.</source> - <translation type="unfinished"></translation> + <translation>O grupo de substitución %1 ten unha definición circular.</translation> </message> <message> <source>Duplicated element names %1 in %2 element.</source> - <translation type="unfinished"></translation> + <translation>Hai nomes de elementos %1 duplicados no elemento %2.</translation> </message> <message> <source>Reference %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>A referencia %1 do elemento %2 non se pode resolver.</translation> </message> <message> <source>Circular group reference for %1.</source> - <translation type="unfinished"></translation> + <translation>Grupo de referencias circulares para %1.</translation> </message> <message> <source>%1 element is not allowed in this scope</source> - <translation type="unfinished"></translation> + <translation>Non se permite o elemento %1 neste ámbito</translation> </message> <message> <source>%1 element cannot have %2 attribute with value other than %3.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 non pode ter o atributo %2 cun valor diferente de %3.</translation> </message> <message> <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 non pode ter o atributo %2 cun valor diferente de %3 ou de %4.</translation> </message> <message> <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source> - <translation type="unfinished"></translation> + <translation>Nin atributo %1 nin o %2 da referencia %2 casan coa declaración do atributo %3.</translation> </message> <message> <source>Attribute group %1 has circular reference.</source> - <translation type="unfinished"></translation> + <translation>O grupo de atributo %1 ten unha referencia circular.</translation> </message> <message> <source>%1 attribute in %2 must have %3 use like in base type %4.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 en %2 debe ter un uso de %3 como no tipo base %4.</translation> </message> <message> <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source> - <translation type="unfinished"></translation> + <translation>O carácter de substitución de atributo de %1 non é unha restrición válida de carácter de substitución de atributo do tipo de base %2.</translation> </message> <message> <source>%1 has attribute wildcard but its base type %2 has not.</source> - <translation type="unfinished"></translation> + <translation>%1 ten un carácter de substitución de atributo pero o seu tipo de base %2 non o ten.</translation> </message> <message> <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source> - <translation type="unfinished"></translation> + <translation>A unión do carácter de substitución de atributo do tipo %1 e o do seu tipo de base %2 é inexpresábel.</translation> </message> <message> <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source> - <translation type="unfinished"></translation> + <translation>A faceta de enumeración ten contido non válido: {%1} non é un valor do tipo %2.</translation> </message> <message> <source>Namespace prefix of qualified name %1 is not defined.</source> - <translation type="unfinished"></translation> + <translation>Non está á definido o prefixo do espazo de nomes do nome cualificado %1.</translation> </message> <message> <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 %2 non é unha restrición válida do elemento %3 que redefine: %4.</translation> </message> <message> <source>%1 is not valid according to %2.</source> - <translation type="unfinished">%1 non é válido segundo %2.</translation> + <translation>%1 non é válido segundo %2.</translation> </message> <message> <source>String content does not match the length facet.</source> - <translation type="unfinished">O contido da cadea non coincide coa faceta «length».</translation> + <translation>O contido da cadea non coincide coa faceta «length».</translation> </message> <message> <source>String content does not match the minLength facet.</source> - <translation type="unfinished">O contido da cadea non coincide coa faceta «minLength».</translation> + <translation>O contido da cadea non coincide coa faceta «minLength».</translation> </message> <message> <source>String content does not match the maxLength facet.</source> - <translation type="unfinished">O contido da cadea non coincide coa faceta «maxLength».</translation> + <translation>O contido da cadea non coincide coa faceta «maxLength».</translation> </message> <message> <source>String content does not match pattern facet.</source> - <translation type="unfinished">O contido da cadea non coincide coa faceta «pattern».</translation> + <translation>O contido da cadea non coincide coa faceta «pattern».</translation> </message> <message> <source>String content is not listed in the enumeration facet.</source> - <translation type="unfinished">O contido da cadea non está enumerado na enumeración de facetas.</translation> + <translation>O contido da cadea non está enumerado na enumeración de facetas.</translation> </message> <message> <source>Signed integer content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro con signo non casa coa faceta maxInclusive.</translation> </message> <message> <source>Signed integer content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro con signo non casa coa faceta maxExclusive.</translation> </message> <message> <source>Signed integer content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro con signo non casa coa faceta minInclusive.</translation> </message> <message> <source>Signed integer content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro con signo non casa coa faceta minExclusive.</translation> </message> <message> <source>Signed integer content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro con signo non está na faceta de enumeración.</translation> </message> <message> <source>Signed integer content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro con signo non casa coa faceta padrón.</translation> </message> <message> <source>Signed integer content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro con signo non casa coa faceta totalDigits.</translation> </message> <message> <source>Unsigned integer content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro sen signo non casa coa faceta maxInclusive.</translation> </message> <message> <source>Unsigned integer content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro sen signo non casa coa faceta maxExclusive.</translation> </message> <message> <source>Unsigned integer content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro sen signo non casa coa faceta minInclusive.</translation> </message> <message> <source>Unsigned integer content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro sen signo non casa coa faceta minExclusive.</translation> </message> <message> <source>Unsigned integer content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro sen signo non está na faceta de enumeración.</translation> </message> <message> <source>Unsigned integer content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro sen signo non casa coa faceta padrón.</translation> </message> <message> <source>Unsigned integer content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número enteiro sen signo non casa coa faceta totalDigits.</translation> </message> <message> <source>Double content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número de lonxitude dupla non casa coa faceta maxInclusive.</translation> </message> <message> <source>Double content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número de lonxitude dupla non casa coa faceta maxExclusive.</translation> </message> <message> <source>Double content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número de lonxitude dupla non casa coa faceta minInclusive.</translation> </message> <message> <source>Double content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número de lonxitude dupla non casa coa faceta minExclusive.</translation> </message> <message> <source>Double content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número de lonxitude dupla non está na faceta de enumeración.</translation> </message> <message> <source>Double content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número de lonxitude dupla non casa coa faceta padrón.</translation> </message> <message> <source>Decimal content does not match in the fractionDigits facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número decimal non casa coa faceta fractionDigits.</translation> </message> <message> <source>Decimal content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do número decimal non casa coa faceta totalDigits.</translation> </message> <message> <source>Date time content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da data e hora non casa coa faceta maxInclusive.</translation> </message> <message> <source>Date time content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da data e hora non casa coa faceta maxExclusive.</translation> </message> <message> <source>Date time content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da data e hora non casa coa faceta minInclusive.</translation> </message> <message> <source>Date time content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da data e hora non casa coa faceta minExclusive.</translation> </message> <message> <source>Date time content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da data e hora non está na faceta de enumeración.</translation> </message> <message> <source>Date time content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da data e hora non casa coa faceta padrón.</translation> </message> <message> <source>Duration content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da duración non casa coa faceta maxInclusive.</translation> </message> <message> <source>Duration content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da duración non casa coa faceta maxExclusive.</translation> </message> <message> <source>Duration content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da duración non casa coa faceta minInclusive.</translation> </message> <message> <source>Duration content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da duración non casa coa faceta minExclusive.</translation> </message> <message> <source>Duration content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da duración non está na faceta de enumeración.</translation> </message> <message> <source>Duration content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da duración non casa coa faceta padrón.</translation> </message> <message> <source>Boolean content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido booleano non casa coa faceta padrón.</translation> </message> <message> <source>Binary content does not match the length facet.</source> - <translation type="unfinished"></translation> + <translation>O contido binario coa faceta «length».</translation> </message> <message> <source>Binary content does not match the minLength facet.</source> - <translation type="unfinished"></translation> + <translation>O contido binario coa faceta «minLength».</translation> </message> <message> <source>Binary content does not match the maxLength facet.</source> - <translation type="unfinished"></translation> + <translation>O contido binario coa faceta «maxLength».</translation> </message> <message> <source>Binary content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido binario non está na faceta de enumeración.</translation> </message> <message> <source>Invalid QName content: %1.</source> - <translation type="unfinished"></translation> + <translation>Contido non válido do QName: %1</translation> </message> <message> <source>QName content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do QName non está na faceta de enumeración.</translation> </message> <message> <source>QName content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido do QName non casa coa faceta padrón.</translation> </message> <message> <source>Notation content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da notación non está na faceta de enumeración</translation> </message> <message> <source>List content does not match length facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da lista non coincide coa faceta «length».</translation> </message> <message> <source>List content does not match minLength facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da lista non coincide coa faceta «minLength».</translation> </message> <message> <source>List content does not match maxLength facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da lista non coincide coa faceta «maxLength».</translation> </message> <message> <source>List content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da lista non está na faceta de enumeración.</translation> </message> <message> <source>List content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da lista non casa coa faceta padrón.</translation> </message> <message> <source>Union content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da unión non está na faceta de enumeración.</translation> </message> <message> <source>Union content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>O contido da unión non casa coa faceta padrón.</translation> </message> <message> <source>Data of type %1 are not allowed to be empty.</source> - <translation type="unfinished"></translation> + <translation>Non se permite que os datos do tipo %1 esteas baleiros.</translation> </message> <message> <source>Element %1 is missing child element.</source> - <translation type="unfinished"></translation> + <translation>Ao elemento %1 fáltalle un elemento fillo.</translation> </message> <message> <source>There is one IDREF value with no corresponding ID: %1.</source> - <translation type="unfinished"></translation> + <translation>Hai un valor IDREF sen o ID correspondente: %1.</translation> </message> <message> <source>Loaded schema file is invalid.</source> - <translation type="unfinished"></translation> + <translation>O ficheiro de esquema que se cargou non é válido.</translation> </message> <message> <source>%1 contains invalid data.</source> - <translation type="unfinished"></translation> + <translation>%1 contén datos non válidos.</translation> </message> <message> <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source> - <translation type="unfinished"></translation> + <translation>O espazo de nomes %1 de xsi:schemaLocation xa apareceu antes no documento de instancia.</translation> </message> <message> <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source> - <translation type="unfinished"></translation> + <translation>xsi:noNamespaceSchemaLocation non pode aparecer despois do primeiro elemento ou atributo que non sexa un espazo de nomes.</translation> </message> <message> <source>No schema defined for validation.</source> - <translation type="unfinished"></translation> + <translation>Non se definiu ningún esquema para a validación.</translation> </message> <message> <source>No definition for element %1 available.</source> - <translation type="unfinished"></translation> + <translation>Non hai dispoñíbel ningunha definición do elemento %1.</translation> </message> <message> <source>Specified type %1 is not known to the schema.</source> - <translation type="unfinished"></translation> + <translation>O tipo especificado %1 non se coñece neste esquema.</translation> </message> <message> <source>Element %1 is not defined in this scope.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 non está definido neste ámbito.</translation> </message> <message> <source>Declaration for element %1 does not exist.</source> - <translation type="unfinished"></translation> + <translation>Non existe a declaración do elemento %1.</translation> </message> <message> <source>Element %1 contains invalid content.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 ten contido non válido.</translation> </message> <message> <source>Element %1 is declared as abstract.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 declarouse como abstracto.</translation> </message> <message> <source>Element %1 is not nillable.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 non é anulábel.</translation> </message> <message> <source>Attribute %1 contains invalid data: %2</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 contén datos non válidos: %2</translation> </message> <message> <source>Element contains content although it is nillable.</source> - <translation type="unfinished"></translation> + <translation>O elemento ten contido a pesar de ser anulábel.</translation> </message> <message> <source>Fixed value constraint not allowed if element is nillable.</source> - <translation type="unfinished"></translation> + <translation>Non se permite a restrición de valor fixo se o elemento é anulábel.</translation> </message> <message> <source>Specified type %1 is not validly substitutable with element type %2.</source> - <translation type="unfinished"></translation> + <translation>O tipo especificado %1 non se pode substituír dun xeito válido por elementos do tipo %2.</translation> </message> <message> <source>Complex type %1 is not allowed to be abstract.</source> - <translation type="unfinished"></translation> + <translation>Non se permite que o tipo complexo %1 sexa abstracto.</translation> </message> <message> <source>Element %1 contains not allowed attributes.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 contén atributos non permitidos.</translation> </message> <message> <source>Element %1 contains not allowed child element.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 contén un elemento fillo non permitido.</translation> </message> <message> <source>Content of element %1 does not match its type definition: %2.</source> - <translation type="unfinished"></translation> + <translation>O contido do elemento %1 non casa coa definición do tipo: %2.</translation> </message> <message> <source>Content of element %1 does not match defined value constraint.</source> - <translation type="unfinished"></translation> + <translation>O contido do elemento %1 non casa coa restrición de valores definida.</translation> </message> <message> <source>Element %1 contains not allowed child content.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 ten contido fillo non permitido.</translation> </message> <message> <source>Element %1 contains not allowed text content.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 ten contido de texto non permitido.</translation> </message> <message> <source>Element %1 cannot contain other elements, as it has a fixed content.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 non pode conter outros elementos xa que ten un contido fixo.</translation> </message> <message> <source>Element %1 is missing required attribute %2.</source> - <translation type="unfinished"></translation> + <translation>Ao elemento %1 fáltalle o atributo requirido %2.</translation> </message> <message> <source>Attribute %1 does not match the attribute wildcard.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 non casa co carácter de substitución do atributo.</translation> </message> <message> <source>Declaration for attribute %1 does not exist.</source> - <translation type="unfinished"></translation> + <translation>Non existe a declaración do atributo %1.</translation> </message> <message> <source>Element %1 contains two attributes of type %2.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 contén dous atributos do tipo %2.</translation> </message> <message> <source>Attribute %1 contains invalid content.</source> - <translation type="unfinished"></translation> + <translation>O atributo %1 ten contido non válido.</translation> </message> <message> <source>Element %1 contains unknown attribute %2.</source> - <translation type="unfinished"></translation> + <translation>O elemento %1 contén o atributo descoñecido %2.</translation> </message> <message> <source>Content of attribute %1 does not match its type definition: %2.</source> - <translation type="unfinished"></translation> + <translation>O contido do atributo %1 non casa coa definición do tipo: %2.</translation> </message> <message> <source>Content of attribute %1 does not match defined value constraint.</source> - <translation type="unfinished"></translation> + <translation>O contido do atributo %1 non casa coa restrición de valores definida.</translation> </message> <message> <source>Non-unique value found for constraint %1.</source> - <translation type="unfinished"></translation> + <translation>Atopouse un valor non único para a restrición %1.</translation> </message> <message> <source>Key constraint %1 contains absent fields.</source> - <translation type="unfinished"></translation> + <translation>A restrición de chave %1 contén campos ausentes.</translation> </message> <message> <source>Key constraint %1 contains references nillable element %2.</source> - <translation type="unfinished"></translation> + <translation>A restrición de chave %1 contén referencias ao elemento anulábel %2.</translation> </message> <message> <source>No referenced value found for key reference %1.</source> - <translation type="unfinished"></translation> + <translation>Non se atopou ningún valor referenciado para a referencia de chave %1.</translation> </message> <message> <source>More than one value found for field %1.</source> - <translation type="unfinished">Atopouse máis dun valor para o campo %1.</translation> + <translation>Atopouse máis dun valor para o campo %1.</translation> </message> <message> <source>Field %1 has no simple type.</source> - <translation type="unfinished">O campo %1 non ten un tipo simple.</translation> + <translation>O campo %1 non ten un tipo simple.</translation> </message> <message> <source>ID value '%1' is not unique.</source> - <translation type="unfinished">O valor do ID «%1» non é único.</translation> + <translation>O valor do ID «%1» non é único.</translation> </message> <message> <source>'%1' attribute contains invalid QName content: %2.</source> - <translation type="unfinished">O atributo «%1» contén contido non válido para un QName: %2.</translation> + <translation>O atributo «%1» contén contido non válido para un QName: %2.</translation> </message> <message> <source>empty</source> - <translation type="unfinished">baleiro</translation> + <translation>baleiro</translation> </message> <message> <source>zero or one</source> - <translation type="unfinished">cero ou un</translation> + <translation>cero ou un</translation> </message> <message> <source>exactly one</source> - <translation type="unfinished">exactamente un</translation> + <translation>exactamente un</translation> </message> <message> <source>one or more</source> - <translation type="unfinished">un ou máis</translation> + <translation>un ou máis</translation> </message> <message> <source>zero or more</source> - <translation type="unfinished">cero ou máis</translation> + <translation>cero ou máis</translation> </message> <message> <source>Required type is %1, but %2 was found.</source> - <translation type="unfinished">O tipo requirido é %1, pero atopouse %2.</translation> + <translation>O tipo requirido é %1, pero atopouse %2.</translation> </message> <message> <source>Promoting %1 to %2 may cause loss of precision.</source> - <translation type="unfinished">Converter de %1 a %2 pode causar perda de precisión.</translation> + <translation>Converter de %1 a %2 pode causar perda de precisión.</translation> </message> <message> <source>The focus is undefined.</source> - <translation type="unfinished">O foco non está definido.</translation> + <translation>O foco non está definido.</translation> </message> <message> <source>It's not possible to add attributes after any other kind of node.</source> - <translation type="unfinished">Non é posíbel engadir atributos tras calquera outro tipo de nodo.</translation> + <translation>Non é posíbel engadir atributos tras calquera outro tipo de nodo.</translation> </message> <message> <source>An attribute by name %1 has already been created.</source> - <translation type="unfinished">Xa se creou un atributo co nome %1.</translation> + <translation>Xa se creou un atributo co nome %1.</translation> </message> <message> <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> - <translation type="unfinished"></translation> + <translation>Só está soportado o Unicode Codepoint Collation (%1). %2 non se admite.</translation> </message> </context> </TS> diff --git a/translations/qt_help_gl.ts b/translations/qt_help_gl.ts new file mode 100644 index 0000000..a3da29a --- /dev/null +++ b/translations/qt_help_gl.ts @@ -0,0 +1,320 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="gl_ES" sourcelanguage="en"> +<context> + <name>QCLuceneResultWidget</name> + <message> + <source>Search Results</source> + <translation>Resultados da procura</translation> + </message> + <message> + <source>Note:</source> + <translation>Nota:</translation> + </message> + <message> + <source>The search results may not be complete since the documentation is still being indexed!</source> + <translation>Poida que os resultados da procura non sexan completos porque a documentación +aínda se está a indexar!</translation> + </message> + <message> + <source>Your search did not match any documents.</source> + <translation>A procura non atopou documento ningún.</translation> + </message> + <message> + <source>(The reason for this might be that the documentation is still being indexed.)</source> + <translation>(A razón disto pode ser que a documentación aínda estea a indexarse.)</translation> + </message> +</context> +<context> + <name>QHelp</name> + <message> + <source>Untitled</source> + <translation>Sen título</translation> + </message> +</context> +<context> + <name>QHelpCollectionHandler</name> + <message> + <source>The collection file '%1' is not set up yet!</source> + <translation>O ficheiro de colección «%1» aínda non está configurado!</translation> + </message> + <message> + <source>Cannot load sqlite database driver!</source> + <translation>Non se pode cargar o controlador da base de datos sqlite!</translation> + </message> + <message> + <source>Cannot open collection file: %1</source> + <translation>Non foi posíbel abrir o ficheiro de colección: %1</translation> + </message> + <message> + <source>Cannot create tables in file %1!</source> + <translation>Non foi posíbel crear as táboas no ficheiro %1!</translation> + </message> + <message> + <source>The collection file '%1' already exists!</source> + <translation>O ficheiro de colección «%1» xa existe!</translation> + </message> + <message> + <source>Cannot create directory: %1</source> + <translation>Non foi posíbel crear o directorio: %1</translation> + </message> + <message> + <source>Cannot copy collection file: %1</source> + <translation>Non foi posíbel copiar o ficheiro de colección: %1</translation> + </message> + <message> + <source>Unknown filter '%1'!</source> + <translation>Non se coñece o filtro «%1»!</translation> + </message> + <message> + <source>Cannot register filter %1!</source> + <translation>Non foi posíbel rexistrar o filtro %1!</translation> + </message> + <message> + <source>Cannot open documentation file %1!</source> + <translation>Non foi posíbel abrir o ficheiro de documentación %1!</translation> + </message> + <message> + <source>Invalid documentation file '%1'!</source> + <translation>O ficheiro de documentación «%1» non é válido!</translation> + </message> + <message> + <source>The namespace %1 was not registered!</source> + <translation>O espazo de nomes %1 non estaba rexistrado!</translation> + </message> + <message> + <source>Namespace %1 already exists!</source> + <translation>O espazo de nomes %1 xa existe!</translation> + </message> + <message> + <source>Cannot register namespace '%1'!</source> + <translation>Non foi posíbel rexistrar o espazo de nomes «%1»!</translation> + </message> + <message> + <source>Cannot open database '%1' to optimize!</source> + <translation>Non foi posíbel abrir a base de datos «%1» para optimizala!</translation> + </message> +</context> +<context> + <name>QHelpDBReader</name> + <message> + <source>Cannot open database '%1' '%2': %3</source> + <extracomment>The placeholders are: %1 - The name of the database which cannot be opened %2 - The unique id for the connection %3 - The actual error string</extracomment> + <translation>Non foi posíbel abrir a base de datos «%1» «%2»: %3</translation> + </message> +</context> +<context> + <name>QHelpEngineCore</name> + <message> + <source>Cannot open documentation file %1: %2!</source> + <translation>Non foi posíbel abrir o ficheiro de documentación %1: %2!</translation> + </message> + <message> + <source>The specified namespace does not exist!</source> + <translation>O espazo de nomes especificado non existe!</translation> + </message> +</context> +<context> + <name>QHelpGenerator</name> + <message> + <source>Invalid help data!</source> + <translation>Datos de axuda non válidos!</translation> + </message> + <message> + <source>No output file name specified!</source> + <translation>Non se indicou ningún nome para o ficheiro de saída!</translation> + </message> + <message> + <source>The file %1 cannot be overwritten!</source> + <translation>O ficheiro %1 non pode sobrescribirse!</translation> + </message> + <message> + <source>Building up file structure...</source> + <translation>A construír a estrutura do ficheiro...</translation> + </message> + <message> + <source>Cannot open data base file %1!</source> + <translation>Non foi posíbel abrir o ficheiro de base de datos %1!</translation> + </message> + <message> + <source>Cannot register namespace %1!</source> + <translation>Non foi posíbel rexistrar o espazo de nomes %1!</translation> + </message> + <message> + <source>Insert custom filters...</source> + <translation>Inserir filtros personalizados...</translation> + </message> + <message> + <source>Insert help data for filter section (%1 of %2)...</source> + <translation>Inserir datos de axuda para a sección de filtro (%1 de %2)...</translation> + </message> + <message> + <source>Documentation successfully generated.</source> + <translation>A documentación xerouse correctamente.</translation> + </message> + <message> + <source>Some tables already exist!</source> + <translation>Algunhas táboas xa existen!</translation> + </message> + <message> + <source>Cannot create tables!</source> + <translation>Non foi posíbel crear as táboas!</translation> + </message> + <message> + <source>Cannot register virtual folder!</source> + <translation>Non foi posíbel rexistrar o cartafol virtual!</translation> + </message> + <message> + <source>Insert files...</source> + <translation>Inserir ficheiros...</translation> + </message> + <message> + <source>The referenced file %1 must be inside or within a subdirectory of (%2). Skipping it.</source> + <translation>O ficheiro referenciado %1 debe estar en ou nun subdirectorio de (%2). Omitirase.</translation> + </message> + <message> + <source>The file %1 does not exist! Skipping it.</source> + <translation>O ficheiro %1 non existe! Omitirase.</translation> + </message> + <message> + <source>Cannot open file %1! Skipping it.</source> + <translation>Non foi posíbel abrir o ficheiro %1! Omitirase.</translation> + </message> + <message> + <source>The filter %1 is already registered!</source> + <translation>O filtro %1 xa está rexistrado!</translation> + </message> + <message> + <source>Cannot register filter %1!</source> + <translation>Non foi posíbel rexistrar o filtro %1!</translation> + </message> + <message> + <source>Insert indices...</source> + <translation>Inserir índices...</translation> + </message> + <message> + <source>Insert contents...</source> + <translation>Inserir contido...</translation> + </message> + <message> + <source>Cannot insert contents!</source> + <translation>Non foi posíbel inserir contido!</translation> + </message> + <message> + <source>Cannot register contents!</source> + <translation>Non foi posíbel rexistrar contido!</translation> + </message> + <message> + <source>File '%1' does not exist.</source> + <translation>O ficheiro «%1» non existe.</translation> + </message> + <message> + <source>File '%1' cannot be opened.</source> + <translation>Non foi posíbel abrir o ficheiro «%1».</translation> + </message> + <message> + <source>File '%1' contains an invalid link to file '%2'</source> + <translation>O ficheiro «%1» contén unha ligazón non válida ao ficheiro «%2»</translation> + </message> + <message> + <source>Invalid links in HTML files.</source> + <translation>Hai ligazóns non válidas en ficheiros HTML.</translation> + </message> +</context> +<context> + <name>QHelpProject</name> + <message> + <source>Unknown token.</source> + <translation>Token descoñecido.</translation> + </message> + <message> + <source>Unknown token. Expected "QtHelpProject"!</source> + <translation>Token descoñecido. Agardábase «QtHelpProject»!</translation> + </message> + <message> + <source>Error in line %1: %2</source> + <translation>Erro na liña %1: %2</translation> + </message> + <message> + <source>Virtual folder has invalid syntax.</source> + <translation>O cartafol virtual ten unha sintaxe non válida.</translation> + </message> + <message> + <source>Namespace has invalid syntax.</source> + <translation>O espazo de nomes ten unha sintaxe non válida.</translation> + </message> + <message> + <source>Missing namespace in QtHelpProject.</source> + <translation>Falta o espazo de nome no QtHelpProject.</translation> + </message> + <message> + <source>Missing virtual folder in QtHelpProject</source> + <translation>Falta o cartafol virtural no QtHelpProject</translation> + </message> + <message> + <source>Missing attribute in keyword at line %1.</source> + <translation>Falta un atributo nunha palabra chave na liña %1.</translation> + </message> + <message> + <source>The input file %1 could not be opened!</source> + <translation>Non foi posíbel abrir o ficheiro de entrada %1!</translation> + </message> +</context> +<context> + <name>QHelpSearchQueryWidget</name> + <message> + <source>Search for:</source> + <translation>Procurar:</translation> + </message> + <message> + <source>Previous search</source> + <translation>Anterior procura</translation> + </message> + <message> + <source>Next search</source> + <translation>Seguinte procura</translation> + </message> + <message> + <source>Search</source> + <translation>Procurar</translation> + </message> + <message> + <source>Advanced search</source> + <translation>Procura avanzada</translation> + </message> + <message> + <source>words <B>similar</B> to:</source> + <translation>palabras <B>semellantes</B> a:</translation> + </message> + <message> + <source><B>without</B> the words:</source> + <translation><B>sen</B> as palabras:</translation> + </message> + <message> + <source>with <B>exact phrase</B>:</source> + <translation>coa <B>frase exacta</B>:</translation> + </message> + <message> + <source>with <B>all</B> of the words:</source> + <translation>con <B>todas</B> as palabras:</translation> + </message> + <message> + <source>with <B>at least one</B> of the words:</source> + <translation>con <B>polo menos unha</B> das palabras:</translation> + </message> +</context> +<context> + <name>QHelpSearchResultWidget</name> + <message numerus="yes"> + <source>%1 - %2 of %n Hits</source> + <translation> + <numerusform>%1 - %2 de %n coincidencia</numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <source>0 - 0 of 0 Hits</source> + <translation>0 - 0 de 0 coincidencias</translation> + </message> +</context> +</TS> -- cgit v0.12 From d7212b3b8b804c3621b0c39e9f07afecc5b39a4d Mon Sep 17 00:00:00 2001 From: Olivier Goffart <olivier.goffart@nokia.com> Date: Mon, 17 Jan 2011 16:32:03 +0100 Subject: Revert "Add a warning about trying to release a timer ID that isn't active" This reverts commit e1955231478df8990cf8b1f80438abf957c5d6f2. Revert it in Qt 4.7 because the warning is triggered a lot by Qt itself They are going to be fixed in master. Reviewed-by: Thierry Task-number: QTBUG-16175 --- src/corelib/kernel/qeventdispatcher_unix.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp index 14e8991..050805f 100644 --- a/src/corelib/kernel/qeventdispatcher_unix.cpp +++ b/src/corelib/kernel/qeventdispatcher_unix.cpp @@ -501,7 +501,6 @@ bool QTimerInfoList::unregisterTimer(int timerId) } } // id not found - qWarning("Application asked to unregister timer 0x%x which is not registered in this thread. Fix application.", timerId); return false; } -- cgit v0.12 From 4d570be67303f5b80ed0377ac7307afd8bc18643 Mon Sep 17 00:00:00 2001 From: Bernhard Rosenkraenzer <br@blankpage.ch> Date: Mon, 17 Jan 2011 16:32:39 +0100 Subject: Make qvfb compile (and work) with libpng 1.5 In libpng >= 1.5.0, the png_info struct is no longer exported Merge-request: 1023 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- tools/qvfb/qanimationwriter.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/qvfb/qanimationwriter.cpp b/tools/qvfb/qanimationwriter.cpp index 74a7b5f..c91a916 100644 --- a/tools/qvfb/qanimationwriter.cpp +++ b/tools/qvfb/qanimationwriter.cpp @@ -112,9 +112,11 @@ public: void writePNG(const QImage& image) { -#ifndef QT_LINUXBASE +#if !defined(QT_LINUXBASE) && \ + (PNG_LIBPNG_VER_MAJOR < 1 || (PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR <= 4)) // LSB disallows accessing the info_ptr directly. LSB's png_set_IHDR sets - // the channels anyways, so just comment it out for LSB usage + // the channels anyways, so just comment it out for LSB usage. + // In libpng >= 1.5, the png_info struct is no longer exported. info_ptr->channels = 4; #endif png_set_sig_bytes(png_ptr, 8); // Pretend we already wrote the sig -- cgit v0.12 From f111e97adf93a933351eb5658b33a5820097757a Mon Sep 17 00:00:00 2001 From: Martin Jones <martin.jones@nokia.com> Date: Tue, 18 Jan 2011 10:59:34 +1000 Subject: Request font sizes with only 0.5pt resolution. When animating pointSize avoid generating a huge number of fonts with slightly different point sizes. Task-number: QTBUG-13960 Reviewed-by: Aaron Kennedy --- src/declarative/graphicsitems/qdeclarativetext.cpp | 17 ++++++++++--- .../graphicsitems/qdeclarativetext_p_p.h | 1 + .../graphicsitems/qdeclarativetextedit.cpp | 29 ++++++++++++++++------ .../graphicsitems/qdeclarativetextedit_p_p.h | 1 + .../graphicsitems/qdeclarativetextinput.cpp | 25 +++++++++++++------ .../graphicsitems/qdeclarativetextinput_p_p.h | 1 + 6 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp index 2f3c8e5..640965c 100644 --- a/src/declarative/graphicsitems/qdeclarativetext.cpp +++ b/src/declarative/graphicsitems/qdeclarativetext.cpp @@ -736,19 +736,28 @@ QDeclarativeText::~QDeclarativeText() QFont QDeclarativeText::font() const { Q_D(const QDeclarativeText); - return d->font; + return d->sourceFont; } void QDeclarativeText::setFont(const QFont &font) { Q_D(QDeclarativeText); - if (d->font == font) + if (d->sourceFont == font) return; + d->sourceFont = font; + QFont oldFont = d->font; d->font = font; - d->updateLayout(); + if (d->font.pointSizeF() != -1) { + // 0.5pt resolution + qreal size = qRound(d->font.pointSizeF()*2.0); + d->font.setPointSizeF(size/2.0); + } + + if (oldFont != d->font) + d->updateLayout(); - emit fontChanged(d->font); + emit fontChanged(d->sourceFont); } /*! diff --git a/src/declarative/graphicsitems/qdeclarativetext_p_p.h b/src/declarative/graphicsitems/qdeclarativetext_p_p.h index 67f2289..e749bc9 100644 --- a/src/declarative/graphicsitems/qdeclarativetext_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativetext_p_p.h @@ -79,6 +79,7 @@ public: QString text; QFont font; + QFont sourceFont; QColor color; QDeclarativeText::TextStyle style; QColor styleColor; diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp index 675f8d9..42f66c3 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp @@ -326,22 +326,35 @@ void QDeclarativeTextEdit::setTextFormat(TextFormat format) QFont QDeclarativeTextEdit::font() const { Q_D(const QDeclarativeTextEdit); - return d->font; + return d->sourceFont; } void QDeclarativeTextEdit::setFont(const QFont &font) { Q_D(QDeclarativeTextEdit); + if (d->sourceFont == font) + return; + + d->sourceFont = font; + QFont oldFont = d->font; d->font = font; + if (d->font.pointSizeF() != -1) { + // 0.5pt resolution + qreal size = qRound(d->font.pointSizeF()*2.0); + d->font.setPointSizeF(size/2.0); + } - clearCache(); - d->document->setDefaultFont(d->font); - if(d->cursor){ - d->cursor->setHeight(QFontMetrics(d->font).height()); - moveCursorDelegate(); + if (oldFont != d->font) { + clearCache(); + d->document->setDefaultFont(d->font); + if(d->cursor){ + d->cursor->setHeight(QFontMetrics(d->font).height()); + moveCursorDelegate(); + } + updateSize(); + update(); } - updateSize(); - update(); + emit fontChanged(d->sourceFont); } /*! diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h index 68a9cc8..3a45541 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h @@ -92,6 +92,7 @@ public: QString text; QFont font; + QFont sourceFont; QColor color; QColor selectionColor; QColor selectedTextColor; diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp index 57a2177..ef3404f 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp @@ -213,24 +213,33 @@ void QDeclarativeTextInput::setText(const QString &s) QFont QDeclarativeTextInput::font() const { Q_D(const QDeclarativeTextInput); - return d->font; + return d->sourceFont; } void QDeclarativeTextInput::setFont(const QFont &font) { Q_D(QDeclarativeTextInput); - if (d->font == font) + if (d->sourceFont == font) return; + d->sourceFont = font; + QFont oldFont = d->font; d->font = font; + if (d->font.pointSizeF() != -1) { + // 0.5pt resolution + qreal size = qRound(d->font.pointSizeF()*2.0); + d->font.setPointSizeF(size/2.0); + } - d->control->setFont(d->font); - if(d->cursorItem){ - d->cursorItem->setHeight(QFontMetrics(d->font).height()); - moveCursor(); + if (oldFont != d->font) { + d->control->setFont(d->font); + if(d->cursorItem){ + d->cursorItem->setHeight(QFontMetrics(d->font).height()); + moveCursor(); + } + updateSize(); } - updateSize(); - emit fontChanged(d->font); + emit fontChanged(d->sourceFont); } /*! diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h index 18e9c81..16827b3 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h @@ -107,6 +107,7 @@ public: QLineControl* control; QFont font; + QFont sourceFont; QColor color; QColor selectionColor; QColor selectedTextColor; -- cgit v0.12 From d5b5a1ef99dbe20ee9cb3833fb5095c2071c8b12 Mon Sep 17 00:00:00 2001 From: Rohan McGovern <rohan.mcgovern@nokia.com> Date: Tue, 18 Jan 2011 11:38:55 +1000 Subject: tst_qhttp: replace legacy qt-test-server hostname in testdata. --- tests/auto/qhttp/tst_qhttp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/qhttp/tst_qhttp.cpp b/tests/auto/qhttp/tst_qhttp.cpp index f706228..61123c2 100644 --- a/tests/auto/qhttp/tst_qhttp.cpp +++ b/tests/auto/qhttp/tst_qhttp.cpp @@ -856,7 +856,7 @@ void tst_QHttp::proxy2() QTestEventLoop::instance().enterLoop(30); QVERIFY(!QTestEventLoop::instance().timeout()); - QCOMPARE(readyRead_ba.count("Welcome to fluke.troll.no"), 2); + QCOMPARE(readyRead_ba.count("Welcome to qt-test-server"), 2); readyRead_ba.clear(); } @@ -891,7 +891,7 @@ void tst_QHttp::proxy3() QTestEventLoop::instance().enterLoop(30); QVERIFY(!QTestEventLoop::instance().timeout()); - QCOMPARE(readyRead_ba.count("Welcome to fluke.troll.no"), 2); + QCOMPARE(readyRead_ba.count("Welcome to qt-test-server"), 2); readyRead_ba.clear(); } -- cgit v0.12 From c756d5cffdc31228b9ab9388c307bf4eb705b923 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Tue, 18 Jan 2011 11:44:29 +0200 Subject: Remove toolcheck from generic clean targets for symbian-sbsv2 Toolcheck can cause generic clean fail (i.e. "make clean" or "make debug-clean") for e.g. environments where Carbide command line tools have not been installed, because sbsv2 toolchain does a check for all tools related to target platforms, even though they are not needed for actual cleaning. Task-number: QTBUG-16691 Reviewed-by: Janne Koskinen --- qmake/generators/symbian/symmake_sbsv2.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp index f6f2e78..47c5b31 100644 --- a/qmake/generators/symbian/symmake_sbsv2.cpp +++ b/qmake/generators/symbian/symmake_sbsv2.cpp @@ -386,7 +386,7 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo } t << endl; t << "clean-debug: " << BLD_INF_FILENAME << endl; - t << "\t$(SBS) reallyclean"; + t << "\t$(SBS) reallyclean --toolcheck=off"; foreach(QString clause, debugClauses) { t << clause; } @@ -406,7 +406,7 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo } t << endl; t << "clean-release: " << BLD_INF_FILENAME << endl; - t << "\t$(SBS) reallyclean"; + t << "\t$(SBS) reallyclean --toolcheck=off"; foreach(QString clause, releaseClauses) { t << clause; } @@ -516,8 +516,10 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo generateDistcleanTargets(t); + // Do not check for tools when doing generic clean, as most tools are not actually needed for + // cleaning. Mainly this is relevant for environments that do not have winscw compiler. t << "clean: " << BLD_INF_FILENAME << endl; - t << "\t-$(SBS) reallyclean"; + t << "\t-$(SBS) reallyclean --toolcheck=off"; foreach(QString clause, allClauses) { t << clause; } -- cgit v0.12 From b928bab9dde43cf3acace6dfae0ae6a4f6649650 Mon Sep 17 00:00:00 2001 From: Jani Hautakangas <jani.hautakangas@nokia.com> Date: Tue, 18 Jan 2011 10:59:34 +0200 Subject: Fix to data detaching in OpenVG pixmap data QImage::converToFormat(format) won't detach QImage if format stays the same. Because of this, internal QImage buffer of QVGPixmapData was not deep copied. Drawing to QPixmap target modified the original QImage that was used to create QPixmap and in some cases crashed because paint engine referred to wrong target. Task-number: QT-4407 Reviewed-by: Jason Barron --- src/openvg/qpixmapdata_vg.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/openvg/qpixmapdata_vg.cpp b/src/openvg/qpixmapdata_vg.cpp index e4b1d02..732b484 100644 --- a/src/openvg/qpixmapdata_vg.cpp +++ b/src/openvg/qpixmapdata_vg.cpp @@ -200,6 +200,9 @@ bool QVGPixmapData::fromData(const uchar *buffer, uint len, const char *format, return !isNull(); } +/*! + out-of-place conversion (inPlace == false) will always detach() + */ void QVGPixmapData::createPixmapForImage(QImage &image, Qt::ImageConversionFlags flags, bool inPlace) { if (image.size() == QSize(w, h)) @@ -216,11 +219,16 @@ void QVGPixmapData::createPixmapForImage(QImage &image, Qt::ImageConversionFlags else format = image.hasAlphaChannel() ? sourceFormat() : QImage::Format_RGB32; - if (inPlace && image.data_ptr()->convertInPlace(format, flags)) + if (inPlace && image.data_ptr()->convertInPlace(format, flags)) { source = image; - else + } else { source = image.convertToFormat(format); + // convertToFormat won't detach the image if format stays the same. + if (image.format() == format) + source.detach(); + } + recreate = true; } -- cgit v0.12 From 04ad0434596714ff91f5fce66267c34e82654bd5 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete <paul.tvete@nokia.com> Date: Tue, 18 Jan 2011 12:42:36 +0100 Subject: Add Qt::Key_ScreenSaver --- src/gui/embedded/qkbd_defaultmap_qws_p.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/embedded/qkbd_defaultmap_qws_p.h b/src/gui/embedded/qkbd_defaultmap_qws_p.h index 703dfcd..2f8eb37 100644 --- a/src/gui/embedded/qkbd_defaultmap_qws_p.h +++ b/src/gui/embedded/qkbd_defaultmap_qws_p.h @@ -649,6 +649,7 @@ const QWSKeyboard::Mapping QWSKbPrivate::s_keymap_default[] = { { 119, 0xffff, 0x01000008, 0x00, 0x00, 0x0000 }, { 138, 0xffff, 0x01000058, 0x00, 0x00, 0x0000 }, { 139, 0xffff, 0x01000055, 0x00, 0x00, 0x0000 }, + { 152, 0xffff, 0x010000ba, 0x00, 0x00, 0x0000 }, }; -- cgit v0.12 From 3fc81fe9bff2b35efd04955ae2ce5399ae1a91f0 Mon Sep 17 00:00:00 2001 From: axis <qt-info@nokia.com> Date: Tue, 5 Oct 2010 13:36:49 +0200 Subject: Added detection of bat files to the qtPrepareTool function. Not all tools end with .exe. Some also end in .bat. RevBy: Oswald Buddenhagen --- mkspecs/features/qt_functions.prf | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index 59d49c6..964e13b 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -94,6 +94,12 @@ defineTest(qtPrepareTool) { else:$$1 = $$[QT_INSTALL_BINS]/$$2 } $$1 ~= s,[/\\\\],$$QMAKE_DIR_SEP, - contains(QMAKE_HOST.os, Windows):!contains($$1, .*\\.exe$):$$1 = $$eval($$1).exe + contains(QMAKE_HOST.os, Windows):!contains($$1, .*\\.(exe|bat)$) { + exists($$eval($$1).bat) { + $$1 = $$eval($$1).bat + } else { + $$1 = $$eval($$1).exe + } + } export($$1) } -- cgit v0.12 From 2b464a49ab4e06908e8d3357466f3a9186f2f0ec Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Tue, 18 Jan 2011 16:37:02 +0200 Subject: Generate createpackage calls with absolute path. This ensures that the correct version of the script is always called. Task-number: QTBUG-16687 Reviewed-by: axis --- mkspecs/features/symbian/sis_targets.prf | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mkspecs/features/symbian/sis_targets.prf b/mkspecs/features/symbian/sis_targets.prf index 024378b..f919e1d 100644 --- a/mkspecs/features/symbian/sis_targets.prf +++ b/mkspecs/features/symbian/sis_targets.prf @@ -23,6 +23,7 @@ equals(GENERATE_SIS_TARGETS, true) { stub_pkg_target.commands = $(MAKE) -f $(MAKEFILE) qmake QMAKE_EXTRA_TARGETS += template_pkg_target installer_pkg_target stub_pkg_target + qtPrepareTool(QMAKE_CREATEPACKAGE, createpackage) symbian-abld|symbian-sbsv2 { symbian-sbsv2 { @@ -46,7 +47,7 @@ equals(GENERATE_SIS_TARGETS, true) { sis_target.depends += $${baseTarget}_template.pkg ok_sis_target.target = ok_sis - ok_sis_target.commands = createpackage $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) $${baseTarget}_template.pkg \ + ok_sis_target.commands = $$QMAKE_CREATEPACKAGE $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) $${baseTarget}_template.pkg \ $(QT_SIS_TARGET) $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE) unsigned_sis_target.target = unsigned_sis @@ -63,7 +64,7 @@ equals(GENERATE_SIS_TARGETS, true) { unsigned_sis_target.depends += $${baseTarget}_template.pkg ok_unsigned_sis_target.target = ok_unsigned_sis - ok_unsigned_sis_target.commands = createpackage $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) -o $${baseTarget}_template.pkg $(QT_SIS_TARGET) + ok_unsigned_sis_target.commands = $$QMAKE_CREATEPACKAGE $$CONVERT_GCCE_PARAM $(QT_SIS_OPTIONS) -o $${baseTarget}_template.pkg $(QT_SIS_TARGET) target_sis_target.target = $${baseTarget}.sis target_sis_target.commands = $(MAKE) -f $(MAKEFILE) sis @@ -75,7 +76,7 @@ equals(GENERATE_SIS_TARGETS, true) { installer_sis_target.depends = $${baseTarget}_installer.pkg sis ok_installer_sis_target.target = ok_installer_sis - ok_installer_sis_target.commands = createpackage $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \ + ok_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \ $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE) ok_installer_sis_target.depends = $${baseTarget}_installer.pkg @@ -84,7 +85,7 @@ equals(GENERATE_SIS_TARGETS, true) { unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg unsigned_sis ok_unsigned_installer_sis_target.target = ok_unsigned_installer_sis - ok_unsigned_installer_sis_target.commands = createpackage $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg + ok_unsigned_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg ok_unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg fail_sis_nocache_target.target = fail_sis_nocache @@ -104,7 +105,7 @@ equals(GENERATE_SIS_TARGETS, true) { stub_sis_target.depends += $${baseTarget}_stub.pkg ok_stub_sis_target.target = ok_stub_sis - ok_stub_sis_target.commands = createpackage -s $(QT_SIS_OPTIONS) $${baseTarget}_stub.pkg \ + ok_stub_sis_target.commands = $$QMAKE_CREATEPACKAGE -s $(QT_SIS_OPTIONS) $${baseTarget}_stub.pkg \ $(QT_SIS_TARGET) $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE) QMAKE_EXTRA_TARGETS += sis_target \ @@ -142,8 +143,6 @@ equals(GENERATE_SIS_TARGETS, true) { QMAKE_EXTRA_TARGETS += store_build_target } } else { - qtPrepareTool(QMAKE_CREATEPACKAGE, createpackage) - sis_destdir = $$DESTDIR isEmpty(sis_destdir):sis_destdir = . !equals(TARGET, "$$baseTarget"):sis_destdir = $$sis_destdir/$$dirname(TARGET) -- cgit v0.12 From 2f69ca58949ceaec5c2195af6e9edfa46c1c911d Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Tue, 18 Jan 2011 18:20:35 +0100 Subject: stabilize qmake autotest on a systems with small packet windows, QProcess::readAllStandardError() might return a part of the string and the existing code adds an endl to it a bit later, causing a test failure. (I don't care about the '\r'-s here because of QString shall eat them anyways) Merge-request: 2546 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- tests/auto/qmake/testcompiler.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/tests/auto/qmake/testcompiler.cpp b/tests/auto/qmake/testcompiler.cpp index 021fe9b..dbdeee8 100644 --- a/tests/auto/qmake/testcompiler.cpp +++ b/tests/auto/qmake/testcompiler.cpp @@ -142,23 +142,16 @@ bool TestCompiler::runCommand( QString cmdline ) bool failed = false; child.setReadChannel(QProcess::StandardError); - while (QProcess::Running == child.state()) { - if (child.waitForReadyRead(1000)) { - QString output = child.readAllStandardError(); - testOutput_.append(output); - - output.prepend('\n'); - if (output.contains("\nProject MESSAGE: FAILED")) - failed = true; - } - } - child.waitForFinished(-1); - return failed - ? false - : (child.exitStatus() == QProcess::NormalExit) - && (child.exitCode() == 0); + foreach (const QByteArray &output, child.readAllStandardError().split('\n')) { + testOutput_.append(QString::fromLocal8Bit(output)); + + if (output.startsWith("Project MESSAGE: FAILED")) + failed = true; + } + + return !failed && child.exitStatus() == QProcess::NormalExit && child.exitCode() == 0; } void TestCompiler::setBaseCommands( QString makeCmd, QString qmakeCmd ) -- cgit v0.12 From b481399c1c02a945e816f9385070883a0d795455 Mon Sep 17 00:00:00 2001 From: Martin Jones <martin.jones@nokia.com> Date: Wed, 19 Jan 2011 11:25:22 +1000 Subject: TextEdit implicit size varied depending upon wrapMode. We failed to reset textWidth before calculating the ideal width of the text. Task-number: QTBUG-16710 Reviewed-by: Michael Brasser --- src/declarative/graphicsitems/qdeclarativetextedit.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp index 42f66c3..cb62a2c 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp @@ -1365,8 +1365,12 @@ void QDeclarativeTextEdit::updateSize() int dy = height(); // ### assumes that if the width is set, the text will fill to edges // ### (unless wrap is false, then clipping will occur) - if (widthValid() && d->document->textWidth() != width()) - d->document->setTextWidth(width()); + if (widthValid()) { + if (d->document->textWidth() != width()) + d->document->setTextWidth(width()); + } else { + d->document->setTextWidth(-1); + } dy -= (int)d->document->size().height(); int nyoff; -- cgit v0.12 From 5d9738ed88da269033333299c16558882d346514 Mon Sep 17 00:00:00 2001 From: Martin Jones <martin.jones@nokia.com> Date: Wed, 19 Jan 2011 11:27:48 +1000 Subject: Cleanup created views in TextEdit tests. Reviewed-by: Michael Brasser --- .../qdeclarativetextedit/tst_qdeclarativetextedit.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp index 615b919..ba1a95f 100644 --- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp +++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp @@ -373,6 +373,8 @@ void tst_qdeclarativetextedit::alignments() QImage expect(expectfile); QCOMPARE(actual,expect); + + delete canvas; } @@ -745,6 +747,8 @@ void tst_qdeclarativetextedit::mouseSelection() QVERIFY(str.length() > 3); // don't reallly care *what* was selected (and it's too sensitive to platform) else QVERIFY(str.isEmpty()); + + delete canvas; } void tst_qdeclarativetextedit::inputMethodHints() @@ -759,6 +763,8 @@ void tst_qdeclarativetextedit::inputMethodHints() QVERIFY(textEditObject->inputMethodHints() & Qt::ImhNoPredictiveText); textEditObject->setInputMethodHints(Qt::ImhUppercaseOnly); QVERIFY(textEditObject->inputMethodHints() & Qt::ImhUppercaseOnly); + + delete canvas; } void tst_qdeclarativetextedit::cursorDelegate() @@ -785,6 +791,8 @@ void tst_qdeclarativetextedit::cursorDelegate() //Test Delegate gets deleted textEditObject->setCursorDelegate(0); QVERIFY(!textEditObject->findChild<QDeclarativeItem*>("cursorInstance")); + + delete view; } void tst_qdeclarativetextedit::delegateLoading_data() @@ -867,6 +875,8 @@ void tst_qdeclarativetextedit::navigation() QVERIFY(input->hasActiveFocus() == false); simulateKey(canvas, Qt::Key_Left); QVERIFY(input->hasActiveFocus() == true); + + delete canvas; } void tst_qdeclarativetextedit::copyAndPaste() { @@ -941,6 +951,8 @@ void tst_qdeclarativetextedit::readOnly() simulateKey(canvas, Qt::Key_Space); simulateKey(canvas, Qt::Key_Escape); QCOMPARE(edit->text(), initial); + + delete canvas; } void tst_qdeclarativetextedit::simulateKey(QDeclarativeView *view, int key) -- cgit v0.12 From bf7c6ee466d93db7d5af027d5ab503998f8ebf6f Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Wed, 19 Jan 2011 10:10:14 +0100 Subject: fix doubleformat config.test add 0.0 at the end to be treated like trailing null (\0) by some versions of 'strings' cli tool Merge-request: 2550 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- config.tests/unix/doubleformat/doubleformattest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.tests/unix/doubleformat/doubleformattest.cpp b/config.tests/unix/doubleformat/doubleformattest.cpp index f7b9000..b906e00 100644 --- a/config.tests/unix/doubleformat/doubleformattest.cpp +++ b/config.tests/unix/doubleformat/doubleformattest.cpp @@ -54,7 +54,7 @@ tested on x86, arm-le (gp), aix #include <stdlib.h> // equals static char c [] = "0123ABCD0123ABCD\0\0\0\0\0\0\0" -static double d [] = { 710524581542275055616.0, 710524581542275055616.0}; +static double d [] = { 710524581542275055616.0, 710524581542275055616.0, 0.0 }; int main(int argc, char **argv) { -- cgit v0.12 From b075603792ad90a55e0b23817d15f428e078a96e Mon Sep 17 00:00:00 2001 From: Adrian Constantin <adrian.constantin@nokia.com> Date: Wed, 5 Jan 2011 14:31:10 +0200 Subject: Add the test data to the INSTALLS target Reviewed-by: Lucian Varlan --- tests/auto/qlayout/qlayout.pro | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/auto/qlayout/qlayout.pro b/tests/auto/qlayout/qlayout.pro index c99f1d9..08727e5 100644 --- a/tests/auto/qlayout/qlayout.pro +++ b/tests/auto/qlayout/qlayout.pro @@ -10,5 +10,9 @@ wince*|symbian: { addFiles.sources = baseline addFiles.path = . DEPLOYMENT += addFiles +} else { + test_data.files = baseline/* + test_data.path = $${target.path}/baseline + INSTALLS += test_data } -- cgit v0.12 From f250b8717cc35f55d1b6e1965419eca5334d77d9 Mon Sep 17 00:00:00 2001 From: Lucian Varlan <lucian.i.varlan@nokia.com> Date: Tue, 4 Jan 2011 15:49:39 +0200 Subject: Use SRCDIR as a base path for the test data. The test cannot run on harmattan CI system, which executes it from a different directory than the one where the executable resides. Reviewed-by: Adrian Constantin Reviewed-by: Harald Fernengel --- tests/auto/qlayout/qlayout.pro | 2 ++ tests/auto/qlayout/tst_qlayout.cpp | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/auto/qlayout/qlayout.pro b/tests/auto/qlayout/qlayout.pro index 08727e5..d3b76e3 100644 --- a/tests/auto/qlayout/qlayout.pro +++ b/tests/auto/qlayout/qlayout.pro @@ -11,6 +11,8 @@ wince*|symbian: { addFiles.path = . DEPLOYMENT += addFiles } else { + DEFINES += SRCDIR=\\\"$$PWD\\\" + test_data.files = baseline/* test_data.path = $${target.path}/baseline INSTALLS += test_data diff --git a/tests/auto/qlayout/tst_qlayout.cpp b/tests/auto/qlayout/tst_qlayout.cpp index 65eae55..3090ebb 100644 --- a/tests/auto/qlayout/tst_qlayout.cpp +++ b/tests/auto/qlayout/tst_qlayout.cpp @@ -156,7 +156,8 @@ void tst_QLayout::smartMaxSize() { QVector<int> expectedWidths; - QFile f(QLatin1String("baseline/smartmaxsize")); + QFile f(QLatin1String(SRCDIR "/baseline/smartmaxsize")); + QCOMPARE(f.open(QIODevice::ReadOnly | QIODevice::Text), true); QTextStream stream(&f); -- cgit v0.12 From de1b44c967501666bfcb7a28d4c233708ce2c65e Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Wed, 19 Jan 2011 11:13:56 +0100 Subject: Cocoa: fix qwidget autotest (optimizedResizeMove) for raster engine In setGeometry_sys we used to call invalidateBuffer. This function does not take into account widgets with static contents when resizing. invlidateBuffer_resizeHelper does. The new code with this patch will make setGeometry_sys work the same way as in qwidget_x11::setGeometry_sys. --- src/gui/kernel/qwidget_mac.mm | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 993c8f0..0161b33 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4561,17 +4561,11 @@ void QWidgetPrivate::setGeometry_sys_helper(int x, int y, int w, int h, bool isM const QRect oldRect(oldp, olds); if (!isResize && QApplicationPrivate::graphicsSystem()) moveRect(oldRect, x - oldp.x(), y - oldp.y()); + setWSGeometry(false, oldRect); - if (isResize && QApplicationPrivate::graphicsSystem()) { - invalidateBuffer(q->rect()); - if (extra && !graphicsEffect && !extra->mask.isEmpty()) { - QRegion oldRegion(extra->mask.translated(oldp)); - oldRegion &= oldRect; - q->parentWidget()->d_func()->invalidateBuffer(oldRegion); - } else { - q->parentWidget()->d_func()->invalidateBuffer(effectiveRectFor(oldRect)); - } - } + + if (isResize && QApplicationPrivate::graphicsSystem()) + invalidateBuffer_resizeHelper(oldp, olds); } if(isMove || isResize) { -- cgit v0.12 From 79597969ee167b71bfbc28c2c56df8c2c8960e19 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Wed, 19 Jan 2011 13:19:20 +0100 Subject: Cocoa/Alien: fix qwidget autotest (setClearAndResizeMask) Now that we alien is in use, several of the auto tests are that needed special handling for mac before, are now expected to pass. Which they also do. This patch turns them on :) --- src/gui/kernel/qwidget_mac.mm | 7 ++++++- tests/auto/qwidget/tst_qwidget.cpp | 41 ++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 0161b33..df8e61e 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -5007,19 +5007,24 @@ void QWidgetPrivate::registerTouchWindow() void QWidgetPrivate::setMask_sys(const QRegion ®ion) { Q_UNUSED(region); -#ifndef QT_MAC_USE_COCOA Q_Q(QWidget); + +#ifndef QT_MAC_USE_COCOA if (q->isWindow()) ReshapeCustomWindow(qt_mac_window_for(q)); else HIViewReshapeStructure(qt_mac_nativeview_for(q)); #else + if (!q->internalWinId()) + return; + if (extra->mask.isEmpty()) { extra->maskBits = QImage(); finishCocoaMaskSetup(); } else { syncCocoaMask(); } + topLevelAt_cache = 0; #endif } diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index 0d67d41..8ee6f58 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -8883,6 +8883,7 @@ void tst_QWidget::setClearAndResizeMask() UpdateWidget child(&topLevel); child.setAutoFillBackground(true); // NB! Opaque child. + child.setPalette(Qt::red); child.resize(100, 100); child.show(); QTest::qWait(10); @@ -8898,10 +8899,11 @@ void tst_QWidget::setClearAndResizeMask() // and ensure that the child widget doesn't get any update. #ifdef Q_WS_MAC // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - QCOMPARE(child.numPaintEvents, 1); -#else - QCOMPARE(child.numPaintEvents, 0); + if (child.internalWinId()) + QCOMPARE(child.numPaintEvents, 1); + else #endif + QCOMPARE(child.numPaintEvents, 0); // and the parent widget gets an update for the newly exposed area. QTRY_COMPARE(topLevel.numPaintEvents, 1); QRegion expectedParentExpose(child.rect()); @@ -8918,10 +8920,11 @@ void tst_QWidget::setClearAndResizeMask() // and ensure that that the child widget gets an update for the area outside the old mask. QTRY_COMPARE(child.numPaintEvents, 1); outsideOldMask = child.rect(); -#ifndef Q_WS_MAC +#ifdef Q_WS_MAC // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - outsideOldMask -= childMask; + if (!child.internalWinId()) #endif + outsideOldMask -= childMask; QCOMPARE(child.paintedRegion, outsideOldMask); // and the parent widget doesn't get any update. QCOMPARE(topLevel.numPaintEvents, 0); @@ -8934,11 +8937,12 @@ void tst_QWidget::setClearAndResizeMask() QTest::qWait(100); #ifdef Q_WS_MAC // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - QTRY_COMPARE(child.numPaintEvents, 1); -#else + if (child.internalWinId()) + QTRY_COMPARE(child.numPaintEvents, 1); + else +#endif // and ensure that we don't get any updates at all. QTRY_COMPARE(child.numPaintEvents, 0); -#endif QCOMPARE(topLevel.numPaintEvents, 0); // ...and the same applies when clearing the mask. @@ -8946,10 +8950,11 @@ void tst_QWidget::setClearAndResizeMask() QTest::qWait(100); #ifdef Q_WS_MAC // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - QTRY_VERIFY(child.numPaintEvents > 0); -#else - QCOMPARE(child.numPaintEvents, 0); + if (child.internalWinId()) + QTRY_VERIFY(child.numPaintEvents > 0); + else #endif + QCOMPARE(child.numPaintEvents, 0); QCOMPARE(topLevel.numPaintEvents, 0); QWidget resizeParent; @@ -8975,10 +8980,11 @@ void tst_QWidget::setClearAndResizeMask() QTest::qWait(200); #ifdef Q_WS_MAC // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask()); -#else - QTRY_COMPARE(resizeChild.paintedRegion, QRegion()); + if (child.internalWinId()) + QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask()); + else #endif + QTRY_COMPARE(resizeChild.paintedRegion, QRegion()); resizeChild.paintedRegion = QRegion(); const QRegion oldMask = resizeChild.mask(); @@ -8986,10 +8992,11 @@ void tst_QWidget::setClearAndResizeMask() QTest::qWait(100); #ifdef Q_WS_MAC // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask()); -#else - QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask() - oldMask); + if (child.internalWinId()) + QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask()); + else #endif + QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask() - oldMask); } void tst_QWidget::maskedUpdate() -- cgit v0.12 From 770fb729929764a1f1c5fbd3d54714cf811c81e0 Mon Sep 17 00:00:00 2001 From: Alessandro Portale <alessandro.portale@nokia.com> Date: Wed, 19 Jan 2011 13:16:13 +0100 Subject: Supporting Qt application fonts on Symbian This patch finally implements the missing application font support on Symbian. QFontDatabase's addApplicationFont[FromData], applicationFontFamilies and removeApplicationFont are now functional and allow an application to load, use and unload fonts at run-time. The underlying Symbian API comes with some restrictions/specialties. Most of them are worked around in this patch, the missing ones are left as part of QTBUG-16514: - The font file must be a file, not a memory buffer. Web fonts and qrc fonts come as memory buffers. These buffers are saved to a temporary .ttf file and the file is loaded by the underlying Symbian API. The temporary file can only be deleted after the font is unloaded. - The font file must be in a public location in order to be loadable by Symbian. It can for example not reside in the private application directory. Therefore, all application fonts (also those that are on the file system) become a temporary .ttf file in c:\temp\. - Symbian3/PR2 will come with a font table API which provides direct access to font tables. Symbian3/PR1 and below are missing this API, therefore, an own TFontStore is (ab)used to read font tables out of a font. This patch is considering both code paths in several occasions, making the Qt Symbian font implementation significantly less maintainable. - The fonts are loaded into Symbian's central font server. Loaded fonts from different processes can have colliding font typeface names (not file names) on that server. The server does not separate loaded fonts by their origin processes. Working around such collisions is part of QTBUG-16514. The number of fonts loadable at the same time by a Qt application is limited to the random value 5. Just to prevent abuse of the font server's memory. As usual, this patch was looked at by colleagues, and it was adjusted according to the feedback. But since the bus factor for the interaction of Qt's and Symbian's font systems is 1, I reviewed this patch, myself. Task-Number: QTBUG-6611 Autotest: tst_QFontDatabase::addAppFont --- src/gui/kernel/qapplication_s60.cpp | 4 +- src/gui/text/qfontdatabase.cpp | 16 +- src/gui/text/qfontdatabase_s60.cpp | 229 +++++++++++++++++++++++-- tests/auto/qfontdatabase/tst_qfontdatabase.cpp | 4 - 4 files changed, 225 insertions(+), 28 deletions(-) diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index ba06312..40a7ec6 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -1616,7 +1616,7 @@ void qt_init(QApplicationPrivate * /* priv */, int) qRegisterMetaType<WId>("WId"); } -extern void qt_cleanup_symbianFontDatabaseExtras(); // qfontdatabase_s60.cpp +extern void qt_cleanup_symbianFontDatabase(); // qfontdatabase_s60.cpp /***************************************************************************** qt_cleanup() - cleans up when the application is finished @@ -1630,7 +1630,7 @@ void qt_cleanup() QFontCache::cleanup(); // Has to happen now, since QFontEngineS60 has FBS handles QPixmapCache::clear(); // Has to happen now, since QS60PixmapData has FBS handles - qt_cleanup_symbianFontDatabaseExtras(); + qt_cleanup_symbianFontDatabase(); // S60 structure and window server session are freed in eventdispatcher destructor as they are needed there // It's important that this happens here, before the event dispatcher gets diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 5cecf08..637957d 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -624,6 +624,10 @@ public: { } ~QFontDatabasePrivate() { free(); +#if defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE) + if (symbianExtras) + delete symbianExtras; +#endif } QtFontFamily *family(const QString &f, bool = false); void free() { @@ -632,12 +636,6 @@ public: ::free(families); families = 0; count = 0; -#if defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE) - if (symbianExtras) { - delete symbianExtras; - symbianExtras = 0; - } -#endif // don't clear the memory fonts! } @@ -653,6 +651,10 @@ public: QVector<FONTSIGNATURE> signatures; #elif defined(Q_WS_MAC) ATSFontContainerRef handle; +#elif defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE) + QString temporaryFileName; + TInt screenDeviceFontFileId; + TUid fontStoreFontFileUid; #endif QStringList families; }; @@ -680,7 +682,7 @@ public: QDataStream *stream; QStringList fallbackFamilies; #elif defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE) - const QSymbianFontDatabaseExtras *symbianExtras; + QSymbianFontDatabaseExtras *symbianExtras; #endif }; diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp index 6ba035e..e508810 100644 --- a/src/gui/text/qfontdatabase_s60.cpp +++ b/src/gui/text/qfontdatabase_s60.cpp @@ -45,6 +45,7 @@ #include "qfontengine_s60_p.h" #include "qabstractfileengine.h" #include "qdesktopservices.h" +#include "qtemporaryfile.h" #include <private/qpixmap_s60_p.h> #include <private/qt_s60_p.h> #include "qendian.h" @@ -114,7 +115,14 @@ public: ~QSymbianFontDatabaseExtrasImplementation(); const QSymbianTypeFaceExtras *extras(const QString &typeface, bool bold, bool italic) const; - void addFontFileToFontStore(const QFileInfo &fontFileInfo); + void removeAppFontData(QFontDatabasePrivate::ApplicationFont *fnt); + static inline bool appFontLimitReached(); + TUid addFontFileToFontStore(const QFileInfo &fontFileInfo); + static void clear(); + + static inline QString tempAppFontFolder(); + static const QString appFontMarkerPrefix; + static QString appFontMarker(); // 'qaf<shortUid[+shortPid]>' struct CFontFromFontStoreReleaser { static inline void cleanup(CFont *font) @@ -146,6 +154,33 @@ public: mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash; }; +const QString QSymbianFontDatabaseExtrasImplementation::appFontMarkerPrefix = + QLatin1String("qaf"); + +inline QString QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder() +{ + return QDir::toNativeSeparators(QDir::tempPath()) + QLatin1Char('\\'); +} + +QString QSymbianFontDatabaseExtrasImplementation::appFontMarker() +{ + static QString result; + if (result.isEmpty()) { + const quint32 uid = RProcess().Type().MostDerived().iUid; + quint16 crossSum = static_cast<quint16>(uid + (uid >> 16)); + if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) { + // If no font table Api is available, we must not even load a font + // from a previous (crashed) run of this application. Reason: we + // won't get the font tables, they are not in the CFontStore. + // So, we add the pid to the uniqueness of the marker. + const quint32 pid = static_cast<quint32>(RProcess().Id().Id()); + crossSum += static_cast<quint16>(pid + (pid >> 16)); + } + result = appFontMarkerPrefix + QString::number(crossSum, 16); + } + return result; +} + QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementation() { if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) { @@ -170,10 +205,13 @@ QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementati } } -void qt_cleanup_symbianFontDatabaseExtras() +void QSymbianFontDatabaseExtrasImplementation::clear() { + QFontDatabasePrivate *db = privateDb(); + if (!db) + return; const QSymbianFontDatabaseExtrasImplementation *dbExtras = - static_cast<const QSymbianFontDatabaseExtrasImplementation*>(privateDb()->symbianExtras); + static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras); if (!dbExtras) return; // initializeDb() has never been called if (QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) { @@ -189,9 +227,32 @@ void qt_cleanup_symbianFontDatabaseExtras() dbExtras->m_extrasHash.clear(); } +void qt_cleanup_symbianFontDatabase() +{ + QFontDatabasePrivate *db = privateDb(); + if (!db) + return; + + QSymbianFontDatabaseExtrasImplementation::clear(); + + if (!db->applicationFonts.isEmpty()) { + QFontDatabase::removeAllApplicationFonts(); + // We remove the left over temporary font files of Qt application. + // Active fonts are undeletable since the font server holds a handle + // on them, so we do not need to worry to delete other running + // applications' fonts. + const QDir dir(QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder()); + const QStringList filter( + QSymbianFontDatabaseExtrasImplementation::appFontMarkerPrefix + QLatin1String("*.ttf")); + foreach (const QFileInfo &ttfFile, dir.entryInfoList(filter)) + QFile(ttfFile.absoluteFilePath()).remove(); + db->applicationFonts.clear(); + } +} + QSymbianFontDatabaseExtrasImplementation::~QSymbianFontDatabaseExtrasImplementation() { - qt_cleanup_symbianFontDatabaseExtras(); + qt_cleanup_symbianFontDatabase(); if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) { delete m_store; m_heap->Close(); @@ -263,12 +324,40 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c return m_extrasHash.value(searchKey); } -void QSymbianFontDatabaseExtrasImplementation::addFontFileToFontStore(const QFileInfo &fontFileInfo) +void QSymbianFontDatabaseExtrasImplementation::removeAppFontData( + QFontDatabasePrivate::ApplicationFont *fnt) +{ + clear(); + if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable() + && fnt->fontStoreFontFileUid.iUid != 0) + m_store->RemoveFile(fnt->fontStoreFontFileUid); + if (fnt->screenDeviceFontFileId != 0) + S60->screenDevice()->RemoveFile(fnt->screenDeviceFontFileId); + QFile::remove(fnt->temporaryFileName); + *fnt = QFontDatabasePrivate::ApplicationFont(); +} + +bool QSymbianFontDatabaseExtrasImplementation::appFontLimitReached() +{ + QFontDatabasePrivate *db = privateDb(); + if (!db) + return false; + const int maxAppFonts = 5; + int registeredAppFonts = 0; + foreach (const QFontDatabasePrivate::ApplicationFont &appFont, db->applicationFonts) + if (!appFont.families.isEmpty() && ++registeredAppFonts == maxAppFonts) + return true; + return false; +} + +TUid QSymbianFontDatabaseExtrasImplementation::addFontFileToFontStore(const QFileInfo &fontFileInfo) { Q_ASSERT(!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()); const QString fontFile = QDir::toNativeSeparators(fontFileInfo.absoluteFilePath()); - TPtrC fontFilePtr(qt_QString2TPtrC(fontFile)); - QT_TRAP_THROWING(m_store->AddFileL(fontFilePtr)); + const TPtrC fontFilePtr(qt_QString2TPtrC(fontFile)); + TUid fontUid = {0}; + TRAP_IGNORE(fontUid = m_store->AddFileL(fontFilePtr)); + return fontUid; } #else // QT_NO_FREETYPE @@ -331,9 +420,9 @@ void QFontEngineMultiS60::loadEngine(int at) Q_ASSERT(engines[at]); } -static bool addFontToScreenDevice(int screenDeviceFontIndex, - const QSymbianFontDatabaseExtrasImplementation *dbExtras) -{ +static bool registerScreenDeviceFont(int screenDeviceFontIndex, + const QSymbianFontDatabaseExtrasImplementation *dbExtras) +{ TTypefaceSupport typefaceSupport; S60->screenDevice()->TypefaceSupport(typefaceSupport, screenDeviceFontIndex); CFont *font; // We have to get a font instance in order to know all the details @@ -398,7 +487,12 @@ static void initializeDb() const QSymbianFontDatabaseExtrasImplementation *dbExtras = static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras); for (int i = 0; i < numTypeFaces; i++) - addFontToScreenDevice(i, dbExtras); + registerScreenDeviceFont(i, dbExtras); + + // We have to clear/release all CFonts, here, in case one of the fonts is + // an application font of another running Qt app. Otherwise the other Qt app + // cannot remove it's application font, anymore -> "Zombie Font". + QSymbianFontDatabaseExtrasImplementation::clear(); lock.relock(); @@ -423,18 +517,123 @@ static inline void load(const QString &family = QString(), int script = -1) static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) { - Q_UNUSED(fnt); + if (QSymbianFontDatabaseExtrasImplementation::appFontLimitReached()) + return; + + QFontDatabasePrivate *db = privateDb(); + if (!db) + return; + + if (!db->count) + initializeDb(); + + if (fnt->data.isEmpty() && !fnt->fileName.endsWith(QLatin1String(".ttf"), Qt::CaseInsensitive)) + return; // Only buffer or .ttf + QSymbianFontDatabaseExtrasImplementation *dbExtras = + static_cast<QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras); + if (!dbExtras) + return; + + // The QTemporaryFile object being used in the following section must be + // destructed before letting Symbian load the TTF file. Symbian would not + // load it otherwise, because QTemporaryFile will still keep some handle + // on it. The scope is used to reduce the life time of the QTemporaryFile. + // In order to prevent other processes from modifying the file between the + // moment where the QTemporaryFile is destructed and the file is loaded by + // Symbian, we have a QFile "tempFileGuard" outside the scope which opens + // the file in ReadOnly mode while the QTemporaryFile is still alive. + QFile tempFileGuard; + { + QTemporaryFile tempfile(QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder() + + QSymbianFontDatabaseExtrasImplementation::appFontMarker() + + QLatin1String("XXXXXX.ttf")); + if (!tempfile.open()) + return; + const QString tempFileName = QFileInfo(tempfile).canonicalFilePath(); + if (fnt->data.isEmpty()) { + QFile sourceFile(fnt->fileName); + if (!sourceFile.open(QIODevice::ReadOnly)) + return; + fnt->data = sourceFile.readAll(); + } + if (tempfile.write(fnt->data) == -1) + return; + tempfile.setAutoRemove(false); + tempfile.close(); // Tempfile still keeps a file handle, forbidding write access + tempFileGuard.setFileName(tempFileName); + if (!tempFileGuard.open(QIODevice::ReadOnly)) + return; + fnt->temporaryFileName = tempFileName; + } + + const QString fullFileName = QDir::toNativeSeparators(fnt->temporaryFileName); + QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock); + const QStringList fontsOnServerBefore = qt_symbian_fontFamiliesOnFontServer(); + const TInt err = + S60->screenDevice()->AddFile(qt_QString2TPtrC(fullFileName), fnt->screenDeviceFontFileId); + tempFileGuard.close(); // Did its job + const QStringList fontsOnServerAfter = qt_symbian_fontFamiliesOnFontServer(); + if (err == KErrNone && fontsOnServerBefore.count() < fontsOnServerAfter.count()) { // Added to screen device? + int fontOnServerIndex = fontsOnServerAfter.count() - 1; + for (int i = 0; i < fontsOnServerBefore.count(); i++) { + if (fontsOnServerBefore.at(i) != fontsOnServerAfter.at(i)) { + fontOnServerIndex = i; + break; + } + } + + // Must remove all font engines with their CFonts, first. + QFontCache::instance()->clear(); + db->free(); + QSymbianFontDatabaseExtrasImplementation::clear(); + + if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) + fnt->fontStoreFontFileUid = dbExtras->addFontFileToFontStore(QFileInfo(fullFileName)); + + fnt->families.append(fontsOnServerAfter.at(fontOnServerIndex)); + if (!registerScreenDeviceFont(fontOnServerIndex, dbExtras)) + dbExtras->removeAppFontData(fnt); + } else { + QFile::remove(fnt->temporaryFileName); + *fnt = QFontDatabasePrivate::ApplicationFont(); + } + lock.relock(); } bool QFontDatabase::removeApplicationFont(int handle) { - Q_UNUSED(handle); - return false; + QMutexLocker locker(fontDatabaseMutex()); + + QFontDatabasePrivate *db = privateDb(); + if (!db || handle < 0 || handle >= db->applicationFonts.count()) + return false; + QSymbianFontDatabaseExtrasImplementation *dbExtras = + static_cast<QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras); + if (!dbExtras) + return false; + + QFontDatabasePrivate::ApplicationFont *fnt = &db->applicationFonts[handle]; + if (fnt->families.isEmpty()) + return true; // Nothing to remove. Return peacefully. + + // Must remove all font engines with their CFonts, first + QFontCache::instance()->clear(); + db->free(); + dbExtras->removeAppFontData(fnt); + + db->invalidate(); // This will just emit 'fontDatabaseChanged()' + return true; } bool QFontDatabase::removeAllApplicationFonts() { - return false; + QMutexLocker locker(fontDatabaseMutex()); + + const int applicationFontsCount = privateDb()->applicationFonts.count(); + for (int i = 0; i < applicationFontsCount; ++i) + if (!removeApplicationFont(i)) + return false; + return true; } bool QFontDatabase::supportsThreadedFontRendering() diff --git a/tests/auto/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/qfontdatabase/tst_qfontdatabase.cpp index ead000c..8b6f621 100644 --- a/tests/auto/qfontdatabase/tst_qfontdatabase.cpp +++ b/tests/auto/qfontdatabase/tst_qfontdatabase.cpp @@ -191,9 +191,6 @@ void tst_QFontDatabase::addAppFont_data() void tst_QFontDatabase::addAppFont() { -#ifdef Q_OS_SYMBIAN - QSKIP( "Symbian: Application fonts are not yet supported", SkipAll ); -#else QFETCH(bool, useMemoryFont); QSignalSpy fontDbChangedSpy(QApplication::instance(), SIGNAL(fontDatabaseChanged())); @@ -243,7 +240,6 @@ void tst_QFontDatabase::addAppFont() QCOMPARE(fontDbChangedSpy.count(), 2); QVERIFY(db.families() == oldFamilies); -#endif } QTEST_MAIN(tst_QFontDatabase) -- cgit v0.12 From 2a333975ce44546b18f306bf2b73b5a7e09616cc Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Wed, 19 Jan 2011 15:18:20 +0100 Subject: Cocoa: enable more autotests for qwidget as a result of Alien --- tests/auto/qwidget/tst_qwidget.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index 8ee6f58..2208bea 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -2745,9 +2745,6 @@ void tst_QWidget::lostUpdatesOnHide() void tst_QWidget::raise() { -#ifdef QT_MAC_USE_COCOA - QSKIP("Cocoa has no Z-Order for views, we hack it, but it results in paint events.", SkipAll); -#endif QTest::qWait(10); QWidget *parent = new QWidget(0); QList<UpdateWidget *> allChildren; @@ -2772,6 +2769,12 @@ void tst_QWidget::raise() QTest::qWaitForWindowShown(parent); QTest::qWait(10); +#ifdef QT_MAC_USE_COCOA + if (child1->internalWinId()) { + QSKIP("Cocoa has no Z-Order for views, we hack it, but it results in paint events.", SkipAll); + } +#endif + QList<QObject *> list1; list1 << child1 << child2 << child3 << child4; QVERIFY(parent->children() == list1); @@ -2796,6 +2799,9 @@ void tst_QWidget::raise() foreach (UpdateWidget *child, allChildren) { int expectedPaintEvents = child == child2 ? 1 : 0; int expectedZOrderChangeEvents = child == child2 ? 1 : 0; +#ifdef QT_MAC_USE_COCOA + QSKIP("Not yet sure why this fails.", SkipSingle); +#endif QTRY_COMPARE(child->numPaintEvents, expectedPaintEvents); QCOMPARE(child->numZOrderChangeEvents, expectedZOrderChangeEvents); child->reset(); @@ -3046,9 +3052,6 @@ protected: void tst_QWidget::testContentsPropagation() { -#ifdef Q_WS_MAC - QSKIP("Pixmap is not antialiased whereas widget is.", SkipAll); -#endif ContentsPropagationWidget widget; #ifdef Q_WS_QWS widget.resize(500,500); -- cgit v0.12 From a2ebd9e3f84fb8fcd2be45e91a7c71f146961e23 Mon Sep 17 00:00:00 2001 From: Jason McDonald <jason.mcdonald@nokia.com> Date: Thu, 20 Jan 2011 00:39:44 +1000 Subject: Fix compilation error. Protect #include of feature-specific header in #ifdef. Task-number: QTBUG-16652 Reviewed-by: Trust Me Acked-by: Jani Hautakangas --- src/gui/painting/qdrawhelper.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 9928dea..5904296 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -43,7 +43,9 @@ #include <private/qpaintengine_raster_p.h> #include <private/qpainter_p.h> #include <private/qdrawhelper_x86_p.h> +#ifdef QT_HAVE_ARM_SIMD #include <private/qdrawhelper_arm_simd_p.h> +#endif #include <private/qdrawhelper_neon_p.h> #include <private/qmath_p.h> #include <qmath.h> -- cgit v0.12 From 25ac59fcf1bb03c9af9a2c967218c96c7c77361a Mon Sep 17 00:00:00 2001 From: Alessandro Portale <alessandro.portale@nokia.com> Date: Wed, 19 Jan 2011 18:49:34 +0100 Subject: Do not load aplication fonts on Symbian^1 and below read http://bugreports.qt.nokia.com/browse/QTBUG-16514 for a recipy to reboot the phone just by handling with fonts. Symbian^1 is vulnerable, and Symbain^3 prevents a phone reboot. Therefore, I prefer to disable the app font feature for Symbian^1, until QTBUG-16514 us properly handled. Task-Number: QTBUG-16514 --- src/gui/text/qfontdatabase_s60.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp index e508810..06462c4 100644 --- a/src/gui/text/qfontdatabase_s60.cpp +++ b/src/gui/text/qfontdatabase_s60.cpp @@ -517,6 +517,9 @@ static inline void load(const QString &family = QString(), int script = -1) static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) { + if (QSysInfo::symbianVersion() <= QSysInfo::SV_SF_2) + return; // See QTBUG-16514 for what 'font collisions' can cause in Symbian^1 and lower + if (QSymbianFontDatabaseExtrasImplementation::appFontLimitReached()) return; -- cgit v0.12 From 808de6fd2f9835c28986b86de829579196b6163d Mon Sep 17 00:00:00 2001 From: Gareth Stockwell <ext-gareth.stockwell@nokia.com> Date: Wed, 19 Jan 2011 18:31:38 +0000 Subject: Switch default Phonon backend on Symbian from Helix to MMF If both plugins are present on a device, the MMF backend is now loaded by default. Task-number: QT-4472 Reviewed-by: Justin McPherson --- src/3rdparty/phonon/phonon/factory.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/3rdparty/phonon/phonon/factory.cpp b/src/3rdparty/phonon/phonon/factory.cpp index 2785dff..b5e565b 100644 --- a/src/3rdparty/phonon/phonon/factory.cpp +++ b/src/3rdparty/phonon/phonon/factory.cpp @@ -137,21 +137,15 @@ bool FactoryPrivate::createBackend() QStringList plugins(dir.entryList(QDir::Files)); #ifdef Q_OS_SYMBIAN - /* On Symbian OS we might have two plugins, one which uses Symbian - * MMF framework("mmf"), and one which uses Real Networks's - * Helix("hxphonon"). We prefer the latter because it's more - * sophisticated, so we make sure the Helix backend is attempted - * to be loaded first, and the MMF backend is used for backup. */ - { - const int helix = plugins.indexOf(QLatin1String("hxphonon")); - if (helix != -1) - plugins.move(helix, 0); - } + static const QString preferredPluginName = QLatin1String("phonon_mmf"); + const int preferredPluginIndex = plugins.indexOf(preferredPluginName + ".qtplugin"); + if (preferredPluginIndex != -1) + plugins.move(preferredPluginIndex, 0); #endif const QStringList files = dir.entryList(QDir::Files); - for (int i = 0; i < files.count(); ++i) { - QPluginLoader pluginLoader(libPath + files.at(i)); + for (int i = 0; i < plugins.count(); ++i) { + QPluginLoader pluginLoader(libPath + plugins.at(i)); if (!pluginLoader.load()) { pDebug() << Q_FUNC_INFO << " load failed:" << pluginLoader.errorString(); -- cgit v0.12 From 9fec1802952457178a9b31c55b4c6e3ea60fcb80 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Thu, 20 Jan 2011 13:58:58 +0200 Subject: Improved QMAKE_POST_LINK support in symbian-sbsv2 QMAKE_POST_LINK value handling now uses the same automatic replacements as QMAKE_EXTRA_COMPILERS and QMAKE_EXTRA_TARGETS handling. In practice this means that it is now possible to use $$QMAKE_COPY and friends in QMAKE_POST_LINK value also with symbian-sbsv2 mkspec, and that any backslashes in the value are assumed to be path separators and will be converted to forward slashes. Task-number: QTBUG-16753 Reviewed-by: Janne Koskinen --- qmake/generators/symbian/symmake_sbsv2.cpp | 56 ++++++++++++++++++------------ 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp index 47c5b31..6d01523 100644 --- a/qmake/generators/symbian/symmake_sbsv2.cpp +++ b/qmake/generators/symbian/symmake_sbsv2.cpp @@ -72,6 +72,35 @@ static QString sbsRvctPrefix; extern char **environ; #endif +static void fixFlmCmd(QString *cmdLine, const QMap<QString, QString> &commandsToReplace) +{ + // If commandItem starts with any $$QMAKE_* commands, do a replace for SBS equivalent. + // Command replacement is done only for the start of the command or right after + // concatenation operators (&& and ||), as otherwise unwanted replacements might occur. + static QString cmdFind(QLatin1String("(^|&&\\s*|\\|\\|\\s*)%1")); + static QString cmdReplace(QLatin1String("\\1%1")); + + // $$escape_expand(\\n\\t) doesn't work for bld.inf files, but is often used as command + // separator, so replace it with "&&" command concatenator. + cmdLine->replace("\n\t", "&&"); + + // Iterate command replacements in reverse alphabetical order of keys so + // that keys which are starts of other longer keys are iterated after longer keys. + QMapIterator<QString, QString> cmdIter(commandsToReplace); + cmdIter.toBack(); + while (cmdIter.hasPrevious()) { + cmdIter.previous(); + if (cmdLine->contains(cmdIter.key())) + cmdLine->replace(QRegExp(cmdFind.arg(cmdIter.key())), cmdReplace.arg(cmdIter.value())); + } + + // Sbsv2 toolchain strips all backslashes (even double ones) from option parameters, so just + // assume all backslashes are directory separators and replace them with slashes. + // Problem: If some command actually needs backslashes for something else than dir separator, + // we are out of luck. + cmdLine->replace("\\", "/"); +} + // Copies Qt FLMs to correct location under epocroot. // This is not done by configure as it is possible to change epocroot after configure. void SymbianSbsv2MakefileGenerator::exportFlm() @@ -563,12 +592,6 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t commandsToReplace.insert(project->values("QMAKE_DEL_TREE").join(" "), project->values("QMAKE_SBSV2_DEL_TREE").join(" ")); - // If commandItem starts with any $$QMAKE_* commands, do a replace for SBS equivalent - // Command replacement is done only for the start of the command or right after - // concatenation operators (&& and ||), as otherwise unwanted replacements might occur. - static QString cmdFind("(^|&&\\s*|\\|\\|\\s*)%1"); - static QString cmdReplace("\\1%1"); - // Write extra compilers and targets to initialize QMAKE_ET_* variables // Cache results to avoid duplicate calls when creating wrapper makefile QTextStream extraCompilerStream(&extraCompilersCache); @@ -623,26 +646,13 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t t << "OPTION PREDEP_TARGET " << absoluteTarget << endl; t << "OPTION DEPS " << absoluteDeps << endl; - // Iterate command replacements in reverse alphabetical order of keys so - // that keys which are starts of other longer keys are iterated after longer keys. - QMapIterator<QString, QString> cmdIter(commandsToReplace); - cmdIter.toBack(); - while (cmdIter.hasPrevious()) { - cmdIter.previous(); - if (commandItem.contains(cmdIter.key())) { - commandItem.replace(QRegExp(cmdFind.arg(cmdIter.key())), - cmdReplace.arg(cmdIter.value())); - } - } - if (commandItem.indexOf("$(INCPATH)") != -1) commandItem.replace("$(INCPATH)", incPath.join(" ")); if (commandItem.indexOf("$(DEFINES)") != -1) commandItem.replace("$(DEFINES)", defines.join(" ")); - // Sbsv2 strips all backslashes (even doubles ones) from option parameters, so just replace them with slashes - // Problem: If some command actually needs backslashes for something else than dir separator, we are out of luck... - commandItem.replace("\\", "/"); + fixFlmCmd(&commandItem, commandsToReplace); + t << "OPTION COMMAND " << commandItem << endl; t << "END" << endl; } @@ -672,8 +682,10 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t // Write post link rules if (!project->isEmpty("QMAKE_POST_LINK")) { + QString postLinkCmd = var("QMAKE_POST_LINK"); + fixFlmCmd(&postLinkCmd, commandsToReplace); t << "START EXTENSION qt/qmake_post_link" << endl; - t << "OPTION POST_LINK_CMD " << var("QMAKE_POST_LINK") << endl; + t << "OPTION POST_LINK_CMD " << postLinkCmd << endl; t << "OPTION LINK_TARGET " << removePathSeparators(escapeFilePath(fileFixify(project->first("TARGET"))).append(".").append(getTargetExtension())) << endl; t << "END" << endl; t << endl; -- cgit v0.12 From 5e5e16fd7107334e10939592170fc322cfa86da9 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Thu, 20 Jan 2011 12:35:20 +0100 Subject: Cocoa/Alien: let QWidget::scroll_sys handle overlapping widgets --- src/gui/kernel/qcocoaview_mac.mm | 5 +++-- src/gui/kernel/qwidget_mac.mm | 25 ++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index dbf9d56..575343f 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -129,6 +129,7 @@ extern "C" { extern NSString *NSTextInputReplacementRangeAttributeName; } +//#define ALIEN_DEBUG 1 #ifdef ALIEN_DEBUG static int qCocoaViewCount = 0; #endif @@ -146,7 +147,7 @@ static int qCocoaViewCount = 0; #ifdef ALIEN_DEBUG ++qCocoaViewCount; - qDebug() << "init: qCocoaViewCount is" << qCocoaViewCount; + qDebug() << "Alien: create native view for" << widget << ". qCocoaViewCount is:" << qCocoaViewCount; #endif composing = false; @@ -174,7 +175,7 @@ static int qCocoaViewCount = 0; #ifdef ALIEN_DEBUG --qCocoaViewCount; - qDebug() << "qCocoaViewCount is" << qCocoaViewCount; + qDebug() << "Alien: widget deallocated. qCocoaViewCount is:" << qCocoaViewCount; #endif [super dealloc]; diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index df8e61e..8d6c09c 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4662,6 +4662,17 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) return; } + static int accelEnv = -1; + if (accelEnv == -1) { + accelEnv = qgetenv("QT_NO_FAST_SCROLL").toInt() == 0; + } + + // Scroll the whole widget instead if qscrollRect is not valid: + QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : q->rect(); + // If q is overlapped by other widgets, we cannot just blit pixels since + // this will move overlapping widgets as well. In case we just update: + const bool overlapped = isOverlapped(validScrollRect.translated(data.crect.topLeft())); + const bool accelerateScroll = accelEnv && isOpaque && !overlapped; const bool isAlien = (q->internalWinId() == 0); const QPoint scrollDelta(dx, dy); @@ -4677,10 +4688,21 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) return; } + if (!accelerateScroll) { + if (overlapped) { + QRegion region(validScrollRect); + subtractOpaqueSiblings(region); + update_sys(region); + }else { + update_sys(qscrollRect); + } + return; + } #ifdef QT_MAC_USE_COCOA QMacCocoaAutoReleasePool pool; #else + Q_UNUSED(isAlien); // We're not sure what the following call is supposed to achive // but until we see what it breaks, we don't bring it into the // Cocoa port: @@ -4750,9 +4772,6 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) if (!view) return; - // Scroll the whole widget instead if qscrollRect is not valid: - QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : QRect(0, 0, q->width(), q->height()); - if (isAlien) { // Since q is alien, we need to translate the scroll rect: QPoint widgetTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(QPoint())); -- cgit v0.12 From b7f2290fb746b8769ae2de2bc4278d2234a50a2d Mon Sep 17 00:00:00 2001 From: Martin Pejcoch <martin.pejcoch@nokia.com> Date: Mon, 1 Nov 2010 18:00:23 +0100 Subject: Use file names in header include guards instead of namespace names dumpcpp used "-n" option value for guard macros in headers which was wrong, because that implies that every QtAx COM wrapper must have a unique namespace. Task-number: QTBUG-14383 Reviewed-by: Prasanth --- tools/activeqt/dumpcpp/main.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/activeqt/dumpcpp/main.cpp b/tools/activeqt/dumpcpp/main.cpp index bb65806..f95d31d 100644 --- a/tools/activeqt/dumpcpp/main.cpp +++ b/tools/activeqt/dumpcpp/main.cpp @@ -48,6 +48,7 @@ #include <QStringList> #include <QUuid> #include <QWidget> +#include <QFileInfo> #include <qt_windows.h> #include <ocidl.h> @@ -129,10 +130,10 @@ void writeEnums(QTextStream &out, const QMetaObject *mo) } } -void writeHeader(QTextStream &out, const QByteArray &nameSpace) +void writeHeader(QTextStream &out, const QByteArray &nameSpace, const QString &outFileName) { - out << "#ifndef QAX_DUMPCPP_" << nameSpace.toUpper() << "_H" << endl; - out << "#define QAX_DUMPCPP_" << nameSpace.toUpper() << "_H" << endl; + out << "#ifndef QAX_DUMPCPP_" << outFileName.toUpper() << "_H" << endl; + out << "#define QAX_DUMPCPP_" << outFileName.toUpper() << "_H" << endl; out << endl; out << "// Define this symbol to __declspec(dllexport) or __declspec(dllimport)" << endl; out << "#ifndef " << nameSpace.toUpper() << "_EXPORT" << endl; @@ -880,7 +881,7 @@ bool generateClass(QAxObject *object, const QByteArray &className, const QByteAr out << "****************************************************************************/" << endl; out << endl; - writeHeader(out, nameSpace); + writeHeader(out, nameSpace, outfile.fileName()); generateNameSpace(out, mo, nameSpace); // close namespace file @@ -1040,7 +1041,8 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O declOut << "****************************************************************************/" << endl; declOut << endl; - writeHeader(declOut, libName.toLatin1()); + QFileInfo cppFileInfo(cppFile); + writeHeader(declOut, libName.toLatin1(), cppFileInfo.fileName()); UINT typeCount = typelib->GetTypeInfoCount(); if (declFile.isOpen()) { -- cgit v0.12 From e33f989069385dd3a802712ed179e750cc9847b9 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> Date: Mon, 27 Dec 2010 14:56:18 -0300 Subject: QScriptValueIterator: fix iterateArray and iterateString tests This removes the assumption that the properties will be ordered by index and that length will be visited after the indexes, which are not part of QScriptValueIterator API. Reviewed-by: Kent Hansen --- .../tst_qscriptvalueiterator.cpp | 230 +++++++++++++-------- 1 file changed, 143 insertions(+), 87 deletions(-) diff --git a/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp b/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp index eb7f94f..03e5c0f 100644 --- a/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp +++ b/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp @@ -212,106 +212,138 @@ void tst_QScriptValueIterator::iterateBackward() void tst_QScriptValueIterator::iterateArray_data() { - QTest::addColumn<QStringList>("inputPropertyNames"); - QTest::addColumn<QStringList>("inputPropertyValues"); QTest::addColumn<QStringList>("propertyNames"); QTest::addColumn<QStringList>("propertyValues"); - QTest::newRow("no elements") << QStringList() << QStringList() << QStringList() << QStringList(); + QTest::newRow("no elements") << QStringList() << QStringList(); QTest::newRow("0=foo, 1=barr") << (QStringList() << "0" << "1") - << (QStringList() << "foo" << "bar") - << (QStringList() << "0" << "1") << (QStringList() << "foo" << "bar"); QTest::newRow("0=foo, 3=barr") << (QStringList() << "0" << "1" << "2" << "3") - << (QStringList() << "foo" << "" << "" << "bar") - << (QStringList() << "0" << "1" << "2" << "3") << (QStringList() << "foo" << "" << "" << "bar"); } void tst_QScriptValueIterator::iterateArray() { - QFETCH(QStringList, inputPropertyNames); - QFETCH(QStringList, inputPropertyValues); QFETCH(QStringList, propertyNames); QFETCH(QStringList, propertyValues); QScriptEngine engine; QScriptValue array = engine.newArray(); - for (int i = 0; i < inputPropertyNames.size(); ++i) { - array.setProperty(inputPropertyNames.at(i), inputPropertyValues.at(i)); + + // Fill the array + for (int i = 0; i < propertyNames.size(); ++i) { + array.setProperty(propertyNames.at(i), propertyValues.at(i)); } + // Iterate thru array properties. Note that the QScriptValueIterator doesn't guarantee + // any order on the iteration! int length = array.property("length").toInt32(); QCOMPARE(length, propertyNames.size()); + + bool iteratedThruLength = false; + QHash<QString, QScriptValue> arrayProperties; QScriptValueIterator it(array); - for (int i = 0; i < length; ++i) { - QCOMPARE(it.hasNext(), true); + + // Iterate forward + while (it.hasNext()) { it.next(); - QCOMPARE(it.name(), propertyNames.at(i)); - QCOMPARE(it.flags(), array.propertyFlags(propertyNames.at(i))); - QVERIFY(it.value().strictlyEquals(array.property(propertyNames.at(i)))); - QCOMPARE(it.value().toString(), propertyValues.at(i)); + + const QString name = it.name(); + if (name == QString::fromLatin1("length")) { + QVERIFY(it.value().isNumber()); + QCOMPARE(it.value().toInt32(), length); + QCOMPARE(it.flags(), QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); + QVERIFY2(!iteratedThruLength, "'length' appeared more than once during iteration."); + iteratedThruLength = true; + continue; + } + + // Storing the properties we iterate in a hash to compare with test data. + QVERIFY2(!arrayProperties.contains(name), "property appeared more than once during iteration."); + arrayProperties.insert(name, it.value()); + QCOMPARE(it.flags(), array.propertyFlags(name)); + QVERIFY(it.value().strictlyEquals(array.property(name))); } - QVERIFY(it.hasNext()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("length")); - QVERIFY(it.value().isNumber()); - QCOMPARE(it.value().toInt32(), length); - QCOMPARE(it.flags(), QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); - it.previous(); - QCOMPARE(it.hasPrevious(), length > 0); - for (int i = length - 1; i >= 0; --i) { - it.previous(); - QCOMPARE(it.name(), propertyNames.at(i)); - QCOMPARE(it.flags(), array.propertyFlags(propertyNames.at(i))); - QVERIFY(it.value().strictlyEquals(array.property(propertyNames.at(i)))); - QCOMPARE(it.value().toString(), propertyValues.at(i)); - QCOMPARE(it.hasPrevious(), i > 0); + // Verify properties + QVERIFY(iteratedThruLength); + QCOMPARE(arrayProperties.size(), propertyNames.size()); + for (int i = 0; i < propertyNames.size(); ++i) { + QVERIFY(arrayProperties.contains(propertyNames.at(i))); + QCOMPARE(arrayProperties.value(propertyNames.at(i)).toString(), propertyValues.at(i)); } - QCOMPARE(it.hasPrevious(), false); - // hasNext() and hasPrevious() cache their result; verify that the result is in sync - if (length > 1) { - QVERIFY(it.hasNext()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("0")); - QVERIFY(it.hasNext()); + // Iterate backwards + arrayProperties.clear(); + iteratedThruLength = false; + it.toBack(); + + while (it.hasPrevious()) { it.previous(); - QCOMPARE(it.name(), QString::fromLatin1("0")); - QVERIFY(!it.hasPrevious()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("0")); - QVERIFY(it.hasPrevious()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("1")); - } - { - // same test as object: - QScriptValue originalArray = engine.newArray(); - for (int i = 0; i < inputPropertyNames.size(); ++i) { - originalArray.setProperty(inputPropertyNames.at(i), inputPropertyValues.at(i)); + + const QString name = it.name(); + if (name == QString::fromLatin1("length")) { + QVERIFY(it.value().isNumber()); + QCOMPARE(it.value().toInt32(), length); + QCOMPARE(it.flags(), QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); + QVERIFY2(!iteratedThruLength, "'length' appeared more than once during iteration."); + iteratedThruLength = true; + continue; } - QScriptValue array = originalArray.toObject(); - int length = array.property("length").toInt32(); - QCOMPARE(length, propertyNames.size()); - QScriptValueIterator it(array); - for (int i = 0; i < length; ++i) { - QCOMPARE(it.hasNext(), true); - it.next(); - QCOMPARE(it.name(), propertyNames.at(i)); - QCOMPARE(it.flags(), array.propertyFlags(propertyNames.at(i))); - QVERIFY(it.value().strictlyEquals(array.property(propertyNames.at(i)))); - QCOMPARE(it.value().toString(), propertyValues.at(i)); + + // Storing the properties we iterate in a hash to compare with test data. + QVERIFY2(!arrayProperties.contains(name), "property appeared more than once during iteration."); + arrayProperties.insert(name, it.value()); + QCOMPARE(it.flags(), array.propertyFlags(name)); + QVERIFY(it.value().strictlyEquals(array.property(name))); + } + + // Verify properties + QVERIFY(iteratedThruLength); + QCOMPARE(arrayProperties.size(), propertyNames.size()); + for (int i = 0; i < propertyNames.size(); ++i) { + QVERIFY(arrayProperties.contains(propertyNames.at(i))); + QCOMPARE(arrayProperties.value(propertyNames.at(i)).toString(), propertyValues.at(i)); + } + + // ### Do we still need this test? + // Forward test again but as object + arrayProperties.clear(); + iteratedThruLength = false; + QScriptValue arrayObject = engine.toObject(array); + QScriptValueIterator it2(arrayObject); + + while (it2.hasNext()) { + it2.next(); + + const QString name = it2.name(); + if (name == QString::fromLatin1("length")) { + QVERIFY(it2.value().isNumber()); + QCOMPARE(it2.value().toInt32(), length); + QCOMPARE(it2.flags(), QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); + QVERIFY2(!iteratedThruLength, "'length' appeared more than once during iteration."); + iteratedThruLength = true; + continue; } - QCOMPARE(it.hasNext(), true); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("length")); + + // Storing the properties we iterate in a hash to compare with test data. + QVERIFY2(!arrayProperties.contains(name), "property appeared more than once during iteration."); + arrayProperties.insert(name, it2.value()); + QCOMPARE(it2.flags(), arrayObject.propertyFlags(name)); + QVERIFY(it2.value().strictlyEquals(arrayObject.property(name))); + } + + // Verify properties + QVERIFY(iteratedThruLength); + QCOMPARE(arrayProperties.size(), propertyNames.size()); + for (int i = 0; i < propertyNames.size(); ++i) { + QVERIFY(arrayProperties.contains(propertyNames.at(i))); + QCOMPARE(arrayProperties.value(propertyNames.at(i)).toString(), propertyValues.at(i)); } } @@ -419,35 +451,59 @@ void tst_QScriptValueIterator::iterateString() QScriptValue str = QScriptValue(&engine, QString::fromLatin1("ciao")); QVERIFY(str.isString()); QScriptValue obj = str.toObject(); + QVERIFY(obj.property("length").isNumber()); int length = obj.property("length").toInt32(); QCOMPARE(length, 4); + QScriptValueIterator it(obj); - for (int i = 0; i < length; ++i) { - QCOMPARE(it.hasNext(), true); - QString indexStr = QScriptValue(&engine, i).toString(); + QHash<QString, QScriptValue> stringProperties; + bool iteratedThruLength = false; + + while (it.hasNext()) { it.next(); - QCOMPARE(it.name(), indexStr); - QCOMPARE(it.flags(), obj.propertyFlags(indexStr)); - QCOMPARE(it.value().strictlyEquals(obj.property(indexStr)), true); + const QString name = it.name(); + + if (name == QString::fromLatin1("length")) { + QVERIFY(it.value().isNumber()); + QCOMPARE(it.value().toInt32(), length); + QCOMPARE(it.flags(), QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); + QVERIFY2(!iteratedThruLength, "'length' appeared more than once during iteration."); + iteratedThruLength = true; + continue; + } + + QVERIFY2(!stringProperties.contains(name), "property appeared more than once during iteration."); + stringProperties.insert(name, it.value()); + QCOMPARE(it.flags(), obj.propertyFlags(name)); + QVERIFY(it.value().strictlyEquals(obj.property(name))); } - QVERIFY(it.hasNext()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("length")); - QVERIFY(it.value().isNumber()); - QCOMPARE(it.value().toInt32(), length); - QCOMPARE(it.flags(), QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); - it.previous(); - QCOMPARE(it.hasPrevious(), length > 0); - for (int i = length - 1; i >= 0; --i) { + QVERIFY(iteratedThruLength); + QCOMPARE(stringProperties.size(), length); + + // And going backwards + iteratedThruLength = false; + stringProperties.clear(); + it.toBack(); + + while (it.hasPrevious()) { it.previous(); - QString indexStr = QScriptValue(&engine, i).toString(); - QCOMPARE(it.name(), indexStr); - QCOMPARE(it.flags(), obj.propertyFlags(indexStr)); - QCOMPARE(it.value().strictlyEquals(obj.property(indexStr)), true); - QCOMPARE(it.hasPrevious(), i > 0); + const QString name = it.name(); + + if (name == QString::fromLatin1("length")) { + QVERIFY(it.value().isNumber()); + QCOMPARE(it.value().toInt32(), length); + QCOMPARE(it.flags(), QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); + QVERIFY2(!iteratedThruLength, "'length' appeared more than once during iteration."); + iteratedThruLength = true; + continue; + } + + QVERIFY2(!stringProperties.contains(name), "property appeared more than once during iteration."); + stringProperties.insert(name, it.value()); + QCOMPARE(it.flags(), obj.propertyFlags(name)); + QVERIFY(it.value().strictlyEquals(obj.property(name))); } - QCOMPARE(it.hasPrevious(), false); } static QScriptValue myGetterSetter(QScriptContext *ctx, QScriptEngine *) -- cgit v0.12 From 7701926097e0777a27e1598ab9b92e53ae066d20 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> Date: Wed, 29 Dec 2010 15:10:03 -0300 Subject: QtScript: add more tests to QObject binding This adds a few more tests to exercise dynamic properties and child objects as properties of QObject binding. Some of these were implicitly tested elsewhere, but is good to have the "properties" clearly stated in our test suite. Reviewed-by: Jedrzej Nowacki --- .../qscriptextqobject/tst_qscriptextqobject.cpp | 111 +++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp index e9d2d1f..cb29586 100644 --- a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp +++ b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp @@ -543,6 +543,10 @@ private slots: void getSetStaticProperty_customGetterSetter(); void getSetStaticProperty_methodPersistence(); void getSetDynamicProperty(); + void getSetDynamicProperty_deleteFromCpp(); + void getSetDynamicProperty_hideChildObject(); + void getSetDynamicProperty_setBeforeGet(); + void getSetDynamicProperty_doNotHideJSProperty(); void getSetChildren(); void callQtInvokable(); void connectAndDisconnect(); @@ -555,6 +559,7 @@ private slots: void transferInvokable(); void findChild(); void findChildren(); + void childObjects(); void overloadedSlots(); void enumerate_data(); void enumerate(); @@ -1035,6 +1040,69 @@ void tst_QScriptExtQObject::getSetDynamicProperty() QCOMPARE(m_engine->evaluate("myObject.hasOwnProperty('dynamicProperty')").toBoolean(), false); } +void tst_QScriptExtQObject::getSetDynamicProperty_deleteFromCpp() +{ + QScriptValue val = m_engine->newQObject(m_myObject); + + m_myObject->setProperty("dynamicFromCpp", 1234); + QVERIFY(val.property("dynamicFromCpp").strictlyEquals(QScriptValue(m_engine, 1234))); + + m_myObject->setProperty("dynamicFromCpp", 4321); + QVERIFY(val.property("dynamicFromCpp").strictlyEquals(QScriptValue(m_engine, 4321))); + QCOMPARE(m_myObject->property("dynamicFromCpp").toInt(), 4321); + + // In this case we delete the property from C++ + m_myObject->setProperty("dynamicFromCpp", QVariant()); + QVERIFY(!m_myObject->property("dynamicFromCpp").isValid()); + QVERIFY(!val.property("dynamicFromCpp").isValid()); +} + +void tst_QScriptExtQObject::getSetDynamicProperty_hideChildObject() +{ + QScriptValue val = m_engine->newQObject(m_myObject); + + // Add our named child and access it + QObject *child = new QObject(m_myObject); + child->setObjectName("testName"); + QCOMPARE(val.property("testName").toQObject(), child); + + // Dynamic properties have precedence, hiding the child object + m_myObject->setProperty("testName", 42); + QVERIFY(val.property("testName").strictlyEquals(QScriptValue(m_engine, 42))); + + // Remove dynamic property + m_myObject->setProperty("testName", QVariant()); + QCOMPARE(val.property("testName").toQObject(), child); +} + +void tst_QScriptExtQObject::getSetDynamicProperty_setBeforeGet() +{ + QScriptValue val = m_engine->newQObject(m_myObject); + + m_myObject->setProperty("dynamic", 1111); + val.setProperty("dynamic", 42); + + QVERIFY(val.property("dynamic").strictlyEquals(QScriptValue(m_engine, 42))); + QCOMPARE(m_myObject->property("dynamic").toInt(), 42); +} + +void tst_QScriptExtQObject::getSetDynamicProperty_doNotHideJSProperty() +{ + QScriptValue val = m_engine->newQObject(m_myObject); + + // Set property on JS and dynamically on our QObject + val.setProperty("x", 42); + m_myObject->setProperty("x", 2222); + + QEXPECT_FAIL("", "", Continue); + + // JS should see the original JS value + QVERIFY(val.property("x").strictlyEquals(QScriptValue(m_engine, 42))); + + // The dynamic property is intact + QCOMPARE(m_myObject->property("x").toInt(), 2222); +} + void tst_QScriptExtQObject::getSetChildren() { QScriptValue mobj = m_engine->evaluate("myObject"); @@ -2661,6 +2729,49 @@ void tst_QScriptExtQObject::findChildren() delete child; } +void tst_QScriptExtQObject::childObjects() +{ + QObject *child1 = new QObject(m_myObject); + child1->setObjectName("child1"); + QObject *child2 = new QObject(m_myObject); + QScriptValue wrapped = m_engine->newQObject(m_myObject); + + QVERIFY(wrapped.property("child1").isQObject()); + QCOMPARE(wrapped.property("child1").toQObject(), child1); + QVERIFY(!wrapped.property("child2").isQObject()); + QVERIFY(!wrapped.property("child2").isValid()); + + // Setting the name later + child2->setObjectName("child2"); + + QVERIFY(wrapped.property("child1").isQObject()); + QCOMPARE(wrapped.property("child1").toQObject(), child1); + QVERIFY(wrapped.property("child2").isQObject()); + QCOMPARE(wrapped.property("child2").toQObject(), child2); + + // Adding a child later + QObject *child3 = new QObject(m_myObject); + child3->setObjectName("child3"); + + QVERIFY(wrapped.property("child3").isQObject()); + QCOMPARE(wrapped.property("child3").toQObject(), child3); + + // Changing a child name + child1->setObjectName("anotherName"); + + QVERIFY(!wrapped.property("child1").isValid()); + QVERIFY(wrapped.property("anotherName").isQObject()); + QCOMPARE(wrapped.property("anotherName").toQObject(), child1); + + // Creating another object wrapper excluding child from + // properties. + QScriptValue wrapped2 = m_engine->newQObject(m_myObject, QScriptEngine::QtOwnership, QScriptEngine::ExcludeChildObjects); + + QVERIFY(!wrapped2.property("anotherName").isValid()); + QVERIFY(!wrapped2.property("child2").isValid()); + QVERIFY(!wrapped2.property("child3").isValid()); +} + void tst_QScriptExtQObject::overloadedSlots() { // should pick myOverloadedSlot(double) -- cgit v0.12 From 74778205f6c5b905dd2194ec0ccb75a8c544f55c Mon Sep 17 00:00:00 2001 From: Harald Fernengel <harald.fernengel@nokia.com> Date: Wed, 19 Jan 2011 10:04:42 +0100 Subject: Allow hard-coding the Unix temp path This came as a requirement from a device manufacturer that couldn't agree whether tmp is /var/tmp or /tmp, which lead to all kinds of side effects. QSharedMemory token generation was broken depending on where TMPDIR pointed to. This patch allows hard-coding a Qt-wide temp-dir in qplatformdefs. Reviewed-by: Robert Griebl --- src/corelib/io/qfilesystemengine_unix.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 40fb0c0..6acd811 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -612,10 +612,14 @@ QString QFileSystemEngine::rootPath() QString QFileSystemEngine::tempPath() { +#ifdef QT_UNIX_TEMP_PATH_OVERRIDE + return QLatin1String(QT_UNIX_TEMP_PATH_OVERRIDE); +#else QString temp = QFile::decodeName(qgetenv("TMPDIR")); if (temp.isEmpty()) temp = QLatin1String("/tmp/"); return QDir::cleanPath(temp); +#endif } bool QFileSystemEngine::setCurrentPath(const QFileSystemEntry &path) -- cgit v0.12 From da35231f2046eddf18cb5492a31bfd247cbc361b Mon Sep 17 00:00:00 2001 From: Eckhart Koppen <eckhart.koppen@nokia.com> Date: Thu, 20 Jan 2011 15:59:49 +0200 Subject: Added initial set of .pkg files for Symbian SIS generation Reviewed-by: TrustMe --- config.profiles/symbian/qt.pkg | 96 ++++++++++++++++ config.profiles/symbian/qt_stub.pkg | 70 ++++++++++++ config.profiles/symbian/qtdemoapps.pkg | 203 +++++++++++++++++++++++++++++++++ 3 files changed, 369 insertions(+) create mode 100644 config.profiles/symbian/qt.pkg create mode 100644 config.profiles/symbian/qt_stub.pkg create mode 100644 config.profiles/symbian/qtdemoapps.pkg diff --git a/config.profiles/symbian/qt.pkg b/config.profiles/symbian/qt.pkg new file mode 100644 index 0000000..7bd1c59 --- /dev/null +++ b/config.profiles/symbian/qt.pkg @@ -0,0 +1,96 @@ +; Language +&EN + +; SIS header: name, uid, version +#{"Qt"},(0x2001E61C),4,8,0,TYPE=SA,RU + +; Manual PKG pre-rules from PRO files +; Default HW/platform dependencies +[0x101F7961],0,0,0,{"S60ProductID"} +[0x102032BE],0,0,0,{"S60ProductID"} +[0x102752AE],0,0,0,{"S60ProductID"} +[0x1028315F],0,0,0,{"S60ProductID"} + +; Localised Vendor name +%{"Nokia, Qt"} + +; Unique Vendor name +:"Nokia, Qt" + +; Dependencies of Qt libraries + +; DEPLOYMENT +"/epoc32/release/armv5/urel/QtCore.dll" - "!:\sys\bin\QtCore.dll" +"/epoc32/release/armv5/urel/QtXml.dll" - "!:\sys\bin\QtXml.dll" +"/epoc32/release/armv5/urel/QtGui.dll" - "!:\sys\bin\QtGui.dll" +"/epoc32/release/armv5/urel/QtNetwork.dll" - "!:\sys\bin\QtNetwork.dll" +"/epoc32/release/armv5/urel/qsymbianbearer.dll" - "!:\sys\bin\qsymbianbearer.dll" +"/epoc32/release/armv5/urel/QtTest.dll" - "!:\sys\bin\QtTest.dll" +"/epoc32/release/armv5/urel/QtSql.dll" - "!:\sys\bin\QtSql.dll" +"/epoc32/release/armv5/urel/QtSvg.dll" - "!:\sys\bin\QtSvg.dll" +"/epoc32/release/armv5/urel/QtScript.dll" - "!:\sys\bin\QtScript.dll" +"/epoc32/release/armv5/urel/QtOpenVG.dll" - "!:\sys\bin\QtOpenVG.dll" +"/epoc32/release/armv5/urel/QtOpenGL.dll" - "!:\sys\bin\QtOpenGL.dll" +"/epoc32/release/armv5/urel/phonon.dll" - "!:\sys\bin\phonon.dll" +"/epoc32/release/armv5/urel/QtMultimedia.dll" - "!:\sys\bin\QtMultimedia.dll" +"/epoc32/release/armv5/urel/QtDeclarative.dll" - "!:\sys\bin\QtDeclarative.dll" +"/epoc32/release/armv5/urel/QtXmlPatterns.dll" - "!:\sys\bin\QtXmlPatterns.dll" + +"/epoc32/release/armv5/urel/qjpeg.dll" - "!:\sys\bin\qjpeg.dll" +"/epoc32/data/z/resource/qt/plugins/imageformats/qjpeg.qtplugin" - "!:\resource\qt\plugins\imageformats\qjpeg.qtplugin" +"/epoc32/release/armv5/urel/qgif.dll" - "!:\sys\bin\qgif.dll" +"/epoc32/data/z/resource/qt/plugins/imageformats/qgif.qtplugin" - "!:\resource\qt\plugins\imageformats\qgif.qtplugin" +"/epoc32/release/armv5/urel/qmng.dll" - "!:\sys\bin\qmng.dll" +"/epoc32/data/z/resource/qt/plugins/imageformats/qmng.qtplugin" - "!:\resource\qt\plugins\imageformats\qmng.qtplugin" +"/epoc32/release/armv5/urel/qtiff.dll" - "!:\sys\bin\qtiff.dll" +"/epoc32/data/z/resource/qt/plugins/imageformats/qtiff.qtplugin" - "!:\resource\qt\plugins\imageformats\qtiff.qtplugin" +"/epoc32/release/armv5/urel/qico.dll" - "!:\sys\bin\qico.dll" +"/epoc32/data/z/resource/qt/plugins/imageformats/qico.qtplugin" - "!:\resource\qt\plugins\imageformats\qico.qtplugin" +"/epoc32/release/armv5/urel/qsvg.dll" - "!:\sys\bin\qsvg.dll" +"/epoc32/data/z/resource/qt/plugins/imageformats/qsvg.qtplugin" - "!:\resource\qt\plugins\imageformats\qsvg.qtplugin" +"/epoc32/release/armv5/urel/qcncodecs.dll" - "!:\sys\bin\qcncodecs.dll" +"/epoc32/data/z/resource/qt/plugins/codecs/qcncodecs.qtplugin" - "!:\resource\qt\plugins\codecs\qcncodecs.qtplugin" +"/epoc32/release/armv5/urel/qjpcodecs.dll" - "!:\sys\bin\qjpcodecs.dll" +"/epoc32/data/z/resource/qt/plugins/codecs/qjpcodecs.qtplugin" - "!:\resource\qt\plugins\codecs\qjpcodecs.qtplugin" +"/epoc32/release/armv5/urel/qtwcodecs.dll" - "!:\sys\bin\qtwcodecs.dll" +"/epoc32/data/z/resource/qt/plugins/codecs/qtwcodecs.qtplugin" - "!:\resource\qt\plugins\codecs\qtwcodecs.qtplugin" +"/epoc32/release/armv5/urel/qkrcodecs.dll" - "!:\sys\bin\qkrcodecs.dll" +"/epoc32/data/z/resource/qt/plugins/codecs/qkrcodecs.qtplugin" - "!:\resource\qt\plugins\codecs\qkrcodecs.qtplugin" +"/epoc32/release/armv5/urel/qvggraphicssystem.dll" - "!:\sys\bin\qvggraphicssystem.dll" +"/epoc32/data/z/resource/qt/plugins/graphicssystems/qvggraphicssystem.qtplugin" - "!:\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin" +"/epoc32/release/armv5/urel/qglgraphicssystem.dll" - "!:\sys\bin\qglgraphicssystem.dll" +"/epoc32/data/z/resource/qt/plugins/graphicssystems/qglgraphicssystem.qtplugin" - "!:\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin" +"/epoc32/release/armv5/urel/qsvgicon.dll" - "!:\sys\bin\qsvgicon.dll" +"/epoc32/data/z/resource/qt/plugins/iconengines/qsvgicon.qtplugin" - "!:\resource\qt\plugins\iconengines\qsvgicon.qtplugin" +"/epoc32/data/z/resource/qt/plugins/bearer/qsymbianbearer.qtplugin" - "c:\resource\qt\plugins\bearer\qsymbianbearer.qtplugin" + +"/epoc32/release/armv5/urel/qts60plugin_5_0.dll" - "!:\sys\bin\qts60plugin_5_0.dll" + +; localization +"/epoc32/data/z/resource/qt/translations/qt_ur.qm" - "!:\resource\qt\translations\qt_ur.qm" +"/epoc32/data/z/resource/qt/translations/qt_fa.qm" - "!:\resource\qt\translations\qt_fa.qm" +"/epoc32/data/z/resource/qt/translations/qt_ar.qm" - "!:\resource\qt\translations\qt_ar.qm" +"/epoc32/data/z/resource/qt/translations/qt_he.qm" - "!:\resource\qt\translations\qt_he.qm" + +"/epoc32/data/z/resource/qt/translations/qt_fr.qm" - "!:\resource\qt\translations\qt_fr.qm" +"/epoc32/data/z/resource/qt/translations/qt_pl.qm" - "!:\resource\qt\translations\qt_pl.qm" +"/epoc32/data/z/resource/qt/translations/qt_ru.qm" - "!:\resource\qt\translations\qt_ru.qm" +"/epoc32/data/z/resource/qt/translations/qt_zh_cn.qm" - "!:\resource\qt\translations\qt_zh_cn.qm" +"/epoc32/data/z/resource/qt/translations/qt_zh_tw.qm" - "!:\resource\qt\translations\qt_zh_tw.qm" + + + +"/epoc32/data/z/resource/qt/translations/qt_ar.qm" - "!:\resource\qt\translations\qt_ar.qm" +"/epoc32/data/z/resource/qt/translations/qt_cs.qm" - "!:\resource\qt\translations\qt_cs.qm" +"/epoc32/data/z/resource/qt/translations/qt_da.qm" - "!:\resource\qt\translations\qt_da.qm" +"/epoc32/data/z/resource/qt/translations/qt_de.qm" - "!:\resource\qt\translations\qt_de.qm" + +"/epoc32/data/z/resource/qt/translations/qt_es.qm" - "!:\resource\qt\translations\qt_es.qm" +"/epoc32/data/z/resource/qt/translations/qt_gl.qm" - "!:\resource\qt\translations\qt_gl.qm" +"/epoc32/data/z/resource/qt/translations/qt_hu.qm" - "!:\resource\qt\translations\qt_hu.qm" +"/epoc32/data/z/resource/qt/translations/qt_ja.qm" - "!:\resource\qt\translations\qt_ja.qm" +"/epoc32/data/z/resource/qt/translations/qt_pt.qm" - "!:\resource\qt\translations\qt_pt.qm" +"/epoc32/data/z/resource/qt/translations/qt_sk.qm" - "!:\resource\qt\translations\qt_sk.qm" +"/epoc32/data/z/resource/qt/translations/qt_sl.qm" - "!:\resource\qt\translations\qt_sl.qm" +"/epoc32/data/z/resource/qt/translations/qt_sv.qm" - "!:\resource\qt\translations\qt_sv.qm" +"/epoc32/data/z/resource/qt/translations/qt_uk.qm" - "!:\resource\qt\translations\qt_uk.qm" \ No newline at end of file diff --git a/config.profiles/symbian/qt_stub.pkg b/config.profiles/symbian/qt_stub.pkg new file mode 100644 index 0000000..dadf696 --- /dev/null +++ b/config.profiles/symbian/qt_stub.pkg @@ -0,0 +1,70 @@ +; Language +&EN + + +; SIS header: name, uid, version +#{"Qt"},(0x2001E61C),4,8,0 + + +; Manual PKG pre-rules from PRO files +; Default HW/platform dependencies + +; Localised Vendor name +%{"Nokia, Qt"} + +; Unique Vendor name +:"Nokia, Qt" + +; Dependencies of Qt libraries + +"" - "z:\sys\bin\QtCore.dll" +"" - "z:\sys\bin\QtXml.dll" +"" - "z:\sys\bin\QtGui.dll" +"" - "z:\sys\bin\QtNetwork.dll" +"" - "z:\sys\bin\QtTest.dll" +"" - "z:\sys\bin\QtSql.dll" +"" - "z:\sys\bin\QtSvg.dll" +"" - "z:\sys\bin\phonon.dll" +"" - "z:\sys\bin\QtScript.dll" +"" - "z:\sys\bin\QtXmlPatterns.dll" +"" - "z:\sys\bin\QtDeclarative.dll" +"" - "z:\sys\bin\QtOpenVG.dll" +"" - "z:\sys\bin\QtOpenGL.dll" +"" - "z:\sys\bin\QtMultimedia.dll" +"" - "z:\private\10202D56\import\packages\2001E61C\backup_registration.xml" +"" - "z:\sys\bin\qjpeg.dll" +"" - "z:\resource\qt\plugins\imageformats\qjpeg.qtplugin" +"" - "z:\sys\bin\qgif.dll" +"" - "z:\resource\qt\plugins\imageformats\qgif.qtplugin" +"" - "z:\sys\bin\qmng.dll" +"" - "z:\resource\qt\plugins\imageformats\qmng.qtplugin" +"" - "z:\sys\bin\qtiff.dll" +"" - "z:\resource\qt\plugins\imageformats\qtiff.qtplugin" +"" - "z:\sys\bin\qico.dll" +"" - "z:\resource\qt\plugins\imageformats\qico.qtplugin" +"" - "z:\sys\bin\qsvg.dll" +"" - "z:\resource\qt\plugins\imageformats\qsvg.qtplugin" +"" - "z:\sys\bin\qcncodecs.dll" +"" - "z:\resource\qt\plugins\codecs\qcncodecs.qtplugin" +"" - "z:\sys\bin\qjpcodecs.dll" +"" - "z:\resource\qt\plugins\codecs\qjpcodecs.qtplugin" +"" - "z:\sys\bin\qtwcodecs.dll" +"" - "z:\resource\qt\plugins\codecs\qtwcodecs.qtplugin" +"" - "z:\sys\bin\qkrcodecs.dll" +"" - "z:\resource\qt\plugins\codecs\qkrcodecs.qtplugin" +"" - "z:\sys\bin\qvggraphicssystem.dll" +"" - "z:\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin" +"" - "z:\sys\bin\qglgraphicssystem.dll" +"" - "z:\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin" +"" - "z:\sys\bin\qsvgicon.dll" +"" - "z:\resource\qt\plugins\iconengines\qsvgicon.qtplugin" +"" - "z:\sys\bin\qmlfolderlistmodelplugin.dll" +"" - "z:\resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin" +"" - "z:\resource\qt\imports\Qt\labs\folderlistmodel\qmldir" +"" - "z:\sys\bin\qmlgesturesplugin.dll" +"" - "z:\resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin" +"" - "z:\resource\qt\imports\Qt\labs\gestures\qmldir" +"" - "z:\sys\bin\qmlparticlesplugin.dll" +"" - "z:\resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin" +"" - "z:\resource\qt\imports\Qt\labs\particles\qmldir" + diff --git a/config.profiles/symbian/qtdemoapps.pkg b/config.profiles/symbian/qtdemoapps.pkg new file mode 100644 index 0000000..e03989a --- /dev/null +++ b/config.profiles/symbian/qtdemoapps.pkg @@ -0,0 +1,203 @@ +; Language +&EN + +; SIS header: name, uid, version +#{"Qtdemo"},(0xE001E61C),4,8,0,TYPE=SA + +; Localised Vendor name +%{"Nokia, Qt"} + +; Unique Vendor name +:"Nokia, Qt" + +"/epoc32/release/armv5/urel/star.exe" - "!:\sys\bin\star.exe" +"/epoc32/data/z/resource/apps/star.rsc" - "!:\resource\apps\star.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/star_reg.rsc" - "!:\private\10003a3f\import\apps\star_reg.rsc" + +"/epoc32/release/armv5/urel/wiggly.exe" - "!:\sys\bin\wiggly.exe" +"/epoc32/data/z/resource/apps/wiggly.rsc" - "!:\resource\apps\wiggly.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/wiggly_reg.rsc" - "!:\private\10003a3f\import\apps\wiggly_reg.rsc" + +"/epoc32/release/armv5/urel/animatedtiles.exe" - "!:\sys\bin\animatedtiles.exe" +"/epoc32/data/z/resource/apps/animatedtiles.rsc" - "!:\resource\apps\animatedtiles.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/animatedtiles_reg.rsc" - "!:\private\10003a3f\import\apps\animatedtiles_reg.rsc" + +"/epoc32/release/armv5/urel/collidingmice.exe" - "!:\sys\bin\collidingmice.exe" +"/epoc32/data/z/resource/apps/collidingmice.rsc" - "!:\resource\apps\collidingmice.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/collidingmice_reg.rsc" - "!:\private\10003a3f\import\apps\collidingmice_reg.rsc" + +"/epoc32/release/armv5/urel/addressbook.exe" - "!:\sys\bin\addressbook.exe" +"/epoc32/data/z/resource/apps/addressbook.rsc" - "!:\resource\apps\addressbook.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/addressbook_reg.rsc" - "!:\private\10003a3f\import\apps\addressbook_reg.rsc" + +"/epoc32/release/armv5/urel/svgviewer.exe" - "!:\sys\bin\svgviewer.exe" +"/epoc32/data/z/resource/apps/svgviewer.rsc" - "!:\resource\apps\svgviewer.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/svgviewer_reg.rsc" - "!:\private\10003a3f\import\apps\svgviewer_reg.rsc" + +"/epoc32/release/armv5/urel/analogclock.exe" - "!:\sys\bin\analogclock.exe" +"/epoc32/data/z/resource/apps/analogclock.rsc" - "!:\resource\apps\analogclock.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/analogclock_reg.rsc" - "!:\private\10003a3f\import\apps\analogclock_reg.rsc" + +"/epoc32/release/armv5/urel/imagegestures.exe" - "!:\sys\bin\imagegestures.exe" +"/epoc32/data/z/resource/apps/imagegestures.rsc" - "!:\resource\apps\imagegestures.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/imagegestures_reg.rsc" - "!:\private\10003a3f\import\apps\imagegestures_reg.rsc" + +"/epoc32/release/armv5/urel/qftp.exe" - "!:\sys\bin\qftp.exe" +"/epoc32/data/z/resource/apps/qftp.rsc" - "!:\resource\apps\qftp.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/qftp_reg.rsc" - "!:\private\10003a3f\import\apps\qftp_reg.rsc" + +"/epoc32/release/armv5/urel/masterdetail.exe" - "!:\sys\bin\masterdetail.exe" +"/epoc32/data/z/resource/apps/masterdetail.rsc" - "!:\resource\apps\masterdetail.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/masterdetail_reg.rsc" - "!:\private\10003a3f\import\apps\masterdetail_reg.rsc" + +"/epoc32/release/armv5/urel/previewer.exe" - "!:\sys\bin\previewer.exe" +"/epoc32/data/z/resource/apps/previewer.rsc" - "!:\resource\apps\previewer.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/previewer_reg.rsc" - "!:\private\10003a3f\import\apps\previewer_reg.rsc" + +"/epoc32/release/armv5/urel/anomaly.exe" - "!:\sys\bin\anomaly.exe" +"/epoc32/data/z/resource/apps/anomaly.rsc" - "!:\resource\apps\anomaly.rsc" +"/epoc32/data/Z/private/10003a3f/import/Apps/anomaly_reg.rsc" - "!:\private\10003a3f\import\apps\anomaly_reg.rsc" + +;qmlcalculator +; Executable and default resource files +"/epoc32/release/armv5/urel/qmlcalculator.exe" - "!:\sys\bin\qmlcalculator.exe" +"/epoc32/data/z/resource/apps/qmlcalculator.rsc" - "!:\resource\apps\qmlcalculator.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/qmlcalculator_reg.rsc" - "!:\private\10003a3f\import\apps\qmlcalculator_reg.rsc" +"/epoc32/data/z/resource/apps/qmlcalculator.mif" - "!:\resource\apps\qmlcalculator.mif" + +; DEPLOYMENT +"/epoc32/data/z/private/A000E3FB/calculator.qml" - "!:\private\A000E3FB\calculator.qml" +"/epoc32/data/z/private/A000E3FB/Core/Button.qml" - "!:\private\A000E3FB\Core\Button.qml" +"/epoc32/data/z/private/A000E3FB/Core/calculator.js" - "!:\private\A000E3FB\Core\calculator.js" +"/epoc32/data/z/private/A000E3FB/Core/Display.qml" - "!:\private\A000E3FB\Core\Display.qml" +"/epoc32/data/z/private/A000E3FB/Core/images/button-.png" - "!:\private\A000E3FB\Core\images\button-.png" +"/epoc32/data/z/private/A000E3FB/Core/images/button-blue.png" - "!:\private\A000E3FB\Core\images\button-blue.png" +"/epoc32/data/z/private/A000E3FB/Core/images/button-green.png" - "!:\private\A000E3FB\Core\images\button-green.png" +"/epoc32/data/z/private/A000E3FB/Core/images/button-purple.png" - "!:\private\A000E3FB\Core\images\button-purple.png" +"/epoc32/data/z/private/A000E3FB/Core/images/button-red.png" - "!:\private\A000E3FB\Core\images\button-red.png" +"/epoc32/data/z/private/A000E3FB/Core/images/display.png" - "!:\private\A000E3FB\Core\images\display.png" +"/epoc32/data/z/private/A000E3FB/Core/qmldir" - "!:\private\A000E3FB\Core\qmldir" + +;qmlclocks +; Executable and default resource files +"/epoc32/release/armv5/urel/qmlclocks.exe" - "!:\sys\bin\qmlclocks.exe" +"/epoc32/data/z/resource/apps/qmlclocks.rsc" - "!:\resource\apps\qmlclocks.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/qmlclocks_reg.rsc" - "!:\private\10003a3f\import\apps\qmlclocks_reg.rsc" +"/epoc32/data/z/resource/apps/qmlclocks.mif" - "!:\resource\apps\qmlclocks.mif" + +; DEPLOYMENT +"/epoc32/data/z/private/A000E3FC/clocks.qml" - "!:\private\A000E3FC\clocks.qml" +"/epoc32/data/z/private/A000E3FC/content/background.png" - "!:\private\A000E3FC\content\background.png" +"/epoc32/data/z/private/A000E3FC/content/center.png" - "!:\private\A000E3FC\content\center.png" +"/epoc32/data/z/private/A000E3FC/content/clock-night.png" - "!:\private\A000E3FC\content\clock-night.png" +"/epoc32/data/z/private/A000E3FC/content/clock.png" - "!:\private\A000E3FC\content\clock.png" +"/epoc32/data/z/private/A000E3FC/content/Clock.qml" - "!:\private\A000E3FC\content\Clock.qml" +"/epoc32/data/z/private/A000E3FC/content/hour.png" - "!:\private\A000E3FC\content\hour.png" +"/epoc32/data/z/private/A000E3FC/content/minute.png" - "!:\private\A000E3FC\content\minute.png" +"/epoc32/data/z/private/A000E3FC/content/second.png" - "!:\private\A000E3FC\content\second.png" + +;qmldialcontrol +; Executable and default resource files +"/epoc32/release/armv5/urel/qmldialcontrol.exe" - "!:\sys\bin\qmldialcontrol.exe" +"/epoc32/data/z/resource/apps/qmldialcontrol.rsc" - "!:\resource\apps\qmldialcontrol.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/qmldialcontrol_reg.rsc" - "!:\private\10003a3f\import\apps\qmldialcontrol_reg.rsc" +"/epoc32/data/z/resource/apps/qmldialcontrol.mif" - "!:\resource\apps\qmldialcontrol.mif" + +; DEPLOYMENT +"/epoc32/data/z/private/A000E3FD/dialcontrol.qml" - "!:\private\A000E3FD\dialcontrol.qml" +"/epoc32/data/z/private/A000E3FD/content/background.png" - "!:\private\A000E3FD\content\background.png" +"/epoc32/data/z/private/A000E3FD/content/Dial.qml" - "!:\private\A000E3FD\content\Dial.qml" +"/epoc32/data/z/private/A000E3FD/content/needle.png" - "!:\private\A000E3FD\content\needle.png" +"/epoc32/data/z/private/A000E3FD/content/needle_shadow.png" - "!:\private\A000E3FD\content\needle_shadow.png" +"/epoc32/data/z/private/A000E3FD/content/overlay.png" - "!:\private\A000E3FD\content\overlay.png" + +;qmleasing +; Executable and default resource files +"/epoc32/release/armv5/urel/qmleasing.exe" - "!:\sys\bin\qmleasing.exe" +"/epoc32/data/z/resource/apps/qmleasing.rsc" - "!:\resource\apps\qmleasing.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/qmleasing_reg.rsc" - "!:\private\10003a3f\import\apps\qmleasing_reg.rsc" +"/epoc32/data/z/resource/apps/qmleasing.mif" - "!:\resource\apps\qmleasing.mif" + +; DEPLOYMENT +"/epoc32/data/z/private/A000E3FE/easing.qml" - "!:\private\A000E3FE\easing.qml" + +;qmlflickr +; Executable and default resource files +"/epoc32/release/armv5/urel/qmlflickr.exe" - "!:\sys\bin\qmlflickr.exe" +"/epoc32/data/z/resource/apps/qmlflickr.rsc" - "!:\resource\apps\qmlflickr.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/qmlflickr_reg.rsc" - "!:\private\10003a3f\import\apps\qmlflickr_reg.rsc" +"/epoc32/data/z/resource/apps/qmlflickr.mif" - "!:\resource\apps\qmlflickr.mif" + +; DEPLOYMENT +"/epoc32/data/z/private/A000E3FF/flickr.qml" - "!:\private\A000E3FF\flickr.qml" +"/epoc32/data/z/private/A000E3FF/common/Progress.qml" - "!:\private\A000E3FF\common\Progress.qml" +"/epoc32/data/z/private/A000E3FF/common/qmldir" - "!:\private\A000E3FF\common\qmldir" +"/epoc32/data/z/private/A000E3FF/common/RssModel.qml" - "!:\private\A000E3FF\common\RssModel.qml" +"/epoc32/data/z/private/A000E3FF/common/ScrollBar.qml" - "!:\private\A000E3FF\common\ScrollBar.qml" +"/epoc32/data/z/private/A000E3FF/common/Slider.qml" - "!:\private\A000E3FF\common\Slider.qml" +"/epoc32/data/z/private/A000E3FF/mobile/Button.qml" - "!:\private\A000E3FF\mobile\Button.qml" +"/epoc32/data/z/private/A000E3FF/mobile/GridDelegate.qml" - "!:\private\A000E3FF\mobile\GridDelegate.qml" +"/epoc32/data/z/private/A000E3FF/mobile/ImageDetails.qml" - "!:\private\A000E3FF\mobile\ImageDetails.qml" +"/epoc32/data/z/private/A000E3FF/mobile/images/gloss.png" - "!:\private\A000E3FF\mobile\images\gloss.png" +"/epoc32/data/z/private/A000E3FF/mobile/images/lineedit.png" - "!:\private\A000E3FF\mobile\images\lineedit.png" +"/epoc32/data/z/private/A000E3FF/mobile/images/lineedit.sci" - "!:\private\A000E3FF\mobile\images\lineedit.sci" +"/epoc32/data/z/private/A000E3FF/mobile/images/quit.png" - "!:\private\A000E3FF\mobile\images\quit.png" +"/epoc32/data/z/private/A000E3FF/mobile/images/stripes.png" - "!:\private\A000E3FF\mobile\images\stripes.png" +"/epoc32/data/z/private/A000E3FF/mobile/images/titlebar.png" - "!:\private\A000E3FF\mobile\images\titlebar.png" +"/epoc32/data/z/private/A000E3FF/mobile/images/titlebar.sci" - "!:\private\A000E3FF\mobile\images\titlebar.sci" +"/epoc32/data/z/private/A000E3FF/mobile/images/toolbutton.png" - "!:\private\A000E3FF\mobile\images\toolbutton.png" +"/epoc32/data/z/private/A000E3FF/mobile/images/toolbutton.sci" - "!:\private\A000E3FF\mobile\images\toolbutton.sci" +"/epoc32/data/z/private/A000E3FF/mobile/ListDelegate.qml" - "!:\private\A000E3FF\mobile\ListDelegate.qml" +"/epoc32/data/z/private/A000E3FF/mobile/TitleBar.qml" - "!:\private\A000E3FF\mobile\TitleBar.qml" +"/epoc32/data/z/private/A000E3FF/mobile/ToolBar.qml" - "!:\private\A000E3FF\mobile\ToolBar.qml" + +;qmlphotoviewer +; Executable and default resource files +"/epoc32/release/armv5/urel/qmlphotoviewer.exe" - "!:\sys\bin\qmlphotoviewer.exe" +"/epoc32/data/z/resource/apps/qmlphotoviewer.rsc" - "!:\resource\apps\qmlphotoviewer.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/qmlphotoviewer_reg.rsc" - "!:\private\10003a3f\import\apps\qmlphotoviewer_reg.rsc" +"/epoc32/data/z/resource/apps/qmlphotoviewer.mif" - "!:\resource\apps\qmlphotoviewer.mif" + +; DEPLOYMENT +"/epoc32/data/z/private/A000E400/photoviewer.qml" - "!:\private\A000E400\photoviewer.qml" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/AlbumDelegate.qml" - "!:\private\A000E400\PhotoViewerCore\AlbumDelegate.qml" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/BusyIndicator.qml" - "!:\private\A000E400\PhotoViewerCore\BusyIndicator.qml" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/Button.qml" - "!:\private\A000E400\PhotoViewerCore\Button.qml" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/EditableButton.qml" - "!:\private\A000E400\PhotoViewerCore\EditableButton.qml" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/images/box-shadow.png" - "!:\private\A000E400\PhotoViewerCore\images\box-shadow.png" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/images/busy.png" - "!:\private\A000E400\PhotoViewerCore\images\busy.png" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/images/cardboard.png" - "!:\private\A000E400\PhotoViewerCore\images\cardboard.png" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/PhotoDelegate.qml" - "!:\private\A000E400\PhotoViewerCore\PhotoDelegate.qml" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/ProgressBar.qml" - "!:\private\A000E400\PhotoViewerCore\ProgressBar.qml" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/qmldir" - "!:\private\A000E400\PhotoViewerCore\qmldir" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/RssModel.qml" - "!:\private\A000E400\PhotoViewerCore\RssModel.qml" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/script/script.js" - "!:\private\A000E400\PhotoViewerCore\script\script.js" +"/epoc32/data/z/private/A000E400/PhotoViewerCore/Tag.qml" - "!:\private\A000E400\PhotoViewerCore\Tag.qml" + +; qmltwitter +; Executable and default resource files +"/epoc32/release/armv5/urel/qmltwitter.exe" - "!:\sys\bin\qmltwitter.exe" +"/epoc32/data/z/resource/apps/qmltwitter.rsc" - "!:\resource\apps\qmltwitter.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/qmltwitter_reg.rsc" - "!:\private\10003a3f\import\apps\qmltwitter_reg.rsc" +"/epoc32/data/z/resource/apps/qmltwitter.mif" - "!:\resource\apps\qmltwitter.mif" + +; DEPLOYMENT +"/epoc32/data/z/private/A000E401/twitter.qml" - "!:\private\A000E401\twitter.qml" +"/epoc32/data/z/private/A000E401/TwitterCore/Button.qml" - "!:\private\A000E401\TwitterCore\Button.qml" +"/epoc32/data/z/private/A000E401/TwitterCore/FatDelegate.qml" - "!:\private\A000E401\TwitterCore\FatDelegate.qml" +"/epoc32/data/z/private/A000E401/TwitterCore/images/gloss.png" - "!:\private\A000E401\TwitterCore\images\gloss.png" +"/epoc32/data/z/private/A000E401/TwitterCore/images/lineedit.png" - "!:\private\A000E401\TwitterCore\images\lineedit.png" +"/epoc32/data/z/private/A000E401/TwitterCore/images/lineedit.sci" - "!:\private\A000E401\TwitterCore\images\lineedit.sci" +"/epoc32/data/z/private/A000E401/TwitterCore/images/loading.png" - "!:\private\A000E401\TwitterCore\images\loading.png" +"/epoc32/data/z/private/A000E401/TwitterCore/images/stripes.png" - "!:\private\A000E401\TwitterCore\images\stripes.png" +"/epoc32/data/z/private/A000E401/TwitterCore/images/titlebar.png" - "!:\private\A000E401\TwitterCore\images\titlebar.png" +"/epoc32/data/z/private/A000E401/TwitterCore/images/titlebar.sci" - "!:\private\A000E401\TwitterCore\images\titlebar.sci" +"/epoc32/data/z/private/A000E401/TwitterCore/images/toolbutton.png" - "!:\private\A000E401\TwitterCore\images\toolbutton.png" +"/epoc32/data/z/private/A000E401/TwitterCore/images/toolbutton.sci" - "!:\private\A000E401\TwitterCore\images\toolbutton.sci" +"/epoc32/data/z/private/A000E401/TwitterCore/Loading.qml" - "!:\private\A000E401\TwitterCore\Loading.qml" +"/epoc32/data/z/private/A000E401/TwitterCore/MultiTitleBar.qml" - "!:\private\A000E401\TwitterCore\MultiTitleBar.qml" +"/epoc32/data/z/private/A000E401/TwitterCore/qmldir" - "!:\private\A000E401\TwitterCore\qmldir" +"/epoc32/data/z/private/A000E401/TwitterCore/RssModel.qml" - "!:\private\A000E401\TwitterCore\RssModel.qml" +"/epoc32/data/z/private/A000E401/TwitterCore/TitleBar.qml" - "!:\private\A000E401\TwitterCore\TitleBar.qml" +"/epoc32/data/z/private/A000E401/TwitterCore/ToolBar.qml" - "!:\private\A000E401\TwitterCore\ToolBar.qml" +"/epoc32/data/z/private/A000E401/TwitterCore/UserModel.qml" - "!:\private\A000E401\TwitterCore\UserModel.qml" -- cgit v0.12 From b47c43e8774cf0126c53dd71dc8969dfeab84405 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Wed, 19 Jan 2011 15:35:55 +0100 Subject: don't assign MANIFEST_DIR if we don't need it avoids warnings with qmake -Wall about overriding the variable (as typically both scripts are in CONFIG, but only one is actually used). Task-number: QTBUG-13911 Reviewed-by: mariusSO --- mkspecs/features/win32/embed_manifest_dll.prf | 4 ++-- mkspecs/features/win32/embed_manifest_exe.prf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mkspecs/features/win32/embed_manifest_dll.prf b/mkspecs/features/win32/embed_manifest_dll.prf index e8711da..69c9d1d 100644 --- a/mkspecs/features/win32/embed_manifest_dll.prf +++ b/mkspecs/features/win32/embed_manifest_dll.prf @@ -1,6 +1,6 @@ -MANIFEST_DIR = $$OBJECTS_DIR -isEmpty(MANIFEST_DIR):MANIFEST_DIR = . !if(plugin:no_plugin_manifest):if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):!static:!equals(TEMPLATE_PREFIX, "vc"):equals(TEMPLATE, "lib") { + MANIFEST_DIR = $$OBJECTS_DIR + isEmpty(MANIFEST_DIR):MANIFEST_DIR = . NOPATH_TARGET = $$TARGET NOPATH_TARGET ~= s,\\\\ , ,q # Remove space escaping (NOPATH_TARGET is quoted) NOPATH_TARGET ~= s,\\\\,/,g # Change to single type separators diff --git a/mkspecs/features/win32/embed_manifest_exe.prf b/mkspecs/features/win32/embed_manifest_exe.prf index 2d1c09b..44aadfa 100644 --- a/mkspecs/features/win32/embed_manifest_exe.prf +++ b/mkspecs/features/win32/embed_manifest_exe.prf @@ -1,6 +1,6 @@ -MANIFEST_DIR = $$OBJECTS_DIR -isEmpty(MANIFEST_DIR):MANIFEST_DIR = . if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):!equals(TEMPLATE_PREFIX, "vc"):equals(TEMPLATE, "app") { + MANIFEST_DIR = $$OBJECTS_DIR + isEmpty(MANIFEST_DIR):MANIFEST_DIR = . NOPATH_TARGET = $$TARGET NOPATH_TARGET ~= s,\\\\ , ,q # Remove space escaping (NOPATH_TARGET is quoted) NOPATH_TARGET ~= s,\\\\,/,g # Change to single type separators -- cgit v0.12 From 6551a2933126cc86ac4c1e5265e967100d240fb0 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Thu, 20 Jan 2011 12:07:14 +0100 Subject: don't include harfbuzz where we don't use it this only added extra noise to the output... Merge-request: 1028 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Reviewed-by: mariusSO --- src/declarative/declarative.pro | 2 -- src/opengl/opengl.pro | 2 -- src/openvg/openvg.pro | 2 -- src/plugins/graphicssystems/trace/trace.pro | 1 - src/svg/svg.pro | 2 -- 5 files changed, 9 deletions(-) diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro index 1ad888b..d2c035c 100644 --- a/src/declarative/declarative.pro +++ b/src/declarative/declarative.pro @@ -30,5 +30,3 @@ symbian: { } DEFINES += QT_NO_OPENTYPE -INCLUDEPATH += ../3rdparty/harfbuzz/src - diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro index 0e82467..45cb750 100644 --- a/src/opengl/opengl.pro +++ b/src/opengl/opengl.pro @@ -156,5 +156,3 @@ symbian { symbian:TARGET.UID3 = 0x2002131A } - -INCLUDEPATH += ../3rdparty/harfbuzz/src diff --git a/src/openvg/openvg.pro b/src/openvg/openvg.pro index c05af90..619646f 100644 --- a/src/openvg/openvg.pro +++ b/src/openvg/openvg.pro @@ -60,5 +60,3 @@ contains(QT_CONFIG, openvg_on_opengl) { !isEmpty(QMAKE_LIBDIR_OPENGL): LIBS_PRIVATE += -L$$QMAKE_LIBDIR_OPENGL !isEmpty(QMAKE_LIBS_OPENGL): LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL } - -INCLUDEPATH += ../3rdparty/harfbuzz/src diff --git a/src/plugins/graphicssystems/trace/trace.pro b/src/plugins/graphicssystems/trace/trace.pro index 07472e2..e57b015 100644 --- a/src/plugins/graphicssystems/trace/trace.pro +++ b/src/plugins/graphicssystems/trace/trace.pro @@ -10,4 +10,3 @@ SOURCES = main.cpp qgraphicssystem_trace.cpp target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems INSTALLS += target -INCLUDEPATH += ../../../3rdparty/harfbuzz/src diff --git a/src/svg/svg.pro b/src/svg/svg.pro index 7b5251a..4cd8b8b 100644 --- a/src/svg/svg.pro +++ b/src/svg/svg.pro @@ -38,8 +38,6 @@ SOURCES += \ qgraphicssvgitem.cpp \ qsvggenerator.cpp -INCLUDEPATH += ../3rdparty/harfbuzz/src - symbian:TARGET.UID3=0x2001B2E2 include(../3rdparty/zlib_dependency.pri) -- cgit v0.12 From e0c2861976e06658a1d651941310407c15b0bcde Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Thu, 20 Jan 2011 12:08:41 +0100 Subject: fix build with -opengl es1 in some cases try <GLES/egl.h> first, and if that fails, try <EGL/egl.h>. if CFG_EGL_GLES_INCLUDES is "no", then QT_GLES_EGL is not defined and type re-definitions in GLES/egltypes.h and EGL/egl.h might occur later. Merge-request: 1027 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Reviewed-by: mariusSO --- configure | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 6c50484..0845b31 100755 --- a/configure +++ b/configure @@ -6058,14 +6058,14 @@ fi # QWS if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then if [ "$CFG_EGL" != "no" ]; then # detect EGL support - if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl" "EGL (EGL/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then - # EGL specified by QMAKE_*_EGL, included with <EGL/egl.h> - CFG_EGL=yes - CFG_EGL_GLES_INCLUDES=no - elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl4gles1" "EGL (GLES/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then + if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl4gles1" "EGL (GLES/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then # EGL specified by QMAKE_*_EGL, included with <GLES/egl.h> CFG_EGL=yes CFG_EGL_GLES_INCLUDES=yes + elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl" "EGL (EGL/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then + # EGL specified by QMAKE_*_EGL, included with <EGL/egl.h> + CFG_EGL=yes + CFG_EGL_GLES_INCLUDES=no else if [ "$CFG_EGL" = "yes" ]; then echo "The EGL functionality test failed!" -- cgit v0.12 From de84d6420ab95fe82d3375110b8437ba0f6706a7 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Thu, 20 Jan 2011 16:02:42 +0100 Subject: be more consistent about CFG_EGL_GLES_INCLUDES interpretation !"no" != "yes"; use the same condition in both places Merge-request: 1027 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Reviewed-by: mariusSO --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 0845b31..28d9cf9 100755 --- a/configure +++ b/configure @@ -8310,7 +8310,7 @@ else echo "OpenGL support ......... no" fi if [ "$CFG_EGL" != "no" ]; then - if [ "$CFG_EGL_GLES_INCLUDES" != "no" ]; then + if [ "$CFG_EGL_GLES_INCLUDES" = "yes" ]; then echo "EGL support ............ yes <GLES/egl.h>" else echo "EGL support ............ yes <EGL/egl.h>" -- cgit v0.12 From e7b4a1ce63b2ef7215627d29921990663af71e01 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Thu, 20 Jan 2011 16:21:40 +0100 Subject: don't accidentaly enable egl when disabling openvg Merge-request: 1027 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Reviewed-by: mariusSO --- configure | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 28d9cf9..dfbf9bd 100755 --- a/configure +++ b/configure @@ -1266,7 +1266,9 @@ while [ "$#" -gt 0 ]; do openvg) if [ "$VAL" = "auto" ] || [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then CFG_OPENVG="$VAL" - CFG_EGL="auto" + if [ "$CFG_EGL" = "no" ] && [ "$VAL" != "no" ]; then + CFG_EGL=auto + fi else UNKNOWN_OPT=yes fi -- cgit v0.12 From de155ecd2b16d9356a19baeb875539a20b36a17c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Thu, 20 Jan 2011 18:26:43 +0100 Subject: Revert "don't include harfbuzz where we don't use it" harfbuzz is indirectly included via qharfbuzz_p.h, which is included by qtextengine_p.h, which in turn is included by qfontengine_p.h and qpaintbuffer_p.h. This reverts commit 6551a2933126cc86ac4c1e5265e967100d240fb0. --- src/declarative/declarative.pro | 2 ++ src/opengl/opengl.pro | 2 ++ src/openvg/openvg.pro | 2 ++ src/plugins/graphicssystems/trace/trace.pro | 1 + src/svg/svg.pro | 2 ++ 5 files changed, 9 insertions(+) diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro index d2c035c..1ad888b 100644 --- a/src/declarative/declarative.pro +++ b/src/declarative/declarative.pro @@ -30,3 +30,5 @@ symbian: { } DEFINES += QT_NO_OPENTYPE +INCLUDEPATH += ../3rdparty/harfbuzz/src + diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro index 45cb750..0e82467 100644 --- a/src/opengl/opengl.pro +++ b/src/opengl/opengl.pro @@ -156,3 +156,5 @@ symbian { symbian:TARGET.UID3 = 0x2002131A } + +INCLUDEPATH += ../3rdparty/harfbuzz/src diff --git a/src/openvg/openvg.pro b/src/openvg/openvg.pro index 619646f..c05af90 100644 --- a/src/openvg/openvg.pro +++ b/src/openvg/openvg.pro @@ -60,3 +60,5 @@ contains(QT_CONFIG, openvg_on_opengl) { !isEmpty(QMAKE_LIBDIR_OPENGL): LIBS_PRIVATE += -L$$QMAKE_LIBDIR_OPENGL !isEmpty(QMAKE_LIBS_OPENGL): LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL } + +INCLUDEPATH += ../3rdparty/harfbuzz/src diff --git a/src/plugins/graphicssystems/trace/trace.pro b/src/plugins/graphicssystems/trace/trace.pro index e57b015..07472e2 100644 --- a/src/plugins/graphicssystems/trace/trace.pro +++ b/src/plugins/graphicssystems/trace/trace.pro @@ -10,3 +10,4 @@ SOURCES = main.cpp qgraphicssystem_trace.cpp target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems INSTALLS += target +INCLUDEPATH += ../../../3rdparty/harfbuzz/src diff --git a/src/svg/svg.pro b/src/svg/svg.pro index 4cd8b8b..7b5251a 100644 --- a/src/svg/svg.pro +++ b/src/svg/svg.pro @@ -38,6 +38,8 @@ SOURCES += \ qgraphicssvgitem.cpp \ qsvggenerator.cpp +INCLUDEPATH += ../3rdparty/harfbuzz/src + symbian:TARGET.UID3=0x2001B2E2 include(../3rdparty/zlib_dependency.pri) -- cgit v0.12 From 8c3086aa36b51a9731fce8eb8146b33ab8196aed Mon Sep 17 00:00:00 2001 From: Bea Lam <bea.lam@nokia.com> Date: Fri, 21 Jan 2011 11:39:28 +1000 Subject: Revert "Fix loaded() signal to be emitted only once" This reverts commit 82ff3f484c7ec49e60b7fddf23794937974a6768. QTBUG-16796 reports that this commit is causing regressions relating to initial sizing of items. Task-number: QTBUG-16796 --- .../graphicsitems/qdeclarativeloader.cpp | 60 +++++++------- .../graphicsitems/qdeclarativeloader_p_p.h | 2 - .../qdeclarativeloader/tst_qdeclarativeloader.cpp | 94 +++++++++------------- 3 files changed, 67 insertions(+), 89 deletions(-) diff --git a/src/declarative/graphicsitems/qdeclarativeloader.cpp b/src/declarative/graphicsitems/qdeclarativeloader.cpp index 86e438f..ded2be3 100644 --- a/src/declarative/graphicsitems/qdeclarativeloader.cpp +++ b/src/declarative/graphicsitems/qdeclarativeloader.cpp @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE QDeclarativeLoaderPrivate::QDeclarativeLoaderPrivate() - : item(0), component(0), ownComponent(false), isComponentComplete(false) + : item(0), component(0), ownComponent(false) { } @@ -262,7 +262,6 @@ void QDeclarativeLoader::setSource(const QUrl &url) d->clear(); d->source = url; - if (d->source.isEmpty()) { emit sourceChanged(); emit statusChanged(); @@ -273,9 +272,18 @@ void QDeclarativeLoader::setSource(const QUrl &url) d->component = new QDeclarativeComponent(qmlEngine(this), d->source, this); d->ownComponent = true; - - if (d->isComponentComplete) - d->load(); + if (!d->component->isLoading()) { + d->_q_sourceLoaded(); + } else { + connect(d->component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), + this, SLOT(_q_sourceLoaded())); + connect(d->component, SIGNAL(progressChanged(qreal)), + this, SIGNAL(progressChanged())); + emit statusChanged(); + emit progressChanged(); + emit sourceChanged(); + emit itemChanged(); + } } /*! @@ -316,7 +324,6 @@ void QDeclarativeLoader::setSourceComponent(QDeclarativeComponent *comp) d->component = comp; d->ownComponent = false; - if (!d->component) { emit sourceChanged(); emit statusChanged(); @@ -325,8 +332,18 @@ void QDeclarativeLoader::setSourceComponent(QDeclarativeComponent *comp) return; } - if (d->isComponentComplete) - d->load(); + if (!d->component->isLoading()) { + d->_q_sourceLoaded(); + } else { + connect(d->component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), + this, SLOT(_q_sourceLoaded())); + connect(d->component, SIGNAL(progressChanged(qreal)), + this, SIGNAL(progressChanged())); + emit progressChanged(); + emit sourceChanged(); + emit statusChanged(); + emit itemChanged(); + } } void QDeclarativeLoader::resetSourceComponent() @@ -334,27 +351,6 @@ void QDeclarativeLoader::resetSourceComponent() setSourceComponent(0); } -void QDeclarativeLoaderPrivate::load() -{ - Q_Q(QDeclarativeLoader); - - if (!isComponentComplete || !component) - return; - - if (!component->isLoading()) { - _q_sourceLoaded(); - } else { - QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)), - q, SLOT(_q_sourceLoaded())); - QObject::connect(component, SIGNAL(progressChanged(qreal)), - q, SIGNAL(progressChanged())); - emit q->statusChanged(); - emit q->progressChanged(); - emit q->sourceChanged(); - emit q->itemChanged(); - } -} - void QDeclarativeLoaderPrivate::_q_sourceLoaded() { Q_Q(QDeclarativeLoader); @@ -469,11 +465,9 @@ QDeclarativeLoader::Status QDeclarativeLoader::status() const void QDeclarativeLoader::componentComplete() { - Q_D(QDeclarativeLoader); - QDeclarativeItem::componentComplete(); - d->isComponentComplete = true; - d->load(); + if (status() == Ready) + emit loaded(); } diff --git a/src/declarative/graphicsitems/qdeclarativeloader_p_p.h b/src/declarative/graphicsitems/qdeclarativeloader_p_p.h index 81ca66d..45ab595 100644 --- a/src/declarative/graphicsitems/qdeclarativeloader_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativeloader_p_p.h @@ -72,13 +72,11 @@ public: void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry); void clear(); void initResize(); - void load(); QUrl source; QGraphicsObject *item; QDeclarativeComponent *component; bool ownComponent : 1; - bool isComponentComplete : 1; void _q_sourceLoaded(); void _q_updateSize(bool loaderGeometryChanged = true); diff --git a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp index 358822e..bfa81ed 100644 --- a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp +++ b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp @@ -69,8 +69,9 @@ public: tst_QDeclarativeLoader(); private slots: - void sourceOrComponent(); - void sourceOrComponent_data(); + void url(); + void invalidUrl(); + void component(); void clear(); void urlToComponent(); void componentToUrl(); @@ -99,71 +100,56 @@ tst_QDeclarativeLoader::tst_QDeclarativeLoader() { } -void tst_QDeclarativeLoader::sourceOrComponent() +void tst_QDeclarativeLoader::url() { - QFETCH(QString, sourceDefinition); - QFETCH(QUrl, sourceUrl); - QFETCH(QString, errorString); - - bool error = !errorString.isEmpty(); - if (error) - QTest::ignoreMessage(QtWarningMsg, errorString.toUtf8().constData()); - QDeclarativeComponent component(&engine); - component.setData(QByteArray( - "import QtQuick 1.0\n" - "Loader {\n" - " property int onItemChangedCount: 0\n" - " property int onSourceChangedCount: 0\n" - " property int onStatusChangedCount: 0\n" - " property int onProgressChangedCount: 0\n" - " property int onLoadedCount: 0\n") - + sourceDefinition.toUtf8() - + QByteArray( - " onItemChanged: onItemChangedCount += 1\n" - " onSourceChanged: onSourceChangedCount += 1\n" - " onStatusChanged: onStatusChangedCount += 1\n" - " onProgressChanged: onProgressChangedCount += 1\n" - " onLoaded: onLoadedCount += 1\n" - "}") - , TEST_FILE("")); - + component.setData(QByteArray("import QtQuick 1.0\nLoader { property int did_load: 0; onLoaded: did_load=123; source: \"Rect120x60.qml\" }"), TEST_FILE("")); QDeclarativeLoader *loader = qobject_cast<QDeclarativeLoader*>(component.create()); QVERIFY(loader != 0); - QCOMPARE(loader->item() == 0, error); - QCOMPARE(loader->source(), sourceUrl); + QVERIFY(loader->item()); + QVERIFY(loader->source() == QUrl::fromLocalFile(SRCDIR "/data/Rect120x60.qml")); QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QDeclarativeLoader::Ready); + QCOMPARE(loader->property("did_load").toInt(), 123); + QCOMPARE(static_cast<QGraphicsItem*>(loader)->children().count(), 1); - QCOMPARE(loader->status(), error ? QDeclarativeLoader::Error : QDeclarativeLoader::Ready); - QCOMPARE(static_cast<QGraphicsItem*>(loader)->children().count(), error ? 0: 1); + delete loader; +} - if (!error) { - QDeclarativeComponent *c = qobject_cast<QDeclarativeComponent*>(loader->QGraphicsObject::children().at(0)); - QVERIFY(c); - QCOMPARE(loader->sourceComponent(), c); - } +void tst_QDeclarativeLoader::component() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml")); + QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create()); + QVERIFY(item); - QCOMPARE(loader->property("onSourceChangedCount").toInt(), 1); - QCOMPARE(loader->property("onStatusChangedCount").toInt(), 1); - QCOMPARE(loader->property("onProgressChangedCount").toInt(), 1); + QDeclarativeLoader *loader = qobject_cast<QDeclarativeLoader*>(item->QGraphicsObject::children().at(1)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QDeclarativeLoader::Ready); + QCOMPARE(static_cast<QGraphicsItem*>(loader)->children().count(), 1); - QCOMPARE(loader->property("onItemChangedCount").toInt(), error ? 0 : 1); - QCOMPARE(loader->property("onLoadedCount").toInt(), error ? 0 : 1); + QDeclarativeComponent *c = qobject_cast<QDeclarativeComponent*>(item->QGraphicsObject::children().at(0)); + QVERIFY(c); + QCOMPARE(loader->sourceComponent(), c); - delete loader; + delete item; } -void tst_QDeclarativeLoader::sourceOrComponent_data() +void tst_QDeclarativeLoader::invalidUrl() { - QTest::addColumn<QString>("sourceDefinition"); - QTest::addColumn<QUrl>("sourceUrl"); - QTest::addColumn<QString>("errorString"); + QTest::ignoreMessage(QtWarningMsg, QString(QUrl::fromLocalFile(SRCDIR "/data/IDontExist.qml").toString() + ": File not found").toUtf8().constData()); - QTest::newRow("source") << "source: 'Rect120x60.qml'\n" << QUrl::fromLocalFile(SRCDIR "/data/Rect120x60.qml") << ""; - QTest::newRow("sourceComponent") << "Component { id: comp; Rectangle { width: 100; height: 50 } }\n sourceComponent: comp\n" << QUrl() << ""; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nLoader { source: \"IDontExist.qml\" }"), TEST_FILE("")); + QDeclarativeLoader *loader = qobject_cast<QDeclarativeLoader*>(component.create()); + QVERIFY(loader != 0); + QVERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QDeclarativeLoader::Error); + QCOMPARE(static_cast<QGraphicsItem*>(loader)->children().count(), 0); - QTest::newRow("invalid source") << "source: 'IDontExist.qml'\n" << QUrl::fromLocalFile(SRCDIR "/data/IDontExist.qml") - << QString(QUrl::fromLocalFile(SRCDIR "/data/IDontExist.qml").toString() + ": File not found"); + delete loader; } void tst_QDeclarativeLoader::clear() @@ -460,7 +446,7 @@ void tst_QDeclarativeLoader::networkRequestUrl() server.serveDirectory(SRCDIR "/data"); QDeclarativeComponent component(&engine); - component.setData(QByteArray("import QtQuick 1.0\nLoader { property int signalCount : 0; source: \"http://127.0.0.1:14450/Rect120x60.qml\"; onLoaded: signalCount += 1 }"), QUrl::fromLocalFile(SRCDIR "/dummy.qml")); + component.setData(QByteArray("import QtQuick 1.0\nLoader { property int did_load : 0; source: \"http://127.0.0.1:14450/Rect120x60.qml\"; onLoaded: did_load=123 }"), QUrl::fromLocalFile(SRCDIR "/dummy.qml")); if (component.isError()) qDebug() << component.errors(); QDeclarativeLoader *loader = qobject_cast<QDeclarativeLoader*>(component.create()); @@ -470,7 +456,7 @@ void tst_QDeclarativeLoader::networkRequestUrl() QVERIFY(loader->item()); QCOMPARE(loader->progress(), 1.0); - QCOMPARE(loader->property("signalCount").toInt(), 1); + QCOMPARE(loader->property("did_load").toInt(), 123); QCOMPARE(static_cast<QGraphicsItem*>(loader)->children().count(), 1); delete loader; -- cgit v0.12 From c3dd455b03a6c03011e2446f69fc262230e91639 Mon Sep 17 00:00:00 2001 From: Martin Jones <martin.jones@nokia.com> Date: Fri, 21 Jan 2011 15:03:35 +1000 Subject: positionViewAtIndex can fail when positioned near end of list. We positioned the view beyond the bounds, which in some cases resulted in only one item being created. Combined with a bug in the bounds fixup very many items were created. Task-number: QT-4441 Reviewed-by: Michael Brasser --- src/declarative/graphicsitems/qdeclarativeflickable.cpp | 2 +- src/declarative/graphicsitems/qdeclarativegridview.cpp | 4 ++-- src/declarative/graphicsitems/qdeclarativelistview.cpp | 4 ++-- .../qdeclarativelistview/tst_qdeclarativelistview.cpp | 13 +++++++++++++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp index 4aaec38..dc7536e 100644 --- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp +++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp @@ -299,7 +299,7 @@ void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal timeline.move(data.move, maxExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4); timeline.move(data.move, maxExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4); } else { - timeline.set(data.move, minExtent); + timeline.set(data.move, maxExtent); } } vTime = timeline.time(); diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp index 89d7493..4c04a6b 100644 --- a/src/declarative/graphicsitems/qdeclarativegridview.cpp +++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp @@ -2165,6 +2165,7 @@ void QDeclarativeGridView::positionViewAtIndex(int index, int mode) if (d->layoutScheduled) d->layout(); qreal pos = d->position(); + qreal maxExtent = d->flow == QDeclarativeGridView::LeftToRight ? -maxYExtent() : -maxXExtent(); FxGridItem *item = d->visibleItem(index); if (!item) { int itemPos = d->rowPosAt(index); @@ -2172,7 +2173,7 @@ void QDeclarativeGridView::positionViewAtIndex(int index, int mode) QList<FxGridItem*> oldVisible = d->visibleItems; d->visibleItems.clear(); d->visibleIndex = index - index % d->columns; - d->setPosition(itemPos); + d->setPosition(qMin(qreal(itemPos), maxExtent)); // now release the reference to all the old visible items. for (int i = 0; i < oldVisible.count(); ++i) d->releaseItem(oldVisible.at(i)); @@ -2202,7 +2203,6 @@ void QDeclarativeGridView::positionViewAtIndex(int index, int mode) if (itemPos < pos) pos = itemPos; } - qreal maxExtent = d->flow == QDeclarativeGridView::LeftToRight ? -maxYExtent() : -maxXExtent(); pos = qMin(pos, maxExtent); qreal minExtent = d->flow == QDeclarativeGridView::LeftToRight ? -minYExtent() : -minXExtent(); pos = qMax(pos, minExtent); diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp index b4fd571..b4b3fa7 100644 --- a/src/declarative/graphicsitems/qdeclarativelistview.cpp +++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp @@ -2603,6 +2603,7 @@ void QDeclarativeListView::positionViewAtIndex(int index, int mode) d->layout(); qreal pos = d->position(); FxListItem *item = d->visibleItem(index); + qreal maxExtent = d->orient == QDeclarativeListView::Vertical ? -maxYExtent() : -maxXExtent(); if (!item) { int itemPos = d->positionAt(index); // save the currently visible items in case any of them end up visible again @@ -2610,7 +2611,7 @@ void QDeclarativeListView::positionViewAtIndex(int index, int mode) d->visibleItems.clear(); d->visiblePos = itemPos; d->visibleIndex = index; - d->setPosition(itemPos); + d->setPosition(qMin(qreal(itemPos), maxExtent)); // now release the reference to all the old visible items. for (int i = 0; i < oldVisible.count(); ++i) d->releaseItem(oldVisible.at(i)); @@ -2640,7 +2641,6 @@ void QDeclarativeListView::positionViewAtIndex(int index, int mode) if (itemPos < pos) pos = itemPos; } - qreal maxExtent = d->orient == QDeclarativeListView::Vertical ? -maxYExtent() : -maxXExtent(); pos = qMin(pos, maxExtent); qreal minExtent = d->orient == QDeclarativeListView::Vertical ? -minYExtent() : -minXExtent(); pos = qMax(pos, minExtent); diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp index b343010..9b6f04c 100644 --- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp +++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp @@ -1329,6 +1329,19 @@ void tst_QDeclarativeListView::positionViewAtIndex() QTRY_COMPARE(item->y(), i*20.); } + // Position at End using last index + listview->positionViewAtIndex(model.count()-1, QDeclarativeListView::End); + QTRY_COMPARE(listview->contentY(), 480.); + + // Confirm items positioned correctly + itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count(); + for (int i = 24; i < model.count(); ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.); + } + // Position at End listview->positionViewAtIndex(20, QDeclarativeListView::End); QTRY_COMPARE(listview->contentY(), 100.); -- cgit v0.12 From 7ddec9f3179bfd854ae53e23ab292de1f9a26377 Mon Sep 17 00:00:00 2001 From: Martin Jones <martin.jones@nokia.com> Date: Fri, 21 Jan 2011 15:38:15 +1000 Subject: BorderImage fails for .sci source containing a URL Task-number: QTBUG-16769 Reviewed-by: Bea Lam --- src/declarative/graphicsitems/qdeclarativescalegrid.cpp | 10 +++++----- .../qdeclarativeborderimage/data/colors-round-remote.sci | 7 +++++++ .../qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci diff --git a/src/declarative/graphicsitems/qdeclarativescalegrid.cpp b/src/declarative/graphicsitems/qdeclarativescalegrid.cpp index 804e91d..3ad0da6 100644 --- a/src/declarative/graphicsitems/qdeclarativescalegrid.cpp +++ b/src/declarative/graphicsitems/qdeclarativescalegrid.cpp @@ -136,12 +136,12 @@ QDeclarativeGridScaledImage::QDeclarativeGridScaledImage(QIODevice *data) if (line.isEmpty() || line.startsWith(QLatin1Char('#'))) continue; - QStringList list = line.split(QLatin1Char(':')); - if (list.count() != 2) + int colonId = line.indexOf(QLatin1Char(':')); + if (colonId <= 0) return; - - list[0] = list[0].trimmed(); - list[1] = list[1].trimmed(); + QStringList list; + list.append(line.left(colonId).trimmed()); + list.append(line.mid(colonId+1).trimmed()); if (list[0] == QLatin1String("border.left")) l = list[1].toInt(); diff --git a/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci b/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci new file mode 100644 index 0000000..c673bed --- /dev/null +++ b/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci @@ -0,0 +1,7 @@ +border.left:10 +border.top:20 +border.right:30 +border.bottom:40 +horizontalTileRule:Round +verticalTileRule:Repeat +source:http://127.0.0.1:14446/colors.png diff --git a/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp b/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp index e6543e6..bc2f170 100644 --- a/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp +++ b/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp @@ -294,6 +294,7 @@ void tst_qdeclarativeborderimage::sciSource_data() QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors-round.sci").toString() << true; QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.sci").toString() << false; QTest::newRow("remote") << SERVER_ADDR "/colors-round.sci" << true; + QTest::newRow("remote image") << SERVER_ADDR "/colors-round-remote.sci" << true; QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.sci" << false; } -- cgit v0.12 From 0a1e41a7192f0ac92cba16a82369a6fef633ac3d Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Fri, 21 Jan 2011 09:10:24 +0100 Subject: Cocoa/Alien: bugfix scrolling, dirty region issue When scrolling a widget we also need to scroll the already marked dirty regions on the widget along with the scroll. Since we might end up scrolling several time before a drawRect is called (normal with inertia scrolling), we need to mark exposed areas during scrolling as dirty as well, so they get handled correctly on subsequent scrolls. --- src/gui/kernel/qwidget_mac.mm | 87 +++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 8d6c09c..4e488bf 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4772,6 +4772,34 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) if (!view) return; + // Calculate the rectangles that needs to be redrawn + // after the scroll. This will be source rect minus destination rect: + QRect deltaXRect; + if (dx != 0) { + deltaXRect.setY(validScrollRect.y()); + deltaXRect.setHeight(validScrollRect.height()); + if (dx > 0) { + deltaXRect.setX(validScrollRect.x()); + deltaXRect.setWidth(dx); + } else { + deltaXRect.setX(validScrollRect.x() + validScrollRect.width() + dx); + deltaXRect.setWidth(-dx); + } + } + + QRect deltaYRect; + if (dy != 0) { + deltaYRect.setX(validScrollRect.x()); + deltaYRect.setWidth(validScrollRect.width()); + if (dy > 0) { + deltaYRect.setY(validScrollRect.y()); + deltaYRect.setHeight(dy); + } else { + deltaYRect.setY(validScrollRect.y() + validScrollRect.height() + dy); + deltaYRect.setHeight(-dy); + } + } + if (isAlien) { // Since q is alien, we need to translate the scroll rect: QPoint widgetTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(QPoint())); @@ -4805,44 +4833,12 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) } } + // Now, scroll the pixels: NSRect nsscrollRect = NSMakeRect( validScrollRect.x(), validScrollRect.y(), validScrollRect.width(), validScrollRect.height()); - - // Calculate the rectangles that needs to be redrawn - // after the scroll. This will be source rect minus destination rect: - - NSRect deltaXRect = { {0, 0}, {0, 0} }; - NSRect deltaYRect = { {0, 0}, {0, 0} }; - - if (dy != 0) { - deltaYRect.size.width = nsscrollRect.size.width; - deltaYRect.origin.x = nsscrollRect.origin.x; - if (dy > 0) { - deltaYRect.size.height = dy; - deltaYRect.origin.y = nsscrollRect.origin.y; - } else { - deltaYRect.size.height = -dy; - deltaYRect.origin.y = nsscrollRect.origin.y + nsscrollRect.size.height + dy; - } - } - - if (dx != 0) { - deltaXRect.size.height = nsscrollRect.size.height; - deltaXRect.origin.y = nsscrollRect.origin.y; - if (dx > 0) { - deltaXRect.size.width = dx; - deltaXRect.origin.x = nsscrollRect.origin.x; - } else { - deltaXRect.size.width = -dx; - deltaXRect.origin.x = nsscrollRect.origin.x + nsscrollRect.size.width + dx; - } - } - NSSize deltaSize = NSMakeSize(dx, dy); [view scrollRect:nsscrollRect by:deltaSize]; - [view setNeedsDisplayInRect:deltaXRect]; - [view setNeedsDisplayInRect:deltaYRect]; // Some areas inside the scroll rect might have been marked as dirty from before, which // means that they are scheduled to be redrawn. But as we now scroll, those dirty rects @@ -4851,19 +4847,20 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) // rect, the old calls to setNeedsDisplay still makes sense. // NB: Using [view translateRectsNeedingDisplayInRect:nsscrollRect by:deltaSize] have // so far not been proven fruitful to solve this problem. - const QVector<QRect> &rects = dirtyOnWidget.rects(); - const QVector<QRect>::const_iterator end = rects.end(); - QVector<QRect>::const_iterator it = rects.begin(); - while (it != end) { - QRect qdirtyRect = *it; - if (isAlien) { - const QPoint dirtyTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(qdirtyRect.topLeft())); - qdirtyRect.moveTo(dirtyTopLeftInsideNative); - } - const NSRect nsdirtyRect = NSMakeRect(qdirtyRect.x() + dx, qdirtyRect.y() + dy, qdirtyRect.width(), qdirtyRect.height()); - [view setNeedsDisplayInRect:nsdirtyRect]; - ++it; + const QVector<QRect> &dirtyRectsToScroll = dirtyOnWidget.rects(); + for (int i=0; i<dirtyRectsToScroll.size(); ++i) { + QRect qdirtyRect = dirtyRectsToScroll[i]; + qdirtyRect.moveBy(dx, dy); + update_sys(qdirtyRect); } + + // Update newly exposed areas. This will generate new dirty areas on + // q, and therefore, we do it after updating the old dirty rects above: + if (dx != 0) + update_sys(deltaXRect); + if (dy != 0) + update_sys(deltaYRect); + #endif // QT_MAC_USE_COCOA } -- cgit v0.12 From 0e8458a1d23f6887fe72c6ee567de16f7502dfc0 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Fri, 21 Jan 2011 13:03:57 +0100 Subject: Cocoa/Alien: keep the scrolling within correct bounds --- src/gui/kernel/qt_cocoa_helpers_mac.mm | 2 ++ src/gui/kernel/qwidget_mac.mm | 35 +++++++++------------------------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/gui/kernel/qt_cocoa_helpers_mac.mm b/src/gui/kernel/qt_cocoa_helpers_mac.mm index 19e0996..35b9d52 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac.mm +++ b/src/gui/kernel/qt_cocoa_helpers_mac.mm @@ -93,9 +93,11 @@ QT_BEGIN_NAMESPACE +#ifdef QT_MAC_USE_COCOA // Cmd + left mousebutton should produce a right button // press (mainly for mac users with one-button mice): static bool qt_leftButtonIsRightButton = false; +#endif Q_GLOBAL_STATIC(QMacWindowFader, macwindowFader); diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 4e488bf..5fe35db 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4667,8 +4667,10 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) accelEnv = qgetenv("QT_NO_FAST_SCROLL").toInt() == 0; } - // Scroll the whole widget instead if qscrollRect is not valid: + // Scroll the whole widget if qscrollRect is not valid: QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : q->rect(); + validScrollRect &= clipRect(); + // If q is overlapped by other widgets, we cannot just blit pixels since // this will move overlapping widgets as well. In case we just update: const bool overlapped = isOverlapped(validScrollRect.translated(data.crect.topLeft())); @@ -4809,34 +4811,15 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) // Adjust the scroll rect to the location as seen from the native parent: validScrollRect.moveTo(scrollTopLeftInsideNative); - - // Ensure that that the destination rect of the - // scroll doesn't draw outside of q's geometry: - if (dy != 0) { - if (scrollTopLeftInsideNative.y() + dy < widgetTopLeftInsideNative.y()) { - // Scrolling outside top - validScrollRect.setTop(widgetTopLeftInsideNative.y() - dy); - } else if (scrollBottomRightInsideNative.y() + dy > widgetBottomRightInsideNative.y()) { - // Scrolling outside bottom - validScrollRect.setBottom(widgetBottomRightInsideNative.y() - dy); - } - } - - if (dx != 0) { - if (scrollTopLeftInsideNative.x() + dx < widgetTopLeftInsideNative.x()) { - // Scrolling outside left edge - validScrollRect.setLeft(widgetTopLeftInsideNative.x() - dx); - } else if (scrollBottomRightInsideNative.x() + dx > widgetBottomRightInsideNative.x()) { - // Scrolling outside right edge - validScrollRect.setRight(widgetBottomRightInsideNative.x() - dx); - } - } } - // Now, scroll the pixels: + // Make the pixel copy rect within the validScrollRect bounds: NSRect nsscrollRect = NSMakeRect( - validScrollRect.x(), validScrollRect.y(), - validScrollRect.width(), validScrollRect.height()); + validScrollRect.x() + (dx < 0 ? -dx : 0), + validScrollRect.y() + (dy < 0 ? -dy : 0), + validScrollRect.width() + (dx > 0 ? -dx : 0), + validScrollRect.height() + (dy > 0 ? -dy : 0)); + NSSize deltaSize = NSMakeSize(dx, dy); [view scrollRect:nsscrollRect by:deltaSize]; -- cgit v0.12 From 5bd4db40eb545c0e5ff121876630ae8b952e957d Mon Sep 17 00:00:00 2001 From: Jani Hautakangas <jani.hautakangas@nokia.com> Date: Fri, 21 Jan 2011 13:37:46 +0100 Subject: Fix to pen state handling in OpenVG paint engine. Shape should not be filled using pen if pen brush type is NoBrush. OpenVG paint engine didn't check NoBrush case when applying pen. Task-number: QTBUG-15870 Reviewed-by: Gunnar --- src/openvg/qpaintengine_vg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index b90811d..a15f0c3 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -1472,7 +1472,7 @@ void QVGPaintEnginePrivate::draw (VGPath path, const QPen& pen, const QBrush& brush, VGint rule) { VGbitfield mode = 0; - if (pen.style() != Qt::NoPen) { + if (qpen_style(pen) != Qt::NoPen && qbrush_style(qpen_brush(pen)) != Qt::NoBrush) { ensurePen(pen); mode |= VG_STROKE_PATH; } -- cgit v0.12 From 48c18015d1ec7ecd13b4f370cd1deff34b51dbfd Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Fri, 21 Jan 2011 15:22:42 +0100 Subject: Cocoa/Alien: remove unneded code for scrolling with alien --- src/gui/kernel/qwidget_mac.mm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 5fe35db..67b72aa 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4803,13 +4803,8 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) } if (isAlien) { - // Since q is alien, we need to translate the scroll rect: - QPoint widgetTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(QPoint())); - QPoint widgetBottomRightInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(q->rect().bottomRight())); - QPoint scrollTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(validScrollRect.topLeft())); - QPoint scrollBottomRightInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(validScrollRect.bottomRight())); - // Adjust the scroll rect to the location as seen from the native parent: + QPoint scrollTopLeftInsideNative = nativeWidget->mapFromGlobal(q->mapToGlobal(validScrollRect.topLeft())); validScrollRect.moveTo(scrollTopLeftInsideNative); } -- cgit v0.12 From 002e3f471025fe4f84d2dd8dd07c440808d7a839 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Fri, 21 Jan 2011 15:44:30 +0100 Subject: Cocoa/Alien: replace depricated API --- src/gui/kernel/qwidget_mac.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 67b72aa..f8254ec 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4828,7 +4828,7 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) const QVector<QRect> &dirtyRectsToScroll = dirtyOnWidget.rects(); for (int i=0; i<dirtyRectsToScroll.size(); ++i) { QRect qdirtyRect = dirtyRectsToScroll[i]; - qdirtyRect.moveBy(dx, dy); + qdirtyRect.translate(dx, dy); update_sys(qdirtyRect); } -- cgit v0.12 From 4c57b9d3f1865beb87120fc4691241c57a2bfb01 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada <sergio.ahumada@nokia.com> Date: Fri, 21 Jan 2011 16:03:41 +0100 Subject: Doc: Fixing typo --- doc/src/declarative/basictypes.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc index 463e4a3..99f1bed 100644 --- a/doc/src/declarative/basictypes.qdoc +++ b/doc/src/declarative/basictypes.qdoc @@ -582,7 +582,7 @@ An enumeration type consists of a set of named values. - An enumeration value may be specifed as either a string: + An enumeration value may be specified as either a string: \qml Text { horizontalAlignment: "AlignRight" } \endqml -- cgit v0.12 From a1ba5568da6c57e8a0e4440913a6bda322620422 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Fri, 21 Jan 2011 16:29:27 +0200 Subject: Make QMAKE_EXTENSION_SHLIB and friends work in all Symbian mkspecs. Reviewed-by: axis --- mkspecs/common/symbian/symbian-makefile.conf | 3 --- mkspecs/common/symbian/symbian.conf | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mkspecs/common/symbian/symbian-makefile.conf b/mkspecs/common/symbian/symbian-makefile.conf index 364e91b..0360615 100644 --- a/mkspecs/common/symbian/symbian-makefile.conf +++ b/mkspecs/common/symbian/symbian-makefile.conf @@ -22,11 +22,8 @@ QMAKE_ELF2E32_FLAGS = --dlldata \ include(../../common/unix.conf) QMAKE_PREFIX_SHLIB = -QMAKE_EXTENSION_SHLIB = dll CONFIG *= no_plugin_name_prefix -QMAKE_EXTENSION_PLUGIN = dll QMAKE_PREFIX_STATICLIB = -QMAKE_EXTENSION_STATICLIB = lib QMAKE_SYMBIAN_SHLIB = 1 is_using_gnupoc { diff --git a/mkspecs/common/symbian/symbian.conf b/mkspecs/common/symbian/symbian.conf index ab94cfb..5619d4f 100644 --- a/mkspecs/common/symbian/symbian.conf +++ b/mkspecs/common/symbian/symbian.conf @@ -13,6 +13,9 @@ QMAKE_COMPILER_DEFINES += SYMBIAN QMAKE_EXT_OBJ = .o QMAKE_EXT_RES = _res.o +QMAKE_EXTENSION_SHLIB = dll +QMAKE_EXTENSION_PLUGIN = dll +QMAKE_EXTENSION_STATICLIB = lib QMAKE_LEX = flex QMAKE_LEXFLAGS = -- cgit v0.12 From 972fcb6de69fb7ed3ae8147498ceb5d2ac79f057 Mon Sep 17 00:00:00 2001 From: Ademar de Souza Reis Jr <ademar.reis@openbossa.org> Date: Fri, 21 Jan 2011 08:19:00 -0600 Subject: QPainterPath: Ignore calls with NaN/Infinite parameters QPainterPath can't handle NaNs/Inf inside coordinates, but instead of safely ignoring or aborting an operation, it shows a warning and keeps going on, with undefined behavior. Sometimes leading to infinite loops, leaks or crashes (see qtwebkit example below). This is particularly bad when QPainterPath is used to render content from untrusted sources (web or user data). As an example, there's a qtwebkit bug where the browser crashes when a particular SVG is loaded: https://bugs.webkit.org/show_bug.cgi?id=51698. Please note that "untrusted sources" doesn't apply only to network sources. This behavior can probably be exploited on applications such as file-browsers with previews enabled. Task-number: QTBUG-16664 Signed-off-by: Ademar de Souza Reis Jr <ademar.reis@openbossa.org> Merge-request: 1026 Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com> --- src/gui/painting/qpainterpath.cpp | 66 ++++++++++++++++++++-------- tests/auto/qpainterpath/tst_qpainterpath.cpp | 46 +++++++++++++++++++ 2 files changed, 93 insertions(+), 19 deletions(-) diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp index fddc4d0..9f49b2f 100644 --- a/src/gui/painting/qpainterpath.cpp +++ b/src/gui/painting/qpainterpath.cpp @@ -636,10 +636,14 @@ void QPainterPath::moveTo(const QPointF &p) #ifdef QPP_DEBUG printf("QPainterPath::moveTo() (%.2f,%.2f)\n", p.x(), p.y()); #endif + + if (!qt_is_finite(p.x()) || !qt_is_finite(p.y())) { #ifndef QT_NO_DEBUG - if (qt_is_nan(p.x()) || qt_is_nan(p.y())) - qWarning("QPainterPath::moveTo: Adding point where x or y is NaN, results are undefined"); + qWarning("QPainterPath::moveTo: Adding point where x or y is NaN or Inf, ignoring call"); #endif + return; + } + ensureData(); detach(); @@ -682,10 +686,14 @@ void QPainterPath::lineTo(const QPointF &p) #ifdef QPP_DEBUG printf("QPainterPath::lineTo() (%.2f,%.2f)\n", p.x(), p.y()); #endif + + if (!qt_is_finite(p.x()) || !qt_is_finite(p.y())) { #ifndef QT_NO_DEBUG - if (qt_is_nan(p.x()) || qt_is_nan(p.y())) - qWarning("QPainterPath::lineTo: Adding point where x or y is NaN, results are undefined"); + qWarning("QPainterPath::lineTo: Adding point where x or y is NaN or Inf, ignoring call"); #endif + return; + } + ensureData(); detach(); @@ -737,11 +745,15 @@ void QPainterPath::cubicTo(const QPointF &c1, const QPointF &c2, const QPointF & printf("QPainterPath::cubicTo() (%.2f,%.2f), (%.2f,%.2f), (%.2f,%.2f)\n", c1.x(), c1.y(), c2.x(), c2.y(), e.x(), e.y()); #endif + + if (!qt_is_finite(c1.x()) || !qt_is_finite(c1.y()) || !qt_is_finite(c2.x()) || !qt_is_finite(c2.y()) + || !qt_is_finite(e.x()) || !qt_is_finite(e.y())) { #ifndef QT_NO_DEBUG - if (qt_is_nan(c1.x()) || qt_is_nan(c1.y()) || qt_is_nan(c2.x()) || qt_is_nan(c2.y()) - || qt_is_nan(e.x()) || qt_is_nan(e.y())) - qWarning("QPainterPath::cubicTo: Adding point where x or y is NaN, results are undefined"); + qWarning("QPainterPath::cubicTo: Adding point where x or y is NaN or Inf, ignoring call"); #endif + return; + } + ensureData(); detach(); @@ -790,10 +802,14 @@ void QPainterPath::quadTo(const QPointF &c, const QPointF &e) printf("QPainterPath::quadTo() (%.2f,%.2f), (%.2f,%.2f)\n", c.x(), c.y(), e.x(), e.y()); #endif + + if (!qt_is_finite(c.x()) || !qt_is_finite(c.y()) || !qt_is_finite(e.x()) || !qt_is_finite(e.y())) { #ifndef QT_NO_DEBUG - if (qt_is_nan(c.x()) || qt_is_nan(c.y()) || qt_is_nan(e.x()) || qt_is_nan(e.y())) - qWarning("QPainterPath::quadTo: Adding point where x or y is NaN, results are undefined"); + qWarning("QPainterPath::quadTo: Adding point where x or y is NaN or Inf, ignoring call"); #endif + return; + } + ensureData(); detach(); @@ -857,11 +873,15 @@ void QPainterPath::arcTo(const QRectF &rect, qreal startAngle, qreal sweepLength printf("QPainterPath::arcTo() (%.2f, %.2f, %.2f, %.2f, angle=%.2f, sweep=%.2f\n", rect.x(), rect.y(), rect.width(), rect.height(), startAngle, sweepLength); #endif + + if (!qt_is_finite(rect.x()) && !qt_is_finite(rect.y()) || !qt_is_finite(rect.width()) || !qt_is_finite(rect.height()) + || !qt_is_finite(startAngle) || !qt_is_finite(sweepLength)) { #ifndef QT_NO_DEBUG - if (qt_is_nan(rect.x()) || qt_is_nan(rect.y()) || qt_is_nan(rect.width()) || qt_is_nan(rect.height()) - || qt_is_nan(startAngle) || qt_is_nan(sweepLength)) - qWarning("QPainterPath::arcTo: Adding arc where a parameter is NaN, results are undefined"); + qWarning("QPainterPath::arcTo: Adding arc where a parameter is NaN or Inf, ignoring call"); #endif + return; + } + if (rect.isNull()) return; @@ -960,10 +980,13 @@ QPointF QPainterPath::currentPosition() const */ void QPainterPath::addRect(const QRectF &r) { + if (!qt_is_finite(r.x()) || !qt_is_finite(r.y()) || !qt_is_finite(r.width()) || !qt_is_finite(r.height())) { #ifndef QT_NO_DEBUG - if (qt_is_nan(r.x()) || qt_is_nan(r.y()) || qt_is_nan(r.width()) || qt_is_nan(r.height())) - qWarning("QPainterPath::addRect: Adding rect where a parameter is NaN, results are undefined"); + qWarning("QPainterPath::addRect: Adding rect where a parameter is NaN or Inf, ignoring call"); #endif + return; + } + if (r.isNull()) return; @@ -1040,11 +1063,14 @@ void QPainterPath::addPolygon(const QPolygonF &polygon) */ void QPainterPath::addEllipse(const QRectF &boundingRect) { + if (!qt_is_finite(boundingRect.x()) || !qt_is_finite(boundingRect.y()) + || !qt_is_finite(boundingRect.width()) || !qt_is_finite(boundingRect.height())) { #ifndef QT_NO_DEBUG - if (qt_is_nan(boundingRect.x()) || qt_is_nan(boundingRect.y()) - || qt_is_nan(boundingRect.width()) || qt_is_nan(boundingRect.height())) - qWarning("QPainterPath::addEllipse: Adding ellipse where a parameter is NaN, results are undefined"); + qWarning("QPainterPath::addEllipse: Adding ellipse where a parameter is NaN or Inf, ignoring call"); #endif + return; + } + if (boundingRect.isNull()) return; @@ -2366,10 +2392,12 @@ QDataStream &operator>>(QDataStream &s, QPainterPath &p) s >> x; s >> y; Q_ASSERT(type >= 0 && type <= 3); + if (!qt_is_finite(x) || !qt_is_finite(y)) { #ifndef QT_NO_DEBUG - if (qt_is_nan(x) || qt_is_nan(y)) - qWarning("QDataStream::operator>>: Adding a NaN element to path, results are undefined"); + qWarning("QDataStream::operator>>: NaN or Inf element found in path, skipping it"); #endif + continue; + } QPainterPath::Element elm = { x, y, QPainterPath::ElementType(type) }; p.d_func()->elements.append(elm); } diff --git a/tests/auto/qpainterpath/tst_qpainterpath.cpp b/tests/auto/qpainterpath/tst_qpainterpath.cpp index f60e782..fb3a4ea 100644 --- a/tests/auto/qpainterpath/tst_qpainterpath.cpp +++ b/tests/auto/qpainterpath/tst_qpainterpath.cpp @@ -103,6 +103,8 @@ private slots: void testToFillPolygons(); + void testNaNandInfinites(); + void closing(); void operators_data(); @@ -1163,6 +1165,50 @@ void tst_QPainterPath::testToFillPolygons() QCOMPARE(polygons.first().count(QPointF(70, 50)), 0); } +void tst_QPainterPath::testNaNandInfinites() +{ + QPainterPath path1; + QPainterPath path2 = path1; + + QPointF p1 = QPointF(qSNaN(), 1); + QPointF p2 = QPointF(qQNaN(), 1); + QPointF p3 = QPointF(qQNaN(), 1); + QPointF pInf = QPointF(qInf(), 1); + + // all these operations with NaN/Inf should be ignored + // can't test operator>> reliably, as we can't create a path with NaN to << later + + path1.moveTo(p1); + path1.moveTo(qSNaN(), qQNaN()); + path1.moveTo(pInf); + + path1.lineTo(p1); + path1.lineTo(qSNaN(), qQNaN()); + path1.lineTo(pInf); + + path1.cubicTo(p1, p2, p3); + path1.cubicTo(p1, QPointF(1, 1), QPointF(2, 2)); + path1.cubicTo(pInf, QPointF(10, 10), QPointF(5, 1)); + + path1.quadTo(p1, p2); + path1.quadTo(QPointF(1, 1), p3); + path1.quadTo(QPointF(1, 1), pInf); + + path1.arcTo(QRectF(p1, p2), 5, 5); + path1.arcTo(QRectF(pInf, QPointF(1, 1)), 5, 5); + + path1.addRect(QRectF(p1, p2)); + path1.addRect(QRectF(pInf, QPointF(1, 1))); + + path1.addEllipse(QRectF(p1, p2)); + path1.addEllipse(QRectF(pInf, QPointF(1, 1))); + + QCOMPARE(path1, path2); + + path1.lineTo(QPointF(1, 1)); + QVERIFY(path1 != path2); +} + void tst_QPainterPath::connectPathDuplicatePoint() { QPainterPath a; -- cgit v0.12 From f129fd72752aa0ac088837b9f70b22621e9d3b83 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Fri, 21 Jan 2011 15:28:44 +0000 Subject: fix error reporting that was mistakenly broken by 570e7b38487455d394b5b74a59edc639f3dc416f Merge-request: 1018 Reviewed-by: Shane Kearns <shane.kearns@accenture.com> --- src/corelib/kernel/qsystemsemaphore_symbian.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/corelib/kernel/qsystemsemaphore_symbian.cpp b/src/corelib/kernel/qsystemsemaphore_symbian.cpp index 07cfffc..a46389d 100644 --- a/src/corelib/kernel/qsystemsemaphore_symbian.cpp +++ b/src/corelib/kernel/qsystemsemaphore_symbian.cpp @@ -73,6 +73,7 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function, int err) case KErrInUse: errorString = QCoreApplication::tr("%1: out of resources", "QSystemSemaphore").arg(function); error = QSystemSemaphore::OutOfResources; + break; case KErrPermissionDenied: errorString = QCoreApplication::tr("%1: permission denied", "QSystemSemaphore").arg(function); error = QSystemSemaphore::PermissionDenied; -- cgit v0.12 From 3539af42ca847e628c325a2069b72284b597d617 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Fri, 21 Jan 2011 15:28:49 +0000 Subject: fix error reporting on detach() before, we returned too early :) Merge-request: 1018 Reviewed-by: Shane Kearns <shane.kearns@accenture.com> --- src/corelib/kernel/qsharedmemory_win.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/kernel/qsharedmemory_win.cpp b/src/corelib/kernel/qsharedmemory_win.cpp index 85600a2..5293f45 100644 --- a/src/corelib/kernel/qsharedmemory_win.cpp +++ b/src/corelib/kernel/qsharedmemory_win.cpp @@ -124,8 +124,8 @@ bool QSharedMemoryPrivate::cleanHandle() { if (hand != 0 && !CloseHandle(hand)) { hand = 0; - return false; setErrorString(QLatin1String("QSharedMemory::cleanHandle")); + return false; } hand = 0; return true; -- cgit v0.12 From 75771ddf96273899a990d33395fb4fac14666022 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Fri, 21 Jan 2011 15:28:53 +0000 Subject: avoid extra calculations QSystemSemaphore::setKey() sets the fileName member to makeKeyFileName()'s result; no need to call it again Merge-request: 1018 Reviewed-by: Shane Kearns <shane.kearns@accenture.com> --- src/corelib/kernel/qsystemsemaphore_symbian.cpp | 3 +-- src/corelib/kernel/qsystemsemaphore_win.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/corelib/kernel/qsystemsemaphore_symbian.cpp b/src/corelib/kernel/qsystemsemaphore_symbian.cpp index a46389d..0d257b8 100644 --- a/src/corelib/kernel/qsystemsemaphore_symbian.cpp +++ b/src/corelib/kernel/qsystemsemaphore_symbian.cpp @@ -98,8 +98,7 @@ int QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode) if (key.isEmpty()) return 0; - QString safeName = makeKeyFileName(); - TPtrC name(qt_QString2TPtrC(safeName)); + TPtrC name(qt_QString2TPtrC(fileName)); int err = KErrAlreadyExists; int tryCount = 10; // Sort out race conditions by retrying several times until existing handle is acquired. diff --git a/src/corelib/kernel/qsystemsemaphore_win.cpp b/src/corelib/kernel/qsystemsemaphore_win.cpp index 7f002f8..fad50f2 100644 --- a/src/corelib/kernel/qsystemsemaphore_win.cpp +++ b/src/corelib/kernel/qsystemsemaphore_win.cpp @@ -86,8 +86,7 @@ HANDLE QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode) // Create it if it doesn't already exists. if (semaphore == 0) { - QString safeName = makeKeyFileName(); - semaphore = CreateSemaphore(0, initialValue, MAXLONG, (wchar_t*)safeName.utf16()); + semaphore = CreateSemaphore(0, initialValue, MAXLONG, (wchar_t*)fileName.utf16()); if (semaphore == NULL) setErrorString(QLatin1String("QSystemSemaphore::handle")); } -- cgit v0.12 From c17e49e8a481f96a4b953d8fcf41678fc1b2f9bc Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Fri, 21 Jan 2011 15:28:57 +0000 Subject: simplify QSharedMemory::detach() de-init members in the QSharedMemoryPrivate::detach() like in code for symbian. this gains a lightly better control in case of errors on detach() Merge-request: 1018 Reviewed-by: Shane Kearns <shane.kearns@accenture.com> --- src/corelib/kernel/qsharedmemory.cpp | 6 +----- src/corelib/kernel/qsharedmemory_unix.cpp | 1 + src/corelib/kernel/qsharedmemory_win.cpp | 1 + 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp index 2fd6c50..85b37d0 100644 --- a/src/corelib/kernel/qsharedmemory.cpp +++ b/src/corelib/kernel/qsharedmemory.cpp @@ -399,11 +399,7 @@ bool QSharedMemory::detach() return false; #endif - if (d->detach()) { - d->size = 0; - return true; - } - return false; + return d->detach(); } /*! diff --git a/src/corelib/kernel/qsharedmemory_unix.cpp b/src/corelib/kernel/qsharedmemory_unix.cpp index bea5b63..3cd17f1 100644 --- a/src/corelib/kernel/qsharedmemory_unix.cpp +++ b/src/corelib/kernel/qsharedmemory_unix.cpp @@ -265,6 +265,7 @@ bool QSharedMemoryPrivate::detach() return false; } memory = 0; + size = 0; // Get the number of current attachments if (!handle()) diff --git a/src/corelib/kernel/qsharedmemory_win.cpp b/src/corelib/kernel/qsharedmemory_win.cpp index 5293f45..ac9c86a 100644 --- a/src/corelib/kernel/qsharedmemory_win.cpp +++ b/src/corelib/kernel/qsharedmemory_win.cpp @@ -186,6 +186,7 @@ bool QSharedMemoryPrivate::detach() return false; } memory = 0; + size = 0; // close handle return cleanHandle(); -- cgit v0.12 From acd04e69bd404657638d3a95eea3a5946008cf03 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Fri, 21 Jan 2011 15:29:01 +0000 Subject: get rid of extra calls to handle() in create(), handle() is called a few lines early; in attach(), QSharedMemory::attach() calls handle() as a preparation step; in detach(), well, if we're here, unix_key is valid anyways... Merge-request: 1018 Reviewed-by: Shane Kearns <shane.kearns@accenture.com> --- src/corelib/kernel/qsharedmemory_unix.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/corelib/kernel/qsharedmemory_unix.cpp b/src/corelib/kernel/qsharedmemory_unix.cpp index 3cd17f1..ddb0e34 100644 --- a/src/corelib/kernel/qsharedmemory_unix.cpp +++ b/src/corelib/kernel/qsharedmemory_unix.cpp @@ -199,7 +199,7 @@ bool QSharedMemoryPrivate::create(int size) } // create - if (-1 == shmget(handle(), size, 0666 | IPC_CREAT | IPC_EXCL)) { + if (-1 == shmget(unix_key, size, 0666 | IPC_CREAT | IPC_EXCL)) { QString function = QLatin1String("QSharedMemory::create"); switch (errno) { case EINVAL: @@ -220,10 +220,7 @@ bool QSharedMemoryPrivate::create(int size) bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) { // grab the shared memory segment id - if (!handle()) - return false; - - int id = shmget(handle(), 0, (mode == QSharedMemory::ReadOnly ? 0444 : 0660)); + int id = shmget(unix_key, 0, (mode == QSharedMemory::ReadOnly ? 0444 : 0660)); if (-1 == id) { setErrorString(QLatin1String("QSharedMemory::attach (shmget)")); return false; @@ -268,10 +265,8 @@ bool QSharedMemoryPrivate::detach() size = 0; // Get the number of current attachments - if (!handle()) - return false; - int id = shmget(handle(), 0, 0444); - unix_key = 0; + int id = shmget(unix_key, 0, 0444); + cleanHandle(); struct shmid_ds shmid_ds; if (0 != shmctl(id, IPC_STAT, &shmid_ds)) { -- cgit v0.12 From 00141ca67b6c20ecc8624bb9d1c70d97d34f544a Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Fri, 21 Jan 2011 15:29:05 +0000 Subject: ignore the warning from auto-detach in destructor we locked shm few line ago and didn't unlock it, so we expecting for this warning Merge-request: 1018 Reviewed-by: Shane Kearns <shane.kearns@accenture.com> --- tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp index 50205bc..0719576 100644 --- a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp +++ b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp @@ -358,7 +358,8 @@ void tst_QSharedMemory::lock() QVERIFY(shm.lock()); QTest::ignoreMessage(QtWarningMsg, "QSharedMemory::lock: already locked"); QVERIFY(shm.lock()); - // don't lock forever + // we didn't unlock(), so ignore the warning from auto-detach in destructor + QTest::ignoreMessage(QtWarningMsg, "QSharedMemory::lock: already locked"); } /*! -- cgit v0.12 From 586bbfdd296a55edb42c14bacd7901d7c074fd9a Mon Sep 17 00:00:00 2001 From: Ritt Konstantin <ritt.ks@gmail.com> Date: Fri, 21 Jan 2011 15:29:10 +0000 Subject: make the test a bit stricter don't say we passed the test if we didn't Merge-request: 1018 Reviewed-by: Shane Kearns <shane.kearns@accenture.com> --- tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp index 0719576..f11519b 100644 --- a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp +++ b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp @@ -332,6 +332,8 @@ void tst_QSharedMemory::attach() QVERIFY(sm.detach()); // Make sure detach doesn't screw up something and we can't re-attach. QVERIFY(sm.attach()); + QVERIFY(sm.data() != 0); + QVERIFY(sm.size() != 0); QVERIFY(sm.detach()); QCOMPARE(sm.size(), 0); QVERIFY(sm.data() == 0); -- cgit v0.12 From 7905e38d84a060176e53ffe8d7da8710ea0180fe Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Fri, 14 Jan 2011 13:29:02 +0100 Subject: Validate arguments to QDBusConnection::connect This fixes a crash caused by user code trying to connect to object paths that aren't valid (if we send this to the bus daemon, we get an error with the AddMatch call). Reviewed-by: Trust Me --- src/dbus/qdbusconnection.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp index eb312d2..3fb63eb 100644 --- a/src/dbus/qdbusconnection.cpp +++ b/src/dbus/qdbusconnection.cpp @@ -632,10 +632,26 @@ bool QDBusConnection::connect(const QString &service, const QString &path, const if (!receiver || !slot || !d || !d->connection) return false; - if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface)) - return false; if (interface.isEmpty() && name.isEmpty()) return false; + if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface)) { +#ifndef QT_NO_DEBUG + qWarning("QDBusConnection::connect: interface name '%s' is not valid", interface.toLatin1().constData()); +#endif + return false; + } + if (!service.isEmpty() && !QDBusUtil::isValidBusName(service)) { +#ifndef QT_NO_DEBUG + qWarning("QDBusConnection::connect: service name '%s' is not valid", service.toLatin1().constData()); +#endif + return false; + } + if (!path.isEmpty() && !QDBusUtil::isValidObjectPath(path)) { +#ifndef QT_NO_DEBUG + qWarning("QDBusConnection::connect: object path '%s' is not valid", path.toLatin1().constData()); +#endif + return false; + } QDBusWriteLocker locker(ConnectAction, d); return d->connectSignal(service, path, interface, name, argumentMatch, signature, receiver, slot); -- cgit v0.12 From b1c715f8214233f5b573ed58fc89c9dd70beabb4 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Mon, 24 Jan 2011 10:02:51 +0100 Subject: Add support for disabling touch on to enhance scrolling in Cocoa On Mac/Cocoa, enabling touch on a widget slows down the scrolling performance of the whole application. It seems Cocoa spends some time in the background figuring out what to do with the touch events, and whether or not it should convert them to scroll/wheel events. Therefore, it makes sense to no subscribe for touch when the mouse is not over the widget, This patch implements that strategy, and the effect is huge when tested agains creator. Rev-By: brad --- src/gui/kernel/qapplication.cpp | 16 ++++++++++++++++ src/gui/kernel/qcocoaview_mac.mm | 2 ++ src/gui/kernel/qcocoaview_mac_p.h | 1 + src/gui/kernel/qwidget.cpp | 1 + src/gui/kernel/qwidget_mac.mm | 31 +++++++++++++++++++++++-------- src/gui/kernel/qwidget_p.h | 3 ++- src/gui/kernel/qwidget_s60.cpp | 3 ++- src/gui/kernel/qwidget_win.cpp | 3 ++- 8 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index 8545d63..af4a258 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -4423,6 +4423,22 @@ bool QApplication::notify(QObject *receiver, QEvent *e) break; } #endif // QT_NO_GESTURES +#ifdef QT_MAC_USE_COCOA + case QEvent::Enter: + if (receiver->isWidgetType()) { + QWidget *w = static_cast<QWidget *>(receiver); + if (w->testAttribute(Qt::WA_AcceptTouchEvents)) + qt_widget_private(w)->registerTouchWindow(true); + } + break; + case QEvent::Leave: + if (receiver->isWidgetType()) { + QWidget *w = static_cast<QWidget *>(receiver); + if (w->testAttribute(Qt::WA_AcceptTouchEvents)) + qt_widget_private(w)->registerTouchWindow(false); + } + break; +#endif default: res = d->notify_helper(receiver, e); break; diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 575343f..18a2be1 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -153,6 +153,8 @@ static int qCocoaViewCount = 0; composing = false; sendKeyEvents = true; fromKeyDownEvent = false; + alienTouchCount = 0; + [self setHidden:YES]; return self; } diff --git a/src/gui/kernel/qcocoaview_mac_p.h b/src/gui/kernel/qcocoaview_mac_p.h index fc14285..cc79b67 100644 --- a/src/gui/kernel/qcocoaview_mac_p.h +++ b/src/gui/kernel/qcocoaview_mac_p.h @@ -71,6 +71,7 @@ Q_GUI_EXPORT bool sendKeyEvents; bool fromKeyDownEvent; QString *composingText; + @public int alienTouchCount; } - (id)initWithQWidget:(QWidget *)widget widgetPrivate:(QWidgetPrivate *)widgetprivate; - (void) finishInitWithQWidget:(QWidget *)widget widgetPrivate:(QWidgetPrivate *)widgetprivate; diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index f7d7d43..d3ccfd1 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -327,6 +327,7 @@ QWidgetPrivate::QWidgetPrivate(int version) hasOwnContext = false; isInUnifiedToolbar = false; unifiedSurface = 0; + touchEventsEnabled = false; #endif // QT_MAC_USE_COCOA #ifdef QWIDGET_EXTRA_DEBUG static int count = 0; diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index f8254ec..b3450ab 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -2697,8 +2697,6 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO setWSGeometry(); if (destroyid) qt_mac_destructView(destroyid); - if (q->testAttribute(Qt::WA_AcceptTouchEvents)) - registerTouchWindow(); } /*! @@ -4981,19 +4979,36 @@ void QWidgetPrivate::registerDropSite(bool on) #endif } -void QWidgetPrivate::registerTouchWindow() +void QWidgetPrivate::registerTouchWindow(bool enable) { +#ifdef QT_MAC_USE_COCOA #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_6) return; + Q_Q(QWidget); - if (!q->testAttribute(Qt::WA_WState_Created)) + if (enable == touchEventsEnabled) return; -#ifndef QT_MAC_USE_COCOA - // Needs implementation! + + QCocoaView *view = static_cast<QCocoaView *>(qt_mac_effectiveview_for(q)); + if (!view) + return; + + if (enable) { + ++view->alienTouchCount; + if (view->alienTouchCount == 1) { + touchEventsEnabled = true; + [view setAcceptsTouchEvents:YES]; + } + } else { + --view->alienTouchCount; + if (view->alienTouchCount == 0) { + touchEventsEnabled = false; + [view setAcceptsTouchEvents:NO]; + } + } #else - NSView *view = qt_mac_effectiveview_for(q); - [view setAcceptsTouchEvents:YES]; + Q_UNUSED(on); #endif #endif } diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index bfaf91a..ecfd85f 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -859,6 +859,7 @@ public: bool isInUnifiedToolbar; QWindowSurface *unifiedSurface; QPoint toolbar_offset; + bool touchEventsEnabled; #endif void determineWindowClass(); void transferChildren(); @@ -871,7 +872,7 @@ public: static OSStatus qt_window_event(EventHandlerCallRef er, EventRef event, void *); static OSStatus qt_widget_event(EventHandlerCallRef er, EventRef event, void *); static bool qt_widget_rgn(QWidget *, short, RgnHandle, bool); - void registerTouchWindow(); + void registerTouchWindow(bool enable = true); #elif defined(Q_WS_QWS) // <--------------------------------------------------------- QWS void setMaxWindowState_helper(); void setFullScreenSize_helper(); diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index cb72800..7547bec 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -990,8 +990,9 @@ void QWidgetPrivate::setMask_sys(const QRegion& /* region */) } -void QWidgetPrivate::registerTouchWindow() +void QWidgetPrivate::registerTouchWindow(bool enable) { + Q_UNUSED(enable); #ifdef QT_SYMBIAN_SUPPORTS_ADVANCED_POINTER Q_Q(QWidget); if (q->testAttribute(Qt::WA_WState_Created) && q->windowType() != Qt::Desktop) { diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp index a02c5ba..54784a2 100644 --- a/src/gui/kernel/qwidget_win.cpp +++ b/src/gui/kernel/qwidget_win.cpp @@ -2064,8 +2064,9 @@ void QWidgetPrivate::setModal_sys() { } -void QWidgetPrivate::registerTouchWindow() +void QWidgetPrivate::registerTouchWindow(bool enable) { + Q_UNUSED(enable); Q_Q(QWidget); // enable WM_TOUCH* messages on our window -- cgit v0.12 From 5502ac79065fc220e3731d29c722be75013e2c35 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Mon, 24 Jan 2011 10:39:21 +0100 Subject: Cocoa: remove compiler warning --- src/gui/kernel/qwidget_mac.mm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index b3450ab..03f496e 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4981,6 +4981,7 @@ void QWidgetPrivate::registerDropSite(bool on) void QWidgetPrivate::registerTouchWindow(bool enable) { + Q_UNUSED(enable); #ifdef QT_MAC_USE_COCOA #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_6) @@ -5007,8 +5008,6 @@ void QWidgetPrivate::registerTouchWindow(bool enable) [view setAcceptsTouchEvents:NO]; } } -#else - Q_UNUSED(on); #endif #endif } -- cgit v0.12 From f3200133a385be03299c1b7ebe65c4304f65b9af Mon Sep 17 00:00:00 2001 From: miniak <milan.burda@gmail.com> Date: Thu, 13 Jan 2011 15:08:01 +0100 Subject: Add comctl32 v6 assembly dependency to applications only (not libraries) This improves the patch from merge request #2526 to add the comctl32 v6 assembly dependency to applications only, as it was being done previously (although only when /SUBSYSTEM:WINDOWS, not when /SUBSYSTEM:CONSOLE). Other existing makespecs are not affected, as they still have all flags in QMAKE_LFLAGS, and QMAKE_LFLAGS_EXE is simply empty. Merge-request: 1020 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- mkspecs/features/win32/console.prf | 4 +++- mkspecs/features/win32/windows.prf | 2 +- mkspecs/win32-msvc2005/qmake.conf | 3 ++- mkspecs/win32-msvc2008/qmake.conf | 3 ++- mkspecs/win32-msvc2010/qmake.conf | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/mkspecs/features/win32/console.prf b/mkspecs/features/win32/console.prf index b34e1c6..8a1725d 100644 --- a/mkspecs/features/win32/console.prf +++ b/mkspecs/features/win32/console.prf @@ -1,2 +1,4 @@ CONFIG -= windows -contains(TEMPLATE, ".*app") : QMAKE_LFLAGS += $$QMAKE_LFLAGS_CONSOLE +contains(TEMPLATE, ".*app") { + QMAKE_LFLAGS += $$QMAKE_LFLAGS_CONSOLE $$QMAKE_LFLAGS_EXE +} diff --git a/mkspecs/features/win32/windows.prf b/mkspecs/features/win32/windows.prf index cf81388..f41db80 100644 --- a/mkspecs/features/win32/windows.prf +++ b/mkspecs/features/win32/windows.prf @@ -1,6 +1,6 @@ CONFIG -= console contains(TEMPLATE, ".*app"){ - QMAKE_LFLAGS += $$QMAKE_LFLAGS_WINDOWS + QMAKE_LFLAGS += $$QMAKE_LFLAGS_WINDOWS $$QMAKE_LFLAGS_EXE win32-g++:DEFINES += QT_NEEDS_QMAIN win32-borland:DEFINES += QT_NEEDS_QMAIN diff --git a/mkspecs/win32-msvc2005/qmake.conf b/mkspecs/win32-msvc2005/qmake.conf index 63bef80..5b717e7 100644 --- a/mkspecs/win32-msvc2005/qmake.conf +++ b/mkspecs/win32-msvc2005/qmake.conf @@ -53,12 +53,13 @@ QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $< QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<< QMAKE_LINK = link -QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" +QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF QMAKE_LFLAGS_DEBUG = /DEBUG QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS +QMAKE_LFLAGS_EXE = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" QMAKE_LFLAGS_DLL = /DLL QMAKE_LFLAGS_LTCG = /LTCG diff --git a/mkspecs/win32-msvc2008/qmake.conf b/mkspecs/win32-msvc2008/qmake.conf index 9f9c919..c765562 100644 --- a/mkspecs/win32-msvc2008/qmake.conf +++ b/mkspecs/win32-msvc2008/qmake.conf @@ -55,12 +55,13 @@ QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $< QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<< QMAKE_LINK = link -QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" +QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF QMAKE_LFLAGS_DEBUG = /DEBUG QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS +QMAKE_LFLAGS_EXE = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" QMAKE_LFLAGS_DLL = /DLL QMAKE_LFLAGS_LTCG = /LTCG diff --git a/mkspecs/win32-msvc2010/qmake.conf b/mkspecs/win32-msvc2010/qmake.conf index 9471034..1cad99e 100644 --- a/mkspecs/win32-msvc2010/qmake.conf +++ b/mkspecs/win32-msvc2010/qmake.conf @@ -55,12 +55,13 @@ QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $< QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<< QMAKE_LINK = link -QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" +QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF QMAKE_LFLAGS_DEBUG = /DEBUG QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS +QMAKE_LFLAGS_EXE = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" QMAKE_LFLAGS_DLL = /DLL QMAKE_LFLAGS_LTCG = /LTCG -- cgit v0.12 From 673da830f6f83438e4b52296dbdc61a33112e4ec Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Mon, 24 Jan 2011 11:43:27 +0100 Subject: Partly revert b1c715f8214233f5b573ed58fc89c9dd70beabb4 --- src/gui/kernel/qwidget_s60.cpp | 3 +-- src/gui/kernel/qwidget_win.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index 7547bec..cb72800 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -990,9 +990,8 @@ void QWidgetPrivate::setMask_sys(const QRegion& /* region */) } -void QWidgetPrivate::registerTouchWindow(bool enable) +void QWidgetPrivate::registerTouchWindow() { - Q_UNUSED(enable); #ifdef QT_SYMBIAN_SUPPORTS_ADVANCED_POINTER Q_Q(QWidget); if (q->testAttribute(Qt::WA_WState_Created) && q->windowType() != Qt::Desktop) { diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp index 54784a2..a02c5ba 100644 --- a/src/gui/kernel/qwidget_win.cpp +++ b/src/gui/kernel/qwidget_win.cpp @@ -2064,9 +2064,8 @@ void QWidgetPrivate::setModal_sys() { } -void QWidgetPrivate::registerTouchWindow(bool enable) +void QWidgetPrivate::registerTouchWindow() { - Q_UNUSED(enable); Q_Q(QWidget); // enable WM_TOUCH* messages on our window -- cgit v0.12 From 7a5960b2991e9ac33bec0bb359ba825d0c4889af Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Mon, 24 Jan 2011 12:35:12 +0200 Subject: Fixed UTF-8 application names in device application menu in Symbian CHARACTER_SET UTF8 statement was missing from generated .rss file, causing localized application names containing UTF-8 characters to be rendered incorrectly. Task-number: QT-4476 Reviewed-by: axis --- qmake/generators/symbian/symbiancommon.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp index 1f4a852..2270c2e 100644 --- a/qmake/generators/symbian/symbiancommon.cpp +++ b/qmake/generators/symbian/symbiancommon.cpp @@ -629,6 +629,7 @@ void SymbianCommonGenerator::writeRssFile(QString &numberOfIcons, QString &iconF t << "// * user." << endl; t << "// ============================================================================" << endl; t << endl; + t << "CHARACTER_SET UTF8" << endl; t << "#include <appinfo.rh>" << endl; t << "#include \"" << fixedTarget << ".loc\"" << endl; t << endl; -- cgit v0.12 From 14e7c8bf3982d05f6fc5c744ebbad791db6ab191 Mon Sep 17 00:00:00 2001 From: Simon Hausmann <simon.hausmann@nokia.com> Date: Mon, 24 Jan 2011 13:06:29 +0100 Subject: Fix loop count in animanted gifs sometimes being incorrect Applied patch supplied in QT-4426, which also completes https://bugs.webkit.org/show_bug.cgi?id=36818 Task-number: QT-4426 Reviewed-by: Kim Motoyoshi Kalland <kim.kalland@nokia.com> --- src/gui/image/qgifhandler.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/gui/image/qgifhandler.cpp b/src/gui/image/qgifhandler.cpp index 4dd4743..7cb7373 100644 --- a/src/gui/image/qgifhandler.cpp +++ b/src/gui/image/qgifhandler.cpp @@ -1046,7 +1046,7 @@ QGifHandler::QGifHandler() { gifFormat = new QGIFFormat; nextDelay = 100; - loopCnt = 1; + loopCnt = -1; frameNumber = -1; scanIsCached = false; } @@ -1192,7 +1192,13 @@ int QGifHandler::loopCount() const QGIFFormat::scan(device(), &imageSizes, &loopCnt); scanIsCached = true; } - return loopCnt-1; // In GIF, loop count is iteration count, so subtract one + + if (loopCnt == 0) + return -1; + else if (loopCnt == -1) + return 0; + else + return loopCnt; } int QGifHandler::currentImageNumber() const -- cgit v0.12 From fa845566b3733bc06454b71e33b1ff405ba32280 Mon Sep 17 00:00:00 2001 From: Ralf Engels <ralf.engels@nokia.com> Date: Mon, 20 Dec 2010 16:47:07 +0100 Subject: Improve overshooting behaviour --- src/gui/util/qscroller.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp index 2ca4a6e..a9906f0 100644 --- a/src/gui/util/qscroller.cpp +++ b/src/gui/util/qscroller.cpp @@ -1253,17 +1253,6 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp qScrollerDebug() << "+++ createScrollingSegments: s:" << startPos << "maxPos:" << maxPos << "o:" << int(orientation); - // -- check if we are in overshoot - if (startPos < minPos) { - createScrollToSegments(v, sp->overshootScrollTime * 0.5, minPos, orientation, ScrollTypeOvershoot); - return; - } - - if (startPos > maxPos) { - createScrollToSegments(v, sp->overshootScrollTime * 0.5, maxPos, orientation, ScrollTypeOvershoot); - return; - } - qScrollerDebug() << "v = " << v << ", decelerationFactor = " << sp->decelerationFactor << ", curveType = " << sp->scrollingCurve.type(); // This is only correct for QEasingCurve::OutQuad (linear velocity, @@ -1299,6 +1288,20 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp if (nextSnap < lowerSnapPos || qIsNaN(lowerSnapPos)) lowerSnapPos = nextSnap; + // -- check if we end in overshoot + if ((startPos < minPos && endPos < minPos) || + (startPos > maxPos && endPos > maxPos)) { + qreal stopPos = endPos < minPos ? minPos : maxPos; + qreal oDistance = viewSize * sp->overshootScrollDistanceFactor * v / sp->maximumVelocity; + qreal oDeltaTime = sp->overshootScrollTime; + + if (qAbs(v) > sp->minimumVelocity) + pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.5, startPos, startPos + oDistance, sp->scrollingCurve.type(), orientation); + pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.3, startPos + oDistance, stopPos + oDistance * 0.3, QEasingCurve::InQuad, orientation); + pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.2, stopPos + oDistance * 0.3, stopPos, QEasingCurve::OutQuad, orientation); + return; + } + if (qAbs(v) < sp->minimumVelocity) { qScrollerDebug() << "### below minimum Vel" << orientation; -- cgit v0.12 From 4f9a318d639c4e7e09e56751d31608fb39d472af Mon Sep 17 00:00:00 2001 From: Ralf Engels <ralf.engels@nokia.com> Date: Tue, 21 Dec 2010 17:08:21 +0100 Subject: Review and improve scroller documentation --- src/gui/util/qscroller.cpp | 178 ++++++++++++++++++----------------- src/gui/util/qscrollerproperties.cpp | 78 ++++++++------- 2 files changed, 127 insertions(+), 129 deletions(-) diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp index a9906f0..ae66cd4 100644 --- a/src/gui/util/qscroller.cpp +++ b/src/gui/util/qscroller.cpp @@ -243,7 +243,7 @@ private: intuitive user experience. The QScroller object is the object that stores the current position and - speed of the scrolling and takes care of updates. + scrolling speed and takes care of updates. QScroller can be triggered by a flick gesture \code @@ -259,20 +259,20 @@ private: scroller->scrollTo(QPointF(100, 100)); \endcode - The scrolled QObjects will be receive a QScrollPrepareEvent whenever the scroller needs to + The scrolled QObjects receive a QScrollPrepareEvent whenever the scroller needs to update its geometry information and a QScrollEvent whenever the content of the object should actually be scrolled. - The scroller uses the global QAbstractAnimation timer to generate its QScrollEvents, but this - can be slowed down with QScrollerProperties::FrameRate on a per-QScroller basis. + The scroller uses the global QAbstractAnimation timer to generate its QScrollEvents. This + can be changed with QScrollerProperties::FrameRate on a per-QScroller basis. Several examples in the \c scroller examples directory show how QScroller, QScrollEvent and the scroller gesture can be used. - Even though this kinetic scroller has a huge number of settings available via + Even though this kinetic scroller has a large number of settings available via QScrollerProperties, we recommend that you leave them all at their default, platform optimized - values. In case you really want to change them you can experiment with the \c plot example in - the \c scroller examples directory first. + values. Before changing them you can experiment with the \c plot example in + the \c scroller examples directory. \sa QScrollEvent, QScrollPrepareEvent, QScrollerProperties */ @@ -293,9 +293,9 @@ bool QScroller::hasScroller(QObject *target) /*! Returns the scroller for the given \a target. - As long as the object exist this function will always return the same QScroller. - If a QScroller does not exist yet for the \a target, it will implicitly be created. - At no point will two QScrollers be active on one object. + As long as the object exists this function will always return the same QScroller instance. + If no QScroller exists for the \a target, one will implicitly be created. + At no point more than one QScroller will be active on an object. \sa hasScroller(), target() */ @@ -324,9 +324,9 @@ const QScroller *QScroller::scroller(const QObject *target) } /*! - Returns an application wide list of currently active, i.e. state() != - QScroller::Inactive, QScroller objects. - This routine is mostly useful when writing your own gesture recognizer. + Returns an application wide list of currently active QScroller objects. + Active QScroller objects are in a state() that is not QScroller::Inactive. + This function is useful when writing your own gesture recognizer. */ QList<QScroller *> QScroller::activeScrollers() { @@ -346,8 +346,8 @@ QObject *QScroller::target() const /*! \fn QScroller::scrollerPropertiesChanged(const QScrollerProperties &newProperties); - QScroller emits this signal whenever its scroller properties have been - changed. \a newProperties are the new scroller properties. + QScroller emits this signal whenever its scroller properties change. + \a newProperties are the new scroller properties. \sa scrollerProperties */ @@ -355,7 +355,7 @@ QObject *QScroller::target() const /*! \property QScroller::scrollerProperties \brief The scroller properties of this scroller. - The properties will be used by the QScroller to determine its scrolling behaviour. + The properties are used by the QScroller to determine its scrolling behavior. */ QScrollerProperties QScroller::scrollerProperties() const { @@ -378,24 +378,25 @@ void QScroller::setScrollerProperties(const QScrollerProperties &sp) /*! - Registers a custom scroll gesture recognizer and grabs it for the \a + Registers a custom scroll gesture recognizer, grabs it for the \a target and returns the resulting gesture type. If \a scrollGestureType is - set to TouchGesture the gesture will trigger on touch events - if set to + set to TouchGesture the gesture triggers on touch events. If it is set to one of LeftMouseButtonGesture, RightMouseButtonGesture or - MiddleMouseButtonGesture it will trigger on mouse events of the + MiddleMouseButtonGesture it triggers on mouse events of the corresponding button. Only one scroll gesture can be active on a single object at the same - time, so if you call this function twice on the same object, it will + time. If you call this function twice on the same object, it will ungrab the existing gesture before grabbing the new one. - Please note: To avoid nasty side-effects, all mouse events will be - consumed while the gesture is triggered. Since the mouse press event is - not consumed, the gesture needs to also send a fake mouse release event - at the global position \c{(INT_MIN, INT_MIN)} to make sure that it - doesn't mess with the internal states of the widget that received the - mouse press in the first place (which could e.g. be a QPushButton - inside a QScrollArea). + \note To avoid unwanted side-effects, mouse events are consumed while + the gesture is triggered. Since the initial mouse press event is + not consumed, the gesture sends a fake mouse release event + at the global position \c{(INT_MIN, INT_MIN)}. This ensures that + internal states of the widget that received the original mouse press + are consistent. + + \sa ungrabGesture, grabbedGesture */ Qt::GestureType QScroller::grabGesture(QObject *target, ScrollerGestureType scrollGestureType) { @@ -437,6 +438,8 @@ Qt::GestureType QScroller::grabGesture(QObject *target, ScrollerGestureType scro /*! Returns the gesture type currently grabbed for the \a target or 0 if no gesture is grabbed. + + \sa grabGesture, ungrabGesture */ Qt::GestureType QScroller::grabbedGesture(QObject *target) { @@ -449,6 +452,9 @@ Qt::GestureType QScroller::grabbedGesture(QObject *target) /*! Ungrabs the gesture for the \a target. + Does nothing if no gesture is grabbed. + + \sa grabGesture, grabbedGesture */ void QScroller::ungrabGesture(QObject *target) { @@ -521,7 +527,7 @@ QScroller::State QScroller::state() const } /*! - Stops the scroller and resets the state back to Inactive. + Stops the scroller and resets its state back to Inactive. */ void QScroller::stop() { @@ -543,13 +549,13 @@ void QScroller::stop() } /*! - \brief Returns the pixel per meter metric for the scrolled widget. + Returns the pixel per meter metric for the scrolled widget. The value is reported for both the x and y axis separately by using a QPointF. - \note Please note that this value should be physically correct, while the actual DPI settings - that Qt returns for the display may be reported wrongly (on purpose) by the underlying - windowing system (e.g. Mac OS X or Maemo 5). + \note Please note that this value should be physically correct. The actual DPI settings + that Qt returns for the display may be reported wrongly on purpose by the underlying + windowing system, for example on Mac OS X or Maemo 5. */ QPointF QScroller::pixelPerMeter() const { @@ -574,10 +580,8 @@ QPointF QScroller::pixelPerMeter() const } /*! - \brief Returns the current velocity of the scroller. - - Returns the current scrolling velocity in meter per second when in the state Scrolling. - Returns a null velocity otherwise. + Returns the current scrolling velocity in meter per second when the state is Scrolling or Dragging. + Returns a zero velocity otherwise. The velocity is reported for both the x and y axis separately by using a QPointF. @@ -617,11 +621,9 @@ QPointF QScroller::velocity() const } /*! - \brief Returns the target position for the scroll movement. - - Returns the planned final position for the current scroll movement or the current - position if the scroller is not in the scrolling state. - The result is undefined when the scroller is in the inactive state. + Returns the estimated final position for the current scroll movement. + Returns the current position if the scroller state is not Scrolling. + The result is undefined when the scroller state is Inactive. The target position is in pixel. @@ -642,7 +644,7 @@ QPointF QScroller::finalPosition() const In this case the scroller might or might not overshoot. The scrolling speed will be calculated so that the given position will - be reached after a platform-defined time span (e.g. 1 second for Maemo 5). + be reached after a platform-defined time span. \a pos is given in viewport coordinates. @@ -656,7 +658,7 @@ void QScroller::scrollTo(const QPointF &pos) /*! \overload - This version will reach its destination position in \a scrollTime milli seconds. + This version will reach its destination position in \a scrollTime milliseconds. */ void QScroller::scrollTo(const QPointF &pos, int scrollTime) { @@ -704,10 +706,12 @@ void QScroller::scrollTo(const QPointF &pos, int scrollTime) In cases where it is not possible to fit the rect plus margins inside the viewport the contents are scrolled so that as much as possible is visible from \a rect. - The scrolling speed will be calculated so that the given position will - be reached after a platform-defined time span (e.g. 1 second for Maemo 5). + The scrolling speed is calculated so that the given position is reached after a platform-defined + time span. This function performs the actual scrolling by calling scrollTo(). + + \sa scrollTo */ void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin) { @@ -717,7 +721,7 @@ void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin) /*! \overload - This version will reach its destination position in \a scrollTime milli seconds. + This version will reach its destination position in \a scrollTime milliseconds. */ void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime) { @@ -787,11 +791,11 @@ void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, } /*! This function resends the QScrollPrepareEvent. - * Calling resendPrepareEvent triggers a QScrollPrepareEvent from the scroller. - * This will allow the receiver to re-set content position and content size while - * scrolling. - * Calling this function while in the Inactive state is useless as the prepare event - * is send again right before scrolling starts. + Calling resendPrepareEvent triggers a QScrollPrepareEvent from the scroller. + This allows the receiver to re-set content position and content size while + scrolling. + Calling this function while in the Inactive state is useless as the prepare event + is sent again before scrolling starts. */ void QScroller::resendPrepareEvent() { @@ -799,11 +803,10 @@ void QScroller::resendPrepareEvent() d->prepareScrolling(d->pressPosition); } -/*! Set the snap positions for the horizontal axis. - * Set the snap positions to a list of \a positions. - * This will overwrite all previously set snap positions and also a previously - * set snapping interval. - * Snapping can be deactivated by setting an empty list of positions. +/*! Set the snap positions for the horizontal axis to a list of \a positions. + This overwrites all previously set snap positions and also a previously + set snapping interval. + Snapping can be deactivated by setting an empty list of positions. */ void QScroller::setSnapPositionsX(const QList<qreal> &positions) { @@ -814,13 +817,12 @@ void QScroller::setSnapPositionsX(const QList<qreal> &positions) d->recalcScrollingSegments(); } -/*! Set the snap positions for the horizontal axis. - * Set the snap positions to regular spaced intervals. - * The first snap position will be at \a first from the beginning of the list. The next at \a first + \a interval and so on. - * This can be used to implement a list header. - * This will overwrite all previously set snap positions and also a previously - * set snapping interval. - * Snapping can be deactivated by setting an interval of 0.0 +/*! Set the snap positions for the horizontal axis to regular spaced intervals. + The first snap position is at \a first. The next at \a first + \a interval. + This can be used to implement a list header. + This overwrites all previously set snap positions and also a previously + set snapping interval. + Snapping can be deactivated by setting an interval of 0.0 */ void QScroller::setSnapPositionsX(qreal first, qreal interval) { @@ -832,11 +834,10 @@ void QScroller::setSnapPositionsX(qreal first, qreal interval) d->recalcScrollingSegments(); } -/*! Set the snap positions for the vertical axis. - * Set the snap positions to a list of \a positions. - * This will overwrite all previously set snap positions and also a previously - * set snapping interval. - * Snapping can be deactivated by setting an empty list of positions. +/*! Set the snap positions for the vertical axis to a list of \a positions. + This overwrites all previously set snap positions and also a previously + set snapping interval. + Snapping can be deactivated by setting an empty list of positions. */ void QScroller::setSnapPositionsY(const QList<qreal> &positions) { @@ -847,12 +848,11 @@ void QScroller::setSnapPositionsY(const QList<qreal> &positions) d->recalcScrollingSegments(); } -/*! Set the snap positions for the vertical axis. - * Set the snap positions to regular spaced intervals. - * The first snap position will be at \a first. The next at \a first + \a interval and so on. - * This will overwrite all previously set snap positions and also a previously - * set snapping interval. - * Snapping can be deactivated by setting an interval of 0.0 +/*! Set the snap positions for the vertical axis to regular spaced intervals. + The first snap position is at \a first. The next at \a first + \a interval. + This overwrites all previously set snap positions and also a previously + set snapping interval. + Snapping can be deactivated by setting an interval of 0.0 */ void QScroller::setSnapPositionsY(qreal first, qreal interval) { @@ -951,14 +951,15 @@ void QScrollerPrivate::timerTick() /*! This function is used by gesture recognizers to inform the scroller about a new input event. - The scroller will change its internal state() according to the input event and its attached - scroller properties. Since the scroller doesn't care about the actual kind of input device the - event came from, you need to decompose the event into the \a input type, a \a position and a + The scroller changes its internal state() according to the input event and its attached + scroller properties. The scroller doesn't distinguish between the kind of input device the + event came from. Therefore the event needs to be split into the \a input type, a \a position and a milli-second \a timestamp. The \a position needs to be in the target's coordinate system. + The return value is \c true if the event should be consumed by the calling filter or \c false if the event should be forwarded to the control. - \note Using grabGesture() should be sufficient for most use cases though. + \note Using grabGesture() should be sufficient for most use cases. */ bool QScroller::handleInput(Input input, const QPointF &position, qint64 timestamp) { @@ -1380,7 +1381,8 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp } -/*! Prepares scrolling by sending a QScrollPrepareEvent to the receiver widget. +/*! \internal + Prepares scrolling by sending a QScrollPrepareEvent to the receiver widget. Returns true if the scrolling was accepted and a target was returned. */ bool QScrollerPrivate::prepareScrolling(const QPointF &position) @@ -1838,12 +1840,12 @@ void QScrollerPrivate::setContentPositionHelperScrolling() } /*! \internal - * Returns the next snap point in direction. - * If \a direction >0 it will return the next snap point that is larger than the current position. - * If \a direction <0 it will return the next snap point that is smaller than the current position. - * If \a direction ==0 it will return the nearest snap point (or the current position if we are already - * on a snap point. - * Returns the nearest snap position or NaN if no such point could be found. + Returns the next snap point in direction. + If \a direction >0 it will return the next snap point that is larger than the current position. + If \a direction <0 it will return the next snap point that is smaller than the current position. + If \a direction ==0 it will return the nearest snap point (or the current position if we are already + on a snap point. + Returns the nearest snap position or NaN if no such point could be found. */ qreal QScrollerPrivate::nextSnapPos(qreal p, int dir, Qt::Orientation orientation) { @@ -1965,7 +1967,7 @@ qreal QScrollerPrivate::nextSnapPos(qreal p, int dir, Qt::Orientation orientatio This enum contains the different QScroller states. \value Inactive The scroller is not scrolling and nothing is pressed. - \value Pressed A touch event was received or the mouse button pressed but the scroll area is currently not dragged. + \value Pressed A touch event was received or the mouse button was pressed but the scroll area is currently not dragged. \value Dragging The scroll area is currently following the touch point or mouse. \value Scrolling The scroll area is moving on it's own. */ @@ -1976,8 +1978,8 @@ qreal QScrollerPrivate::nextSnapPos(qreal p, int dir, Qt::Orientation orientatio This enum contains the different gesture types that are supported by the QScroller gesture recognizer. \value TouchGesture The gesture recognizer will only trigger on touch - events. Specifically it will react on single touch points when using a - touch screen and dual touch points when using a touchpad. + events. Specifically it will react on single touch points when using a + touch screen and dual touch points when using a touchpad. \value LeftMouseButtonGesture The gesture recognizer will only trigger on left mouse button events. \value MiddleMouseButtonGesture The gesture recognizer will only trigger on middle mouse button events. \value RightMouseButtonGesture The gesture recognizer will only trigger on right mouse button events. diff --git a/src/gui/util/qscrollerproperties.cpp b/src/gui/util/qscrollerproperties.cpp index 2e52959..b159e05 100644 --- a/src/gui/util/qscrollerproperties.cpp +++ b/src/gui/util/qscrollerproperties.cpp @@ -95,11 +95,11 @@ QScrollerPropertiesPrivate *QScrollerPropertiesPrivate::defaults() The QScrollerProperties class stores the parameters used by QScroller. - The default settings are platform dependant and Qt will emulate the + The default settings are platform dependent so that Qt emulates the platform behaviour for kinetic scrolling. As a convention the QScrollerProperties are in physical units (meter, - seconds) and will be converted by QScroller using the current DPI. + seconds) and are converted by QScroller using the current DPI. \sa QScroller */ @@ -179,10 +179,10 @@ bool QScrollerPropertiesPrivate::operator==(const QScrollerPropertiesPrivate &p) } /*! - Sets the scroller properties returned by the default constructor to \a sp. + Sets the scroller properties for all new QScrollerProperties objects to \a sp. Use this function to override the platform default properties returned by the default - constructor. If you only want to change the scroller properties of a single scroller, then use + constructor. If you only want to change the scroller properties of a single scroller, use QScroller::setScrollerProperties() \note Calling this function will not change the content of already existing @@ -291,50 +291,48 @@ void QScrollerProperties::setScrollMetric(ScrollMetric metric, const QVariant &v This enum describes the various modes of overshooting. - \value OvershootWhenScrollable Overshooting is when the content is scrollable. This is the + \value OvershootWhenScrollable Overshooting is possible when the content is scrollable. This is the default. - \value OvershootAlwaysOff Overshooting is never enabled (even when the content is scrollable). + \value OvershootAlwaysOff Overshooting is never enabled, even when the content is scrollable. - \value OvershootAlwaysOn Overshooting is always enabled (even when the content is not - scrollable). + \value OvershootAlwaysOn Overshooting is always enabled, even when the content is not + scrollable. */ /*! \enum QScrollerProperties::ScrollMetric This enum contains the different scroll metric types. When not indicated otherwise the - setScrollMetric function expects a QVariant of a real value. + setScrollMetric function expects a QVariant of type qreal. - See the QScroller documentation for a further explanation of the concepts behind the different + See the QScroller documentation for further details of the concepts behind the different values. - \value MousePressEventDelay This is the time a mouse press event will be delayed when starting + \value MousePressEventDelay This is the time a mouse press event is delayed when starting a flick gesture in \c{[s]}. If the gesture is triggered within that time, no mouse press or - release will be sent to the scrolled object. If it triggers after that delay the (delayed) - mouse press plus a faked release event (at global postion \c{QPoint(-QWIDGETSIZE_MAX, - -QWIDGETSIZE_MAX)} will be sent. If the gesture is canceled, then both the (delayed) mouse - press plus the real release event will be delivered. + release is sent to the scrolled object. If it triggers after that delay the delayed + mouse press plus a faked release event at global postion \c{QPoint(-QWIDGETSIZE_MAX, + -QWIDGETSIZE_MAX)} is sent. If the gesture is canceled, then both the delayed mouse + press plus the real release event are delivered. \value DragStartDistance This is the minimum distance the touch or mouse point needs to be moved before the flick gesture is triggered in \c m. - \value DragVelocitySmoothingFactor A value that describes how much new drag velocities are + \value DragVelocitySmoothingFactor A value that describes to which extent new drag velocities are included in the final scrolling velocity. This value should be in the range between \c 0 and - \c 1. The lower the value, the more smoothing will be applied to the dragging velocity. The - default value is \c 0.8. + \c 1. The lower the value, the more smoothing is applied to the dragging velocity. - \value AxisLockThreshold If greater than zero a scroll movement will be restricted to one axis - only if the movement is inside an angle about the axis. The threshold must be in the range \c 0 - to \c 1. + \value AxisLockThreshold Restricts the movement to one axis if the movement is inside an angle + around the axis. The threshold must be in the range \c 0 to \c 1. \value ScrollingCurve The QEasingCurve used when decelerating the scrolling velocity after an user initiated flick. Please note that this is the easing curve for the positions, \bold{not} - the velocity: the default is QEasingCurve::OutQuad, which results is a linear decrease in + the velocity: the default is QEasingCurve::OutQuad, which results in a linear decrease in velocity (1st derivative) and a constant deceleration (2nd derivative). \value DecelerationFactor This factor influences how long it takes the scroller to decelerate - to 0 velocity. The actual value heavily depends on the chosen ScrollingCurve, but for most + to 0 velocity. The actual value depends on the chosen ScrollingCurve. For most types the value should be in the range from \c 0.1 to \c 2.0 \value MinimumVelocity The minimum velocity that is needed after ending the touch or releasing @@ -344,39 +342,38 @@ void QScrollerProperties::setScrollMetric(ScrollMetric metric, const QVariant &v \value MaximumClickThroughVelocity This is the maximum allowed scroll speed for a click-through in \c{m/s}. This means that a click on a currently (slowly) scrolling object will not only stop - the scrolling but the click event will also be delivered to the UI control - this is very + the scrolling but the click event will also be delivered to the UI control. This is useful when using exponential-type scrolling curves. \value AcceleratingFlickMaximumTime This is the maximum time in \c seconds that a flick gesture - can take to be recognized as an accelerating flick. If set to zero no such gesture will be + can take to be recognized as an accelerating flick. If set to zero no such gesture is detected. An "accelerating flick" is a flick gesture executed on an already scrolling object. In such cases the scrolling speed is multiplied by AcceleratingFlickSpeedupFactor in order to accelerate it. - \value AcceleratingFlickSpeedupFactor The current speed will be multiplied by this number if an - accelerating flick is detected. Should be \c{> 1}. + \value AcceleratingFlickSpeedupFactor The current speed is multiplied by this number if an + accelerating flick is detected. Should be \c{>= 1}. \value SnapPositionRatio This is the distance that the user must drag the area beween two snap - points in order to snap it to the next position. e.g. \c{0.33} means that the scroll must only + points in order to snap it to the next position. \c{0.33} means that the scroll must only reach one third of the distance between two snap points to snap to the next one. The ratio must - be in the range \c 0 to \c 1. + be between \c 0 and \c 1. \value SnapTime This is the time factor for the scrolling curve. A lower value means that the scrolling will take longer. The scrolling distance is independet of this value. \value OvershootDragResistanceFactor This value is the factor between the mouse dragging and - the actual scroll area movement (during overshoot). The factor must be in the range \c 0 to \c - 1. + the actual scroll area movement (during overshoot). The factor must be between \c 0 and \c 1. \value OvershootDragDistanceFactor This is the maximum distance for overshoot movements while - dragging. The actual overshoot distance will be calculated by multiplying this value with the - viewport size of the scrolled object. The factor must be in the range \c 0 to \c 1. + dragging. The actual overshoot distance is calculated by multiplying this value with the + viewport size of the scrolled object. The factor must be between \c 0 and \c 1. \value OvershootScrollDistanceFactor This is the maximum distance for overshoot movements while - scrolling. The actual overshoot distance will be calculated by multiplying this value with the - viewport size of the scrolled object. The factor must be in the range \c 0 to \c 1. + scrolling. The actual overshoot distance is calculated by multiplying this value with the + viewport size of the scrolled object. The factor must be between \c 0 and \c 1. - \value OvershootScrollTime This is the time in \c seconds that will be used to play the + \value OvershootScrollTime This is the time in \c seconds that is used to play the complete overshoot animation. \value HorizontalOvershootPolicy This is the horizontal overshooting policy (see OvershootPolicy). @@ -385,13 +382,12 @@ void QScrollerProperties::setScrollMetric(ScrollMetric metric, const QVariant &v \value FrameRate This is the frame rate which should be used while dragging or scrolling. QScroller uses a QAbstractAnimation timer internally to sync all scrolling operations to other - animations that might be active at the same time. If the Standard value of 60 frames per - second is too fast for your use case, you can lower the frames per second with this setting - (while still being in-sync with QAbstractAnimation). Please note that only the values of the + animations that might be active at the same time. If the standard value of 60 frames per + second is too fast, it can be lowered with this setting, + while still being in-sync with QAbstractAnimation. Please note that only the values of the FrameRates enum are allowed here. - \value ScrollMetricCount This is just used when enumerating the metrics. It is always the last - entry. + \value ScrollMetricCount This is always the last entry. */ QT_END_NAMESPACE -- cgit v0.12 From 4810b587a65d81f8f90646efd09cadeb1276a756 Mon Sep 17 00:00:00 2001 From: Robert Griebl <robert.griebl@nokia.com> Date: Thu, 20 Jan 2011 14:47:37 +0100 Subject: Fix Xrandr DPI calculation for NVidia TwinView. The problem is that a Xinerama 'screen' (as used by QDesktopWidget) does NOT correspond to a Xrandr 'screen', so we have to convert via the root windows. Reviewed-by: Ralf Engels --- src/gui/util/qscroller.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp index ae66cd4..2eb6d2f 100644 --- a/src/gui/util/qscroller.cpp +++ b/src/gui/util/qscroller.cpp @@ -1006,9 +1006,18 @@ QPointF QScrollerPrivate::realDpi(int screen) return QPointF(260, 260); # elif defined(Q_WS_X11) && !defined(QT_NO_XRANDR) - if (X11->use_xrandr && X11->ptrXRRSizes) { + if (X11 && X11->use_xrandr && X11->ptrXRRSizes && X11->ptrXRRRootToScreen) { int nsizes = 0; - XRRScreenSize *sizes = X11->ptrXRRSizes(X11->display, screen == -1 ? X11->defaultScreen : screen, &nsizes); + // QDesktopWidget is based on Xinerama screens, which do not always + // correspond to RandR screens: NVidia's TwinView e.g. will show up + // as 2 screens in QDesktopWidget, but libXRandR will only see 1 screen. + // (although with the combined size of the Xinerama screens). + // Additionally, libXrandr will simply crash when calling XRRSizes + // for (the non-existant) screen 1 in this scenario. + Window root = RootWindow(X11->display, screen == -1 ? X11->defaultScreen : screen); + int randrscreen = (root != XNone) ? X11->ptrXRRRootToScreen(X11->display, root) : -1; + + XRRScreenSize *sizes = X11->ptrXRRSizes(X11->display, randrscreen == -1 ? 0 : randrscreen, &nsizes); if (nsizes > 0 && sizes && sizes->width && sizes->height && sizes->mwidth && sizes->mheight) { qScrollerDebug() << "XRandR DPI:" << QPointF(qreal(25.4) * qreal(sizes->width) / qreal(sizes->mwidth), qreal(25.4) * qreal(sizes->height) / qreal(sizes->mheight)); -- cgit v0.12 From 7bad867382ad6c84155ffcfbb361709a8e8184ab Mon Sep 17 00:00:00 2001 From: Robert Griebl <robert.griebl@nokia.com> Date: Mon, 24 Jan 2011 12:45:03 +0100 Subject: Fixed overshooting with a very low start velocity. Before this patch, the slow down (overshoot) was a separate scroll segment. This could lead to an actual acceleration when going into overshoot with a very low velocity. The new approach is to just continue with the normal scroll segment, until the max overshoot distance is reached and only add one additional segment for the bounce-back animation to complete the overshoot animation. Reviewed-by: Ralf Engels --- src/gui/util/qscroller.cpp | 153 +++++++++++++++++++++++++-------------------- src/gui/util/qscroller_p.h | 5 +- 2 files changed, 87 insertions(+), 71 deletions(-) diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp index 2eb6d2f..7173270 100644 --- a/src/gui/util/qscroller.cpp +++ b/src/gui/util/qscroller.cpp @@ -83,9 +83,9 @@ bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event); QDebug &operator<<(QDebug &dbg, const QScrollerPrivate::ScrollSegment &s) { - dbg << "\n Time: start:" << s.startTime << " duration:" << s.deltaTime; - dbg << "\n Pos: start:" << s.startPos << " delta:" << s.deltaPos; - dbg << "\n Curve: type:" << s.curve.type() << " max progress:" << s.maxProgress << "\n"; + dbg << "\n Time: start:" << s.startTime << " duration:" << s.deltaTime << " stop progress:" << s.stopProgress; + dbg << "\n Pos: start:" << s.startPos << " delta:" << s.deltaPos << " stop:" << s.stopPos; + dbg << "\n Curve: type:" << s.curve.type() << "\n"; return dbg; } @@ -601,18 +601,17 @@ QPointF QScroller::velocity() const if (!d->xSegments.isEmpty()) { const QScrollerPrivate::ScrollSegment &s = d->xSegments.head(); - qreal progress = qreal(now - s.startTime) / (qreal(s.deltaTime) / s.maxProgress); - qreal v = qSign(s.deltaPos) * qreal(s.deltaTime) / s.maxProgress / qreal(1000) * sp->decelerationFactor * qreal(0.5) * differentialForProgress(s.curve, progress); + qreal progress = qreal(now - s.startTime) / qreal(s.deltaTime); + qreal v = qSign(s.deltaPos) * qreal(s.deltaTime) / qreal(1000) * sp->decelerationFactor * qreal(0.5) * differentialForProgress(s.curve, progress); vel.setX(v); } if (!d->ySegments.isEmpty()) { const QScrollerPrivate::ScrollSegment &s = d->ySegments.head(); - qreal progress = qreal(now - s.startTime) / (qreal(s.deltaTime) / s.maxProgress); - qreal v = qSign(s.deltaPos) * qreal(s.deltaTime) / s.maxProgress / qreal(1000) * sp->decelerationFactor * qreal(0.5) * differentialForProgress(s.curve, progress); + qreal progress = qreal(now - s.startTime) / qreal(s.deltaTime); + qreal v = qSign(s.deltaPos) * qreal(s.deltaTime) / qreal(1000) * sp->decelerationFactor * qreal(0.5) * differentialForProgress(s.curve, progress); vel.setY(v); } - //qScrollerDebug() << "Velocity: " << vel; return vel; } default: @@ -1083,8 +1082,23 @@ void QScrollerPrivate::updateVelocity(const QPointF &deltaPixelRaw, qint64 delta deltaPixel = deltaPixelRaw * qreal(2.5) * ppm / 1000 / (deltaPixelRaw / qreal(deltaTime)).manhattanLength(); QPointF newv = -deltaPixel / qreal(deltaTime) * qreal(1000) / ppm; - if (releaseVelocity != QPointF(0, 0)) - newv = newv * sp->dragVelocitySmoothingFactor + releaseVelocity * (qreal(1) - sp->dragVelocitySmoothingFactor); + // around 95% of all updates are in the [1..50] ms range, so make sure + // to scale the smoothing factor over that range: this way a 50ms update + // will have full impact, while 5ms update will only have a 10% impact. + qreal smoothing = sp->dragVelocitySmoothingFactor * qMin(qreal(deltaTime), qreal(50)) / qreal(50); + + // only smooth if we already have a release velocity and only if the + // user hasn't stopped to move his finger for more than 100ms + if ((releaseVelocity != QPointF(0, 0)) && (deltaTime < 100)) { + qScrollerDebug() << "SMOOTHED from " << newv << " to " << newv * smoothing + releaseVelocity * (qreal(1) - smoothing); + // smooth x or y only if the new velocity is either 0 or at least in + // the same direction of the release velocity + if (!newv.x() || (qSign(releaseVelocity.x()) == qSign(newv.x()))) + newv.setX(newv.x() * smoothing + releaseVelocity.x() * (qreal(1) - smoothing)); + if (!newv.y() || (qSign(releaseVelocity.y()) == qSign(newv.y()))) + newv.setY(newv.y() * smoothing + releaseVelocity.y() * (qreal(1) - smoothing)); + } else + qScrollerDebug() << "NO SMOOTHING to " << newv; releaseVelocity.setX(qBound(-sp->maximumVelocity, newv.x(), sp->maximumVelocity)); releaseVelocity.setY(qBound(-sp->maximumVelocity, newv.y(), sp->maximumVelocity)); @@ -1092,23 +1106,24 @@ void QScrollerPrivate::updateVelocity(const QPointF &deltaPixelRaw, qint64 delta qScrollerDebug() << " --> new velocity:" << releaseVelocity; } -void QScrollerPrivate::pushSegment(ScrollType type, qreal deltaTime, qreal startPos, qreal endPos, QEasingCurve::Type curve, Qt::Orientation orientation, qreal maxProgress) +void QScrollerPrivate::pushSegment(ScrollType type, qreal deltaTime, qreal stopProgress, qreal startPos, qreal deltaPos, qreal stopPos, QEasingCurve::Type curve, Qt::Orientation orientation) { - if (startPos == endPos) + if (startPos == stopPos || deltaPos == 0) return; ScrollSegment s; if (orientation == Qt::Horizontal && !xSegments.isEmpty()) - s.startTime = xSegments.last().startTime + xSegments.last().deltaTime; + s.startTime = xSegments.last().startTime + xSegments.last().deltaTime * xSegments.last().stopProgress; else if (orientation == Qt::Vertical && !ySegments.isEmpty()) - s.startTime = ySegments.last().startTime + ySegments.last().deltaTime; + s.startTime = ySegments.last().startTime + ySegments.last().deltaTime * ySegments.last().stopProgress; else s.startTime = monotonicTimer.elapsed(); s.startPos = startPos; - s.deltaPos = endPos - startPos; + s.deltaPos = deltaPos; + s.stopPos = stopPos; s.deltaTime = deltaTime * 1000; - s.maxProgress = maxProgress; + s.stopProgress = stopProgress; s.curve.setType(curve); s.type = type; @@ -1143,23 +1158,17 @@ void QScrollerPrivate::recalcScrollingSegments(bool forceRecalc) */ qreal QScrollerPrivate::scrollingSegmentsEndPos(Qt::Orientation orientation) const { - const QQueue<ScrollSegment> *segments; - qreal endPos; - if (orientation == Qt::Horizontal) { - segments = &xSegments; - endPos = contentPosition.x() + overshootPosition.x(); + if (xSegments.isEmpty()) + return contentPosition.x() + overshootPosition.x(); + else + return xSegments.last().stopPos; } else { - segments = &ySegments; - endPos = contentPosition.y() + overshootPosition.y(); - } - - if (!segments->isEmpty()) { - const ScrollSegment &last = segments->last(); - endPos = last.startPos + last.deltaPos; + if (ySegments.isEmpty()) + return contentPosition.y() + overshootPosition.y(); + else + return ySegments.last().stopPos; } - - return endPos; } /*! \internal @@ -1185,23 +1194,23 @@ bool QScrollerPrivate::scrollingSegmentsValid(Qt::Orientation orientation) return true; const ScrollSegment &last = segments->last(); - qreal endPos = last.startPos + last.deltaPos; + qreal stopPos = last.stopPos; if (last.type == ScrollTypeScrollTo) return true; // scrollTo is always valid if (last.type == ScrollTypeOvershoot && - endPos != minPos && endPos != maxPos) + (stopPos != minPos && stopPos != maxPos)) return false; - if (endPos < minPos || endPos > maxPos) + if (stopPos < minPos || stopPos > maxPos) return false; - if (endPos == minPos || endPos == maxPos) // the begin and the end of the list are always ok + if (stopPos == minPos || stopPos == maxPos) // the begin and the end of the list are always ok return true; - qreal nextSnap = nextSnapPos(endPos, 0, orientation); - if (!qIsNaN(nextSnap) && endPos != nextSnap) + qreal nextSnap = nextSnapPos(stopPos, 0, orientation); + if (!qIsNaN(nextSnap) && stopPos != nextSnap) return false; return true; @@ -1214,11 +1223,10 @@ void QScrollerPrivate::createScrollToSegments(qreal v, qreal deltaTime, qreal en { Q_UNUSED(v); - if (orientation == Qt::Horizontal) { + if (orientation == Qt::Horizontal) xSegments.clear(); - } else { + else ySegments.clear(); - } qScrollerDebug() << "+++ createScrollToSegments: t:" << deltaTime << "ep:" << endPos << "o:" << int(orientation); @@ -1226,10 +1234,10 @@ void QScrollerPrivate::createScrollToSegments(qreal v, qreal deltaTime, qreal en qreal startPos = (orientation == Qt::Horizontal) ? contentPosition.x() + overshootPosition.x() : contentPosition.y() + overshootPosition.y(); - qreal deltaPos = endPos - startPos; + qreal deltaPos = (endPos - startPos) / 2; - pushSegment(type, deltaTime * 0.3, startPos, startPos + deltaPos * 0.5, QEasingCurve::InQuad, orientation); - pushSegment(type, deltaTime * 0.7, startPos + deltaPos * 0.5, endPos, sp->scrollingCurve.type(), orientation); + pushSegment(type, deltaTime * 0.3, 1.0, startPos, deltaPos, startPos + deltaPos, QEasingCurve::InQuad, orientation); + pushSegment(type, deltaTime * 0.7, 1.0, startPos + deltaPos, deltaPos, endPos, sp->scrollingCurve.type(), orientation); } /*! \internal @@ -1298,17 +1306,13 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp if (nextSnap < lowerSnapPos || qIsNaN(lowerSnapPos)) lowerSnapPos = nextSnap; - // -- check if we end in overshoot + // -- check if are in overshoot and end in overshoot if ((startPos < minPos && endPos < minPos) || (startPos > maxPos && endPos > maxPos)) { qreal stopPos = endPos < minPos ? minPos : maxPos; - qreal oDistance = viewSize * sp->overshootScrollDistanceFactor * v / sp->maximumVelocity; qreal oDeltaTime = sp->overshootScrollTime; - if (qAbs(v) > sp->minimumVelocity) - pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.5, startPos, startPos + oDistance, sp->scrollingCurve.type(), orientation); - pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.3, startPos + oDistance, stopPos + oDistance * 0.3, QEasingCurve::InQuad, orientation); - pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.2, stopPos + oDistance * 0.3, stopPos, QEasingCurve::OutQuad, orientation); + pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.7, 1.0, startPos, stopPos - startPos, stopPos, sp->scrollingCurve.type(), orientation); return; } @@ -1337,8 +1341,9 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp endPos = higherSnapPos; deltaPos = endPos - startPos; - pushSegment(ScrollTypeFlick, sp->snapTime * 0.3, startPos, startPos + deltaPos * 0.3, QEasingCurve::InQuad, orientation); - pushSegment(ScrollTypeFlick, sp->snapTime * 0.7, startPos + deltaPos * 0.3, endPos, sp->scrollingCurve.type(), orientation); + qreal midPos = startPos + deltaPos * 0.3; + pushSegment(ScrollTypeFlick, sp->snapTime * 0.3, 1.0, startPos, midPos - startPos, midPos, QEasingCurve::InQuad, orientation); + pushSegment(ScrollTypeFlick, sp->snapTime * 0.7, 1.0, midPos, endPos - midPos, endPos, sp->scrollingCurve.type(), orientation); return; } @@ -1365,28 +1370,33 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp qScrollerDebug() << "Overshoot: delta:" << (stopPos - startPos); - qreal maxProgress = progressForValue(sp->scrollingCurve, qAbs((stopPos - startPos) / deltaPos)); - qScrollerDebug() << "Overshoot maxp:" << maxProgress; + qreal stopProgress = progressForValue(sp->scrollingCurve, qAbs((stopPos - startPos) / deltaPos)); - pushSegment(ScrollTypeFlick, deltaTime * maxProgress, startPos, stopPos, sp->scrollingCurve.type(), orientation, maxProgress); + if (!canOvershoot) { + qScrollerDebug() << "Overshoot stopp:" << stopProgress; - if (canOvershoot) { - qreal endV = qSign(v) * deltaTime * sp->decelerationFactor * qreal(0.5) * differentialForProgress(sp->scrollingCurve, maxProgress); - qScrollerDebug() << "Overshoot: velocity" << endV; - qScrollerDebug() << "Overshoot: maxVelocity" << sp->maximumVelocity; - qScrollerDebug() << "Overshoot: viewsize" << viewSize; - qScrollerDebug() << "Overshoot: factor" << sp->overshootScrollDistanceFactor; - - qreal oDistance = viewSize * sp->overshootScrollDistanceFactor * endV / sp->maximumVelocity; + pushSegment(ScrollTypeFlick, deltaTime, stopProgress, startPos, endPos, stopPos, sp->scrollingCurve.type(), orientation); + } else { qreal oDeltaTime = sp->overshootScrollTime; + qreal oStopProgress = qMin(stopProgress + oDeltaTime * 0.3 / deltaTime, qreal(1)); + qreal oDistance = startPos + deltaPos * sp->scrollingCurve.valueForProgress(oStopProgress) - stopPos; + qreal oMaxDistance = qSign(oDistance) * (viewSize * sp->overshootScrollDistanceFactor); - pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.3, stopPos, stopPos + oDistance, sp->scrollingCurve.type(), orientation); - pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.7, stopPos + oDistance, stopPos, sp->scrollingCurve.type(), orientation); + qScrollerDebug() << "1 oDistance:" << oDistance << "Max:" << oMaxDistance << "stopP/oStopP" << stopProgress << oStopProgress; + + if (qAbs(oDistance) > qAbs(oMaxDistance)) { + oStopProgress = progressForValue(sp->scrollingCurve, qAbs((stopPos + oMaxDistance - startPos) / deltaPos)); + oDistance = oMaxDistance; + qScrollerDebug() << "2 oDistance:" << oDistance << "Max:" << oMaxDistance << "stopP/oStopP" << stopProgress << oStopProgress; + } + + pushSegment(ScrollTypeFlick, deltaTime, oStopProgress, startPos, deltaPos, stopPos + oDistance, sp->scrollingCurve.type(), orientation); + pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.7, 1.0, stopPos + oDistance, -oDistance, stopPos, sp->scrollingCurve.type(), orientation); } return; } - pushSegment(ScrollTypeFlick, deltaTime, startPos, endPos, sp->scrollingCurve.type(), orientation); + pushSegment(ScrollTypeFlick, deltaTime, 1.0, startPos, deltaPos, endPos, sp->scrollingCurve.type(), orientation); } @@ -1810,13 +1820,18 @@ qreal QScrollerPrivate::nextSegmentPosition(QQueue<ScrollSegment> &segments, qin while (!segments.isEmpty()) { const ScrollSegment s = segments.head(); - if ((s.startTime + s.deltaTime) <= now) { + if ((s.startTime + s.deltaTime * s.stopProgress) <= now) { segments.dequeue(); - pos = s.startPos + s.deltaPos; + pos = s.stopPos; } else if (s.startTime <= now) { - qreal progress = qreal(now - s.startTime) / (qreal(s.deltaTime) / s.maxProgress); - pos = s.startPos + s.deltaPos * s.curve.valueForProgress(progress) / s.curve.valueForProgress(s.maxProgress); - break; + qreal progress = qreal(now - s.startTime) / qreal(s.deltaTime); + pos = s.startPos + s.deltaPos * s.curve.valueForProgress(progress); + if (s.deltaPos > 0 ? pos > s.stopPos : pos < s.stopPos) { + segments.dequeue(); + pos = s.stopPos; + } else { + break; + } } else { break; } diff --git a/src/gui/util/qscroller_p.h b/src/gui/util/qscroller_p.h index 98f34f7..d16eef9 100644 --- a/src/gui/util/qscroller_p.h +++ b/src/gui/util/qscroller_p.h @@ -98,7 +98,8 @@ public: qreal startPos; qreal deltaPos; QEasingCurve curve; - qreal maxProgress; + qreal stopProgress; // whatever is.. + qreal stopPos; // ..reached first ScrollType type; }; @@ -122,7 +123,7 @@ public: void setDpiFromWidget(QWidget *widget); void updateVelocity(const QPointF &deltaPixelRaw, qint64 deltaTime); - void pushSegment(ScrollType type, qreal deltaTime, qreal startPos, qreal endPos, QEasingCurve::Type curve, Qt::Orientation orientation, qreal maxProgress = 1.0); + void pushSegment(ScrollType type, qreal deltaTime, qreal stopProgress, qreal startPos, qreal deltaPos, qreal stopPos, QEasingCurve::Type curve, Qt::Orientation orientation); void recalcScrollingSegments(bool forceRecalc = false); qreal scrollingSegmentsEndPos(Qt::Orientation orientation) const; bool scrollingSegmentsValid(Qt::Orientation orientation); -- cgit v0.12 From 1137379e98cab8cc67fac70b31c97001c4473eb0 Mon Sep 17 00:00:00 2001 From: Peter Hartmann <peter.hartmann@nokia.com> Date: Mon, 24 Jan 2011 14:21:18 +0100 Subject: HTTP: fix digest authentication no need to extract the realm from the user; with digest authentication the realm is an attribute of its own. Reviewed-by: Markus Goetz Task-number: QTBUG-15070 --- src/network/kernel/qauthenticator.cpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index 73143e1..d61d3b7 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -213,24 +213,6 @@ void QAuthenticator::setUser(const QString &user) int separatorPosn = 0; switch(d->method) { - case QAuthenticatorPrivate::DigestMd5: - if((separatorPosn = user.indexOf(QLatin1String("\\"))) != -1) { - //domain name is present - d->userDomain.clear(); - d->realm = user.left(separatorPosn); - d->user = user.mid(separatorPosn + 1); - } else if((separatorPosn = user.indexOf(QLatin1String("@"))) != -1) { - //domain name is present - d->userDomain.clear(); - d->realm = user.mid(separatorPosn + 1); - d->user = user.left(separatorPosn); - } else { - d->user = user; - d->realm.clear(); - d->userDomain.clear(); - } - break; - case QAuthenticatorPrivate::Ntlm: if((separatorPosn = user.indexOf(QLatin1String("\\"))) != -1) { //domain name is present @@ -253,6 +235,7 @@ void QAuthenticator::setUser(const QString &user) break; default: d->user = user; + d->userDomain.clear(); break; } } -- cgit v0.12 From f1262bdf81251d488c6fe8c1a00325a81654844e Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Mon, 24 Jan 2011 15:44:48 +0100 Subject: Cocoa: add scroll optimization when scrolling both hor and ver --- src/gui/kernel/qcocoaview_mac.mm | 6 ++++ src/gui/kernel/qt_cocoa_helpers_mac.mm | 6 ++++ src/gui/kernel/qt_cocoa_helpers_mac_p.h | 54 +++++++++++++++++++++++++++++++++ src/gui/kernel/qwidget_mac.mm | 4 +++ 4 files changed, 70 insertions(+) diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 18a2be1..1b81699 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -579,6 +579,10 @@ static int qCocoaViewCount = 0; } #ifndef QT_NO_WHEELEVENT + // ### Qt 5: Send one QWheelEvent with dx, dy and dz + + QMacScrollOptimization::initNewScroll(); + if (deltaX != 0) { QWheelEvent qwe(qlocal, qglobal, deltaX, buttons, keyMods, Qt::Horizontal); qt_sendSpontaneousEvent(widgetToGetMouse, &qwe); @@ -595,6 +599,8 @@ static int qCocoaViewCount = 0; QWheelEvent qwe(qlocal, qglobal, deltaZ, buttons, keyMods, (Qt::Orientation)3); qt_sendSpontaneousEvent(widgetToGetMouse, &qwe); } + + QMacScrollOptimization::performDelayedScroll(); #endif //QT_NO_WHEELEVENT } diff --git a/src/gui/kernel/qt_cocoa_helpers_mac.mm b/src/gui/kernel/qt_cocoa_helpers_mac.mm index 35b9d52..ddbf53f 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac.mm +++ b/src/gui/kernel/qt_cocoa_helpers_mac.mm @@ -1724,6 +1724,12 @@ void qt_mac_post_retranslateAppMenu() #endif } +QWidgetPrivate *QMacScrollOptimization::_target = 0; +bool QMacScrollOptimization::_inWheelEvent = false; +int QMacScrollOptimization::_dx = 0; +int QMacScrollOptimization::_dy = 0; +QRect QMacScrollOptimization::_scrollRect = QRect(0, 0, -1, -1); + #ifdef QT_MAC_USE_COCOA // This method implements the magic for the drawRectSpecial method. // We draw a line at the upper edge of the content view in order to diff --git a/src/gui/kernel/qt_cocoa_helpers_mac_p.h b/src/gui/kernel/qt_cocoa_helpers_mac_p.h index c30fdc0..eab8a86 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac_p.h +++ b/src/gui/kernel/qt_cocoa_helpers_mac_p.h @@ -103,6 +103,7 @@ #include <qtimer.h> #include <qtooltip.h> #include <private/qeffects_p.h> +#include <private/qwidget_p.h> #include <qtextdocument.h> #include <qdebug.h> #include <qpoint.h> @@ -245,6 +246,59 @@ void qt_cocoaPostMessageAfterEventLoopExit(id target, SEL selector, int argCount #endif +class QMacScrollOptimization { + // This class is made optimize for the case when the user + // scrolls both horizontally and vertically at the same + // time. This will result in two QWheelEvents (one for each + // direction), which will typically result in two calls to + // QWidget::_scroll_sys. Rather than copying pixels twize on + // screen because of this, we add this helper class to try to + // get away with only one blit. + static QWidgetPrivate *_target; + static bool _inWheelEvent; + static int _dx; + static int _dy; + static QRect _scrollRect; + +public: + static void initNewScroll() + { + _inWheelEvent = true; + } + + static bool delayScroll(QWidgetPrivate *target, int dx, int dy, const QRect &scrollRect) + { + if (!_inWheelEvent) + return false; + if (_target && _target != target) + return false; + if (_scrollRect.width() != -1 && _scrollRect != scrollRect) + return false; + + _target = target; + _dx += dx; + _dy += dy; + _scrollRect = scrollRect; + return true; + } + + static void performDelayedScroll() + { + if (!_inWheelEvent) + return; + if (!_target) + return; + + _inWheelEvent = false; + _target->scroll_sys(_dx, _dy, _scrollRect); + + _target = 0; + _dx = 0; + _dy = 0; + _scrollRect = QRect(0, 0, -1, -1); + } +}; + void qt_mac_post_retranslateAppMenu(); void qt_mac_display(QWidget *widget); diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 03f496e..f3fbaa7 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4654,6 +4654,10 @@ void QWidgetPrivate::scroll_sys(int dx, int dy) void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) { Q_Q(QWidget); + + if (QMacScrollOptimization::delayScroll(this, dx, dy, qscrollRect)) + return; + if (QApplicationPrivate::graphicsSystem() && !paintOnScreen()) { // INVARIANT: Alien paint engine scrollRect(qscrollRect, dx, dy); -- cgit v0.12 From 81941e4c5dcd18ef04b2b22dd3f1b4c04620647c Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Mon, 24 Jan 2011 15:32:11 +0100 Subject: Fix crash in QtScript/JSC stack allocator on Symbian The reserved (virtual) size of the chunk is not necessarily a multiple of the "pool" size (the physical growth increment). The reserved size is only rounded up to a multiple of the page size (4K), not the pool size (64K). This meant that the commit of the _last_ part of the chunk could (and did) fail, because we tried to commit 64K while only a size <64K was remaining. Detect this case and reduce the requested size accordingly. Also add a call to CRASH() in case Commit() returns an error, to avoid obscure crashes in JSC at a later point (grow() must not fail). Task-number: QTBUG-16685 Reviewed-by: Simon Hausmann --- .../JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp index da5cc99..e89dd7a 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp @@ -83,10 +83,16 @@ void RegisterFileAllocator::grow(void* newEnd) TInt nBytes = (TInt)(newEnd) - (TInt)(m_comEnd); nBytes = SYMBIAN_ROUNDUPTOMULTIPLE(nBytes, m_poolSize); TInt offset = (TInt)m_comEnd - (TInt)m_buffer; + // The reserved size is not guaranteed to be a multiple of the pool size. + TInt maxBytes = (TInt)m_resEnd - (TInt)m_comEnd; + if (nBytes > maxBytes) + nBytes = maxBytes; TInt ret = m_chunk.Commit(offset, nBytes); if (ret == KErrNone) m_comEnd = (void*)(m_chunk.Base() + m_chunk.Size()); + else + CRASH(); } } -- cgit v0.12 From 64ec011c6132496eb9555c1d09e7fd4ddf472837 Mon Sep 17 00:00:00 2001 From: Robert Griebl <robert.griebl@nokia.com> Date: Mon, 24 Jan 2011 18:39:25 +0100 Subject: Use qreal everywhere to avoid double/float errors on embedded platforms. Reviewed-by: Ralf Engels --- src/gui/util/qscroller.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp index 7173270..815b3d1 100644 --- a/src/gui/util/qscroller.cpp +++ b/src/gui/util/qscroller.cpp @@ -1236,8 +1236,8 @@ void QScrollerPrivate::createScrollToSegments(qreal v, qreal deltaTime, qreal en : contentPosition.y() + overshootPosition.y(); qreal deltaPos = (endPos - startPos) / 2; - pushSegment(type, deltaTime * 0.3, 1.0, startPos, deltaPos, startPos + deltaPos, QEasingCurve::InQuad, orientation); - pushSegment(type, deltaTime * 0.7, 1.0, startPos + deltaPos, deltaPos, endPos, sp->scrollingCurve.type(), orientation); + pushSegment(type, deltaTime * qreal(0.3), qreal(1.0), startPos, deltaPos, startPos + deltaPos, QEasingCurve::InQuad, orientation); + pushSegment(type, deltaTime * qreal(0.7), qreal(1.0), startPos + deltaPos, deltaPos, endPos, sp->scrollingCurve.type(), orientation); } /*! \internal @@ -1312,7 +1312,7 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp qreal stopPos = endPos < minPos ? minPos : maxPos; qreal oDeltaTime = sp->overshootScrollTime; - pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.7, 1.0, startPos, stopPos - startPos, stopPos, sp->scrollingCurve.type(), orientation); + pushSegment(ScrollTypeOvershoot, oDeltaTime * qreal(0.7), qreal(1.0), startPos, stopPos - startPos, stopPos, sp->scrollingCurve.type(), orientation); return; } @@ -1341,9 +1341,9 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp endPos = higherSnapPos; deltaPos = endPos - startPos; - qreal midPos = startPos + deltaPos * 0.3; - pushSegment(ScrollTypeFlick, sp->snapTime * 0.3, 1.0, startPos, midPos - startPos, midPos, QEasingCurve::InQuad, orientation); - pushSegment(ScrollTypeFlick, sp->snapTime * 0.7, 1.0, midPos, endPos - midPos, endPos, sp->scrollingCurve.type(), orientation); + qreal midPos = startPos + deltaPos * qreal(0.3); + pushSegment(ScrollTypeFlick, sp->snapTime * qreal(0.3), qreal(1.0), startPos, midPos - startPos, midPos, QEasingCurve::InQuad, orientation); + pushSegment(ScrollTypeFlick, sp->snapTime * qreal(0.7), qreal(1.0), midPos, endPos - midPos, endPos, sp->scrollingCurve.type(), orientation); return; } @@ -1378,7 +1378,7 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp pushSegment(ScrollTypeFlick, deltaTime, stopProgress, startPos, endPos, stopPos, sp->scrollingCurve.type(), orientation); } else { qreal oDeltaTime = sp->overshootScrollTime; - qreal oStopProgress = qMin(stopProgress + oDeltaTime * 0.3 / deltaTime, qreal(1)); + qreal oStopProgress = qMin(stopProgress + oDeltaTime * qreal(0.3) / deltaTime, qreal(1)); qreal oDistance = startPos + deltaPos * sp->scrollingCurve.valueForProgress(oStopProgress) - stopPos; qreal oMaxDistance = qSign(oDistance) * (viewSize * sp->overshootScrollDistanceFactor); @@ -1391,12 +1391,12 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp } pushSegment(ScrollTypeFlick, deltaTime, oStopProgress, startPos, deltaPos, stopPos + oDistance, sp->scrollingCurve.type(), orientation); - pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.7, 1.0, stopPos + oDistance, -oDistance, stopPos, sp->scrollingCurve.type(), orientation); + pushSegment(ScrollTypeOvershoot, oDeltaTime * qreal(0.7), qreal(1.0), stopPos + oDistance, -oDistance, stopPos, sp->scrollingCurve.type(), orientation); } return; } - pushSegment(ScrollTypeFlick, deltaTime, 1.0, startPos, deltaPos, endPos, sp->scrollingCurve.type(), orientation); + pushSegment(ScrollTypeFlick, deltaTime, qreal(1.0), startPos, deltaPos, endPos, sp->scrollingCurve.type(), orientation); } -- cgit v0.12 From 81492e56aba5b5761500543665012a85d6835513 Mon Sep 17 00:00:00 2001 From: Robert Griebl <robert.griebl@nokia.com> Date: Mon, 24 Jan 2011 18:46:40 +0100 Subject: Various small fixes for the QScroller examples Reviewed-By: TrustMe --- examples/scroller/graphicsview/main.cpp | 12 ++++++++---- examples/scroller/plot/main.cpp | 9 ++++----- examples/scroller/plot/plot.pro | 5 ----- examples/scroller/plot/plotwidget.cpp | 2 +- examples/scroller/plot/plotwidget.h | 2 +- examples/scroller/plot/settingswidget.cpp | 2 +- examples/scroller/plot/settingswidget.h | 2 +- examples/scroller/wheel/main.cpp | 16 ++++++++++------ examples/scroller/wheel/wheel.pro | 5 ----- examples/scroller/wheel/wheelwidget.cpp | 2 +- examples/scroller/wheel/wheelwidget.h | 2 +- 11 files changed, 28 insertions(+), 31 deletions(-) diff --git a/examples/scroller/graphicsview/main.cpp b/examples/scroller/graphicsview/main.cpp index e28978f..77d00f0 100644 --- a/examples/scroller/graphicsview/main.cpp +++ b/examples/scroller/graphicsview/main.cpp @@ -279,14 +279,18 @@ protected: int main(int argc, char *argv[]) { - QApplication app(argc, argv); - bool useTouch = (app.arguments().contains(QLatin1String("--touch"))); - MainWindow mw(useTouch); + QApplication a(argc, argv); + bool touch = (a.arguments().contains(QLatin1String("--touch"))); + MainWindow mw(touch); +#ifdef Q_WS_S60 + mw.showMaximized(); +#else mw.show(); +#endif #ifdef Q_WS_MAC mw.raise(); #endif - return app.exec(); + return a.exec(); } #include "main.moc" diff --git a/examples/scroller/plot/main.cpp b/examples/scroller/plot/main.cpp index acf83ee..6166505 100644 --- a/examples/scroller/plot/main.cpp +++ b/examples/scroller/plot/main.cpp @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage @@ -208,15 +208,14 @@ int main(int argc, char **argv) if (a.arguments().contains(QLatin1String("--touch"))) touch = true; - MainWindow *mw = new MainWindow(smallscreen, touch); + MainWindow mw(smallscreen, touch); if (smallscreen) - mw->showMaximized(); + mw.showMaximized(); else - mw->show(); + mw.show(); #if defined(Q_WS_MAC) mw->raise(); #endif - return a.exec(); } diff --git a/examples/scroller/plot/plot.pro b/examples/scroller/plot/plot.pro index 8c37b04..04fdf70 100644 --- a/examples/scroller/plot/plot.pro +++ b/examples/scroller/plot/plot.pro @@ -11,8 +11,3 @@ target.path = $$[QT_INSTALL_EXAMPLES]/scroller/plot sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS plot.pro sources.path = $$[QT_INSTALL_EXAMPLES]/scroller/plot INSTALLS += target sources - -symbian { - TARGET.UID3 = 0xA000CF66 - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) -} diff --git a/examples/scroller/plot/plotwidget.cpp b/examples/scroller/plot/plotwidget.cpp index 5f0df67..a03f613 100644 --- a/examples/scroller/plot/plotwidget.cpp +++ b/examples/scroller/plot/plotwidget.cpp @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/examples/scroller/plot/plotwidget.h b/examples/scroller/plot/plotwidget.h index 4987ebc..c96ceac 100644 --- a/examples/scroller/plot/plotwidget.h +++ b/examples/scroller/plot/plotwidget.h @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/examples/scroller/plot/settingswidget.cpp b/examples/scroller/plot/settingswidget.cpp index 840e3fc..1929eb6 100644 --- a/examples/scroller/plot/settingswidget.cpp +++ b/examples/scroller/plot/settingswidget.cpp @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/examples/scroller/plot/settingswidget.h b/examples/scroller/plot/settingswidget.h index 0ea201d..13edbf4 100644 --- a/examples/scroller/plot/settingswidget.h +++ b/examples/scroller/plot/settingswidget.h @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/examples/scroller/wheel/main.cpp b/examples/scroller/wheel/main.cpp index 4264377..203c930 100644 --- a/examples/scroller/wheel/main.cpp +++ b/examples/scroller/wheel/main.cpp @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage @@ -107,12 +107,16 @@ private: int main(int argc, char **argv) { QApplication a(argc, argv); - bool touch = a.arguments().contains(QLatin1String("--touch")); - - MainWindow *mw = new MainWindow(touch); - mw->show(); - + MainWindow mw(touch); +#ifdef Q_WS_S60 + mw.showMaximized(); +#else + mw.show(); +#endif +#ifdef Q_WS_MAC + mw.raise(); +#endif return a.exec(); } diff --git a/examples/scroller/wheel/wheel.pro b/examples/scroller/wheel/wheel.pro index 1f9b789..48fe171 100644 --- a/examples/scroller/wheel/wheel.pro +++ b/examples/scroller/wheel/wheel.pro @@ -9,8 +9,3 @@ target.path = $$[QT_INSTALL_EXAMPLES]/scroller/wheel sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS wheel.pro sources.path = $$[QT_INSTALL_EXAMPLES]/scroller/wheel INSTALLS += target sources - -symbian { - TARGET.UID3 = 0xA000CF66 - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) -} diff --git a/examples/scroller/wheel/wheelwidget.cpp b/examples/scroller/wheel/wheelwidget.cpp index 64a459b..0449f53 100644 --- a/examples/scroller/wheel/wheelwidget.cpp +++ b/examples/scroller/wheel/wheelwidget.cpp @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/examples/scroller/wheel/wheelwidget.h b/examples/scroller/wheel/wheelwidget.h index c50f951..8f49169 100644 --- a/examples/scroller/wheel/wheelwidget.h +++ b/examples/scroller/wheel/wheelwidget.h @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage -- cgit v0.12 From 7e46280c0552e1368f21ecf6019147261acb2dc3 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Mon, 24 Jan 2011 21:09:19 +0100 Subject: Cocoa: fix scroll optimization bug The optimization commited a few commits before this one faulty stopped normal dispatching of enter/leave. This patch fixes this. --- src/gui/kernel/qapplication.cpp | 2 ++ src/gui/kernel/qt_cocoa_helpers_mac_p.h | 2 +- src/gui/kernel/qwidget_mac.mm | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index af4a258..e91fe04 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -4430,6 +4430,7 @@ bool QApplication::notify(QObject *receiver, QEvent *e) if (w->testAttribute(Qt::WA_AcceptTouchEvents)) qt_widget_private(w)->registerTouchWindow(true); } + res = d->notify_helper(receiver, e); break; case QEvent::Leave: if (receiver->isWidgetType()) { @@ -4437,6 +4438,7 @@ bool QApplication::notify(QObject *receiver, QEvent *e) if (w->testAttribute(Qt::WA_AcceptTouchEvents)) qt_widget_private(w)->registerTouchWindow(false); } + res = d->notify_helper(receiver, e); break; #endif default: diff --git a/src/gui/kernel/qt_cocoa_helpers_mac_p.h b/src/gui/kernel/qt_cocoa_helpers_mac_p.h index eab8a86..9e09fd3 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac_p.h +++ b/src/gui/kernel/qt_cocoa_helpers_mac_p.h @@ -286,10 +286,10 @@ public: { if (!_inWheelEvent) return; + _inWheelEvent = false; if (!_target) return; - _inWheelEvent = false; _target->scroll_sys(_dx, _dy, _scrollRect); _target = 0; diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index f3fbaa7..1a1bb6e 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4653,11 +4653,10 @@ void QWidgetPrivate::scroll_sys(int dx, int dy) void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &qscrollRect) { - Q_Q(QWidget); - if (QMacScrollOptimization::delayScroll(this, dx, dy, qscrollRect)) return; + Q_Q(QWidget); if (QApplicationPrivate::graphicsSystem() && !paintOnScreen()) { // INVARIANT: Alien paint engine scrollRect(qscrollRect, dx, dy); -- cgit v0.12 From 0f6de139dc4cebb1f47d129279810178db16ff4a Mon Sep 17 00:00:00 2001 From: Pavel Fric <pavelfric@seznam.cz> Date: Mon, 24 Jan 2011 21:11:46 +0100 Subject: Update of Czech translation for Qt 4.7-stable Merge-request: 2553 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- translations/assistant_cs.ts | 1077 ++++-- translations/designer_cs.ts | 1472 +------- translations/linguist_cs.ts | 1396 +++++--- translations/qt_cs.ts | 7942 +++++++++++++++++++++--------------------- translations/qt_help_cs.ts | 166 +- 5 files changed, 5988 insertions(+), 6065 deletions(-) mode change 100644 => 100755 translations/assistant_cs.ts mode change 100644 => 100755 translations/designer_cs.ts mode change 100644 => 100755 translations/linguist_cs.ts mode change 100644 => 100755 translations/qt_cs.ts mode change 100644 => 100755 translations/qt_help_cs.ts diff --git a/translations/assistant_cs.ts b/translations/assistant_cs.ts old mode 100644 new mode 100755 index 2156187..9b9e486 --- a/translations/assistant_cs.ts +++ b/translations/assistant_cs.ts @@ -4,7 +4,6 @@ <context> <name>AboutDialog</name> <message> - <location filename="../tools/assistant/tools/assistant/aboutdialog.cpp" line="+110"/> <source>&Close</source> <translation>&Zavřít</translation> </message> @@ -12,427 +11,886 @@ <context> <name>AboutLabel</name> <message> - <location line="-14"/> <source>Warning</source> <translation>Varování</translation> </message> <message> - <location line="+1"/> <source>Unable to launch external application. </source> <translation>Chyba při spouštění vnější aplikace. </translation> </message> <message> - <location line="+1"/> <source>OK</source> <translation>OK</translation> </message> </context> <context> + <name>Assistant</name> + <message> + <source>Error registering documentation file '%1': %2</source> + <translation>Chyba při záznamu souboru s dokumentací '%1': %2</translation> + </message> + <message> + <source>Error: %1</source> + <translation>Chyba: %1</translation> + </message> + <message> + <source>Could not register documentation file +%1 + +Reason: +%2</source> + <translation>Soubor s dokumentací %1 nelze zaznamenat + +Důvod: +%2</translation> + </message> + <message> + <source>Documentation successfully registered.</source> + <translation>Dokumentace byla úspěšně zaznamenána.</translation> + </message> + <message> + <source>Could not unregister documentation file +%1 + +Reason: +%2</source> + <translation>Zaznamenání souboru s dokumentací %1 nelze zrušit + +Grund: +%2</translation> + </message> + <message> + <source>Documentation successfully unregistered.</source> + <translation>Dokumentace byla úspěšně odstraněna.</translation> + </message> + <message> + <source>Error reading collection file '%1': %2.</source> + <translation>Chyba při čtení sbírkového souboru '%1': %2.</translation> + </message> + <message> + <source>Error creating collection file '%1': %2.</source> + <translation>Chyba při vytváření sbírkového souboru '%1': %2.</translation> + </message> + <message> + <source>Cannot load sqlite database driver!</source> + <translation>Databázový ovladač pro SQLite nelze nahrát!</translation> + </message> +</context> +<context> <name>BookmarkDialog</name> <message> - <location filename="../tools/assistant/tools/assistant/bookmarkdialog.ui"/> <source>Add Bookmark</source> <translation>Přidat záložku</translation> </message> <message> - <location/> <source>Bookmark:</source> <translation>Záložka:</translation> </message> <message> - <location/> <source>Add in Folder:</source> <translation>Zřídit ve složce:</translation> </message> <message> - <location/> <source>New Folder</source> <translation>Nová složka</translation> </message> <message> - <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="+184"/> - <location line="+18"/> - <location line="+39"/> - <location line="+18"/> - <location line="+30"/> <source>Bookmarks</source> - <translation>Záložky</translation> + <translation type="obsolete">Záložky</translation> </message> <message> - <location filename="../tools/assistant/tools/assistant/bookmarkdialog.ui"/> <source>+</source> <translation>+</translation> </message> <message> - <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="-61"/> <source>Delete Folder</source> - <translation>Smazat složku</translation> + <translation type="obsolete">Smazat složku</translation> </message> <message> - <location line="+1"/> <source>Rename Folder</source> <translation>Přejmenovat složku</translation> </message> </context> <context> + <name>BookmarkItem</name> + <message> + <source>New Folder</source> + <translation>Nová složka</translation> + </message> + <message> + <source>Untitled</source> + <translation>Bez názvu</translation> + </message> +</context> +<context> <name>BookmarkManager</name> <message> - <location line="+434"/> <source>Bookmarks</source> - <translation>Záložky</translation> + <translation type="obsolete">Záložky</translation> + </message> + <message> + <source>Untitled</source> + <translation>Bez názvu</translation> </message> <message> - <location line="+37"/> <source>Remove</source> <translation>Odstranit</translation> </message> <message> - <location line="+1"/> <source>You are going to delete a Folder, this will also<br>remove it's content. Are you sure to continue?</source> <translation>Když smažete tuto složku, bude smazán i <br>celý její obsah. Opravdu chcete pokračovat?</translation> </message> <message> - <location line="+143"/> - <location line="+9"/> + <source>Manage Bookmarks...</source> + <translation>Spravovat záložky...</translation> + </message> + <message> + <source>Add Bookmark...</source> + <translation>Přidat záložku...</translation> + </message> + <message> + <source>Ctrl+D</source> + <translation>Ctrl+D</translation> + </message> + <message> + <source>Delete Folder</source> + <translation>Smazat složku</translation> + </message> + <message> + <source>Rename Folder</source> + <translation>Přejmenovat složku</translation> + </message> + <message> + <source>Show Bookmark</source> + <translation>Ukázat záložku</translation> + </message> + <message> + <source>Show Bookmark in New Tab</source> + <translation>Ukázat záložku v nové kartě</translation> + </message> + <message> + <source>Delete Bookmark</source> + <translation>Smazat záložku</translation> + </message> + <message> + <source>Rename Bookmark</source> + <translation>Přejmenovat záložku</translation> + </message> + <message> <source>New Folder</source> - <translation>Nová složka</translation> + <translation type="obsolete">Nová složka</translation> </message> </context> <context> - <name>BookmarkWidget</name> + <name>BookmarkManagerWidget</name> <message> - <location line="-416"/> - <source>Filter:</source> - <translation>Filtr:</translation> + <source>Manage Bookmarks</source> + <translation>Spravovat záložky</translation> + </message> + <message> + <source>Search:</source> + <translation>Hledat:</translation> </message> <message> - <location line="+33"/> <source>Remove</source> <translation>Odstranit</translation> </message> <message> - <location line="-79"/> + <source>Import and Backup</source> + <translation>Zavést a zazálohovat</translation> + </message> + <message> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <source>Import...</source> + <translation>Zavést...</translation> + </message> + <message> + <source>Export...</source> + <translation>Vyvést...</translation> + </message> + <message> + <source>Open File</source> + <translation>Otevřít soubor</translation> + </message> + <message> + <source>Files (*.xbel)</source> + <translation>Soubory XBEL (*.xbel)</translation> + </message> + <message> + <source>Save File</source> + <translation>Uložit soubor</translation> + </message> + <message> + <source>Qt Assistant</source> + <translation>Qt Assistant</translation> + </message> + <message> + <source>Unable to save bookmarks.</source> + <translation>Nelze uložit záložky.</translation> + </message> + <message> + <source>You are goingto delete a Folder, this will also<br> remove it's content. Are you sure to continue?</source> + <translation>Chystáte se smazat složku, což <br> odstraní i její obsah. Jste si jistý, že chcete pokračovat?</translation> + </message> + <message> <source>Delete Folder</source> <translation>Smazat složku</translation> </message> <message> - <location line="+1"/> <source>Rename Folder</source> <translation>Přejmenovat složku</translation> </message> <message> - <location line="+2"/> <source>Show Bookmark</source> <translation>Ukázat záložku</translation> </message> <message> - <location line="+1"/> <source>Show Bookmark in New Tab</source> <translation>Ukázat záložku v nové kartě</translation> </message> <message> - <location line="+3"/> <source>Delete Bookmark</source> <translation>Smazat záložku</translation> </message> <message> - <location line="+1"/> <source>Rename Bookmark</source> <translation>Přejmenovat záložku</translation> </message> +</context> +<context> + <name>BookmarkModel</name> + <message> + <source>Name</source> + <translation>Název</translation> + </message> + <message> + <source>Address</source> + <translation>Adresa</translation> + </message> + <message> + <source>Bookmarks Menu</source> + <translation>Nabídka se záložkami</translation> + </message> +</context> +<context> + <name>BookmarkWidget</name> + <message> + <source>Filter:</source> + <translation>Filtr:</translation> + </message> + <message> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <source>Delete Folder</source> + <translation type="obsolete">Smazat složku</translation> + </message> + <message> + <source>Rename Folder</source> + <translation type="obsolete">Přejmenovat složku</translation> + </message> + <message> + <source>Show Bookmark</source> + <translation type="obsolete">Ukázat záložku</translation> + </message> + <message> + <source>Show Bookmark in New Tab</source> + <translation type="obsolete">Ukázat záložku v nové kartě</translation> + </message> + <message> + <source>Delete Bookmark</source> + <translation type="obsolete">Smazat záložku</translation> + </message> + <message> + <source>Rename Bookmark</source> + <translation type="obsolete">Přejmenovat záložku</translation> + </message> <message> - <location line="+62"/> <source>Add</source> <translation>Přidat</translation> </message> + <message> + <source>Bookmarks</source> + <translation>Záložky</translation> + </message> </context> <context> <name>CentralWidget</name> <message> - <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="+238"/> <source>Add new page</source> <translation>Přidat novou stranu</translation> </message> <message> - <location line="+9"/> <source>Close current page</source> <translation>Zavřít současnou stranu</translation> </message> <message> - <location line="+312"/> <source>Print Document</source> <translation>Vytisknout dokument</translation> </message> <message> - <location line="+148"/> - <location line="+2"/> <source>unknown</source> <translation>Neznámý</translation> </message> <message> - <location line="+93"/> <source>Add New Page</source> <translation>Přidat novou stranu</translation> </message> <message> - <location line="+3"/> <source>Close This Page</source> <translation>Zavřít tuto stranu</translation> </message> <message> - <location line="+3"/> <source>Close Other Pages</source> <translation>Zavřít jiné strany</translation> </message> <message> - <location line="+5"/> <source>Add Bookmark for this Page...</source> <translation>Přidat záložku pro tuto stranu...</translation> </message> <message> - <location line="+255"/> <source>Search</source> <translation>Hledat</translation> </message> </context> <context> + <name>CmdLineParser</name> + <message> + <source>Usage: assistant [Options] + +-collectionFile file Uses the specified collection + file instead of the default one +-showUrl url Shows the document with the + url. +-enableRemoteControl Enables Assistant to be + remotely controlled. +-show widget Shows the specified dockwidget + which can be "contents", "index", + "bookmarks" or "search". +-activate widget Activates the specified dockwidget + which can be "contents", "index", + "bookmarks" or "search". +-hide widget Hides the specified dockwidget + which can be "contents", "index" + "bookmarks" or "search". +-register helpFile Registers the specified help file + (.qch) in the given collection + file. +-unregister helpFile Unregisters the specified help file + (.qch) from the give collection + file. +-setCurrentFilter filter Set the filter as the active filter. +-remove-search-index Removes the full text search index. +-rebuild-search-index Re-builds the full text search index (potentially slow). +-quiet Does not display any error or + status message. +-help Displays this help. +</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown option: %1</source> + <translation>Neznámá volba: %1</translation> + </message> + <message> + <source>The collection file '%1' does not exist.</source> + <translation>Sbírkový soubor '%1' neexistuje.</translation> + </message> + <message> + <source>Missing collection file.</source> + <translation>Chybí sbírkový soubor.</translation> + </message> + <message> + <source>Invalid URL '%1'.</source> + <translation>Neplatná adresa (URL) '%1'.</translation> + </message> + <message> + <source>Missing URL.</source> + <translation>Chybí adresa (URL).</translation> + </message> + <message> + <source>Unknown widget: %1</source> + <translation>Neznámý prvek: %1</translation> + </message> + <message> + <source>Missing widget.</source> + <translation>Chybí prvek.</translation> + </message> + <message> + <source>The Qt help file '%1' does not exist.</source> + <translation>Soubor s nápovědou ke Qt '%1' nelze najít.</translation> + </message> + <message> + <source>Missing help file.</source> + <translation>Chybí soubor s nápovědou.</translation> + </message> + <message> + <source>Missing filter argument.</source> + <translation>Chybí argument pro filtr.</translation> + </message> + <message> + <source>Error</source> + <translation>Chyba</translation> + </message> + <message> + <source>Notice</source> + <translation>Zpráva</translation> + </message> +</context> +<context> <name>ContentWindow</name> <message> - <location filename="../tools/assistant/tools/assistant/contentwindow.cpp" line="+158"/> <source>Open Link</source> <translation>Otevřít adresu odkazu</translation> </message> <message> - <location line="+1"/> <source>Open Link in New Tab</source> <translation>Otevřít odkaz v nové kartě</translation> </message> </context> <context> + <name>ConversionWizard</name> + <message> + <source>Help Conversion Wizard</source> + <translation>Průvodce pro převod nápovědy</translation> + </message> + <message> + <source>Converting %1...</source> + <translation>Převádí se %1...</translation> + </message> + <message> + <source>Writing help collection file...</source> + <translation>Zapisuje se soubor se sbírkou s nápovědou...</translation> + </message> + <message> + <source>Done.</source> + <translation>Hotovo.</translation> + </message> +</context> +<context> + <name>FilesPage</name> + <message> + <source>Form</source> + <translation>Formulář</translation> + </message> + <message> + <source>Files:</source> + <translation>Soubory:</translation> + </message> + <message> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <source>Remove All</source> + <translation>Odstranit vše</translation> + </message> + <message> + <source>Unreferenced Files</source> + <translation>Neodkazované soubory</translation> + </message> + <message> + <source>Remove files which are neither referenced by a keyword nor by the TOC.</source> + <translation>Odstranit soubory, které nejsou odkazovány ani klíčovým slovem ani obsahem (TOC).</translation> + </message> + <message> + <source><p><b>Warning:</b> When removing images or stylesheets, be aware that those files are not directly referenced by the .adp or .dcf file.</p></source> + <translation><p><b>Varování:</b> Když odstraňujete obrázky nebo stylové listy, buďte si vědom, že tyto soubory nejsou přímo odkazovány souborem .adp nebo .dcf.</p></translation> + </message> +</context> +<context> <name>FilterNameDialogClass</name> <message> - <location filename="../tools/assistant/tools/assistant/filternamedialog.ui"/> <source>Add Filter Name</source> <translation>Přidat název filtru</translation> </message> <message> - <location/> <source>Filter Name:</source> <translation>Název filtru:</translation> </message> </context> <context> + <name>FilterPage</name> + <message> + <source>Form</source> + <translation>Formulář</translation> + </message> + <message> + <source>Filter attributes for current documentation (comma separated list):</source> + <translation>Vlastnosti filtru pro nynější dokumentaci (čárkou oddělený seznam):</translation> + </message> + <message> + <source>Custom Filters</source> + <translation>Uživatelsky stanovené filtry</translation> + </message> + <message> + <source>1</source> + <translation>1</translation> + </message> + <message> + <source>2</source> + <translation>2</translation> + </message> + <message> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <source>Filter Settings</source> + <translation>Nastavení filtru</translation> + </message> + <message> + <source>Specify the filter attributes for the documentation. If filter attributes are used, also define a custom filter for it. Both the filter attributes and the custom filters are optional.</source> + <translation>Zadejte vlastnosti filtru pro dokumentaci. Pokud jsou používány vlastnosti filtru, měl by se pro ně stanovit i uživatelsky stanovený filtr. Jak vlastnosti filtru tak uživatelsky stanovené filtry jsou volitelné.</translation> + </message> + <message> + <source>Filter Name</source> + <translation>Název filtru</translation> + </message> + <message> + <source>Filter Attributes</source> + <translation>Vlastnosti filtru</translation> + </message> + <message> + <source>The custom filter '%1' is defined multiple times.</source> + <translation>Uživatelsky stanovený filtr '%1' je stanoven vícekrát.</translation> + </message> + <message> + <source>The attributes for custom filter '%1' are defined multiple times.</source> + <translation>Vlastnosti pro uživatelsky stanovený filtr '%1' jsou vymezeny vícekrát.</translation> + </message> + <message> + <source>unfiltered</source> + <comment>list of available documentation</comment> + <translation>Nefiltrováno</translation> + </message> +</context> +<context> <name>FindWidget</name> <message> - <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="-955"/> <source>Previous</source> <translation>Předchozí</translation> </message> <message> - <location line="+4"/> <source>Next</source> <translation>Další</translation> </message> <message> - <location line="+4"/> <source>Case Sensitive</source> <translation>Rozlišující velká a malá písmena</translation> </message> <message> - <location line="+3"/> <source>Whole words</source> - <translation>Celá slova</translation> + <translation type="obsolete">Celá slova</translation> </message> <message> - <location line="+12"/> <source><img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped</source> <translation><img src=":/trolltech/assistant/images/wrap.png">&nbsp;Konec strany</translation> </message> </context> <context> + <name>FinishPage</name> + <message> + <source>Converting File</source> + <translation>Převádí se soubor</translation> + </message> + <message> + <source>Creating the new Qt help files from the old ADP file.</source> + <translation>Vytváří se nové soubory s nápovědou Qt ze starých souborů ADP.</translation> + </message> +</context> +<context> <name>FontPanel</name> <message> - <location filename="../tools/shared/fontpanel/fontpanel.cpp" line="+63"/> <source>Font</source> <translation>Písmo</translation> </message> <message> - <location line="+11"/> <source>&Writing system</source> <translation>Způsob &psaní</translation> </message> <message> - <location line="+3"/> <source>&Family</source> <translation>&Písmová rodina</translation> </message> <message> - <location line="+4"/> <source>&Style</source> <translation>&Styl</translation> </message> <message> - <location line="+4"/> <source>&Point size</source> <translation>&Bodová velikost</translation> </message> </context> <context> + <name>GeneralPage</name> + <message> + <source>Form</source> + <translation>Formulář</translation> + </message> + <message> + <source>Namespace:</source> + <translation>Jmenný prostor:</translation> + </message> + <message> + <source>Virtual Folder:</source> + <translation>Virtuální složka:</translation> + </message> + <message> + <source>General Settings</source> + <translation>Obecná nastavení</translation> + </message> + <message> + <source>Specify the namespace and the virtual folder for the documentation.</source> + <translation>Zadejte jmenný prostor a virtuální složku pro dokumentaci.</translation> + </message> + <message> + <source>Namespace Error</source> + <translation>Chyba ve jmenném prostoru</translation> + </message> + <message> + <source>The namespace contains some invalid characters.</source> + <translation>Jmenný prostor obsahuje nějaké neplatné znaky.</translation> + </message> + <message> + <source>Virtual Folder Error</source> + <translation>Chyba ve virtuální složce</translation> + </message> + <message> + <source>The virtual folder contains some invalid characters.</source> + <translation>Virtuální složka obsahuje nějaké neplatné znaky.</translation> + </message> +</context> +<context> + <name>HelpEngineWrapper</name> + <message> + <source>Unfiltered</source> + <translation>Nefiltrováno</translation> + </message> +</context> +<context> + <name>HelpGenerator</name> + <message> + <source>Warning: %1</source> + <translation>Varování: %1</translation> + </message> +</context> +<context> <name>HelpViewer</name> <message> - <location filename="../tools/assistant/tools/assistant/helpviewer.cpp" line="+492"/> <source>Help</source> - <translation>Nápověda</translation> + <translation type="obsolete">Nápověda</translation> </message> <message> - <location line="+1"/> <source>OK</source> - <translation>OK</translation> + <translation type="obsolete">OK</translation> + </message> + <message> + <source><title>about:blank</title></source> + <translation><title>about:blank</title></translation> </message> <message> - <location line="-62"/> <source><title>Error 404...</title><div align="center"><br><br><h1>The page could not be found</h1><br><h3>'%1'</h3></div></source> <translation><title>Chyba 404 ...</title><div align="center"><br><br><h1>Stranu se nepodařilo najít.</h1><br><h3>'%1'</h3></div></translation> </message> <message> - <location line="+125"/> <source>Copy &Link Location</source> <translation>&Kopírovat adresu odkazu</translation> </message> <message> - <location line="+3"/> <source>Open Link in New Tab Ctrl+LMB</source> <translation>Otevřít odkaz v nové kartě Ctrl+LMB</translation> </message> <message> - <location line="-275"/> <source>Open Link in New Tab</source> <translation>Otevřít odkaz v nové kartě</translation> </message> <message> - <location line="+209"/> <source>Unable to launch external application. </source> - <translation>Chyba při spouštění vnější aplikace. + <translation type="obsolete">Chyba při spouštění vnější aplikace. </translation> </message> </context> <context> + <name>HelpWindow</name> + <message> + <source><center><b>Wizard Assistant</b></center></source> + <translation><center><b>Průvodce</b></center></translation> + </message> +</context> +<context> + <name>IdentifierPage</name> + <message> + <source>Form</source> + <translation>Formulář</translation> + </message> + <message> + <source>Create identifiers</source> + <translation>Vytvořit identifikátory</translation> + </message> + <message> + <source>Global prefix:</source> + <translation>Celková předpona:</translation> + </message> + <message> + <source>Inherit prefix from file names</source> + <translation>Předponu vzít z názvů souborů</translation> + </message> + <message> + <source>Identifiers</source> + <translation>Identifikátory</translation> + </message> + <message> + <source>This page allows you to create identifiers from the keywords found in the .adp or .dcf file.</source> + <translation>Tato stránka vám umožňuje vytvořit identifikátory z klíčových slov nalezených v souboru .adp nebo .dcf.</translation> + </message> +</context> +<context> <name>IndexWindow</name> <message> - <location filename="../tools/assistant/tools/assistant/indexwindow.cpp" line="+66"/> <source>&Look for:</source> <translation>&Hledat:</translation> </message> <message> - <location line="+68"/> <source>Open Link</source> <translation>Otevřít adresu odkazu</translation> </message> <message> - <location line="+1"/> <source>Open Link in New Tab</source> <translation>Otevřít odkaz v nové kartě</translation> </message> </context> <context> + <name>InputPage</name> + <message> + <source>Form</source> + <translation>Formulář</translation> + </message> + <message> + <source>File name:</source> + <translation>Název souboru:</translation> + </message> + <message> + <source>...</source> + <translation>...</translation> + </message> + <message> + <source>Input File</source> + <translation>Vstupní soubor</translation> + </message> + <message> + <source>Specify the .adp or .dcf file you want to convert to the new Qt help project format and/or collection format.</source> + <translation>Zadejte soubor .adp nebo .dcf, který chcete převést do nového formátu projektů nápovědy Qt a/nebo formátu sbírky.</translation> + </message> + <message> + <source>Open file</source> + <translation>Otevřít soubor</translation> + </message> + <message> + <source>Qt Help Files (*.adp *.dcf)</source> + <translation>Soubory s nápovědou (*.adp *.dcf)</translation> + </message> + <message> + <source>File Open Error</source> + <translation>Chyba při otevírání souboru</translation> + </message> + <message> + <source>The specified file could not be opened!</source> + <translation>Zadaný soubor nelze otevřít!</translation> + </message> + <message> + <source>File Parsing Error</source> + <translation>Chyba při zpracování souboru</translation> + </message> + <message> + <source>Parsing error in line %1!</source> + <translation>Chyba při zpracování na řádku %1!</translation> + </message> +</context> +<context> <name>InstallDialog</name> <message> - <location filename="../tools/assistant/tools/assistant/installdialog.ui"/> - <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+76"/> <source>Install Documentation</source> <translation>Nainstalovat dokumentaci</translation> </message> <message> - <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+30"/> <source>Downloading documentation info...</source> <translation>Stahuje se informace o dokumentaci...</translation> </message> <message> - <location line="+48"/> <source>Download canceled.</source> <translation>Stahování bylo zrušeno.</translation> </message> <message> - <location line="+26"/> - <location line="+78"/> - <location line="+27"/> <source>Done.</source> <translation>Hotovo.</translation> </message> <message> - <location line="-90"/> <source>The file %1 already exists. Do you want to overwrite it?</source> <translation>Soubor %1 již existuje. Chcete jej přepsat?</translation> </message> <message> - <location line="+11"/> <source>Unable to save the file %1: %2.</source> <translation>Soubor %1 nelze uložit: %2.</translation> </message> <message> - <location line="+8"/> <source>Downloading %1...</source> <translation>Stahuje se %1...</translation> </message> <message> - <location line="+19"/> - <location line="+42"/> - <location line="+38"/> <source>Download failed: %1.</source> <translation>Stažení se nezdařilo: %1.</translation> </message> <message> - <location line="-70"/> <source>Documentation info file is corrupt!</source> <translation>Soubor s informací o dokumentaci je poškozen!</translation> </message> <message> - <location line="+37"/> <source>Download failed: Downloaded file is corrupted.</source> <translation>Stažení se nezdařilo: Stažený soubor je pravděpodobně poškozen.</translation> </message> <message> - <location line="+2"/> <source>Installing documentation %1...</source> <translation>Instaluje dokumentace %1...</translation> </message> <message> - <location line="+22"/> <source>Error while installing documentation: %1</source> <translation>Chyba při instalaci dokumentace: %1</translation> </message> <message> - <location filename="../tools/assistant/tools/assistant/installdialog.ui"/> <source>Available Documentation:</source> <translation>Dostupná dokumentace:</translation> </message> <message> - <location/> <source>Install</source> <translation>Instalovat</translation> </message> <message> - <location/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location/> <source>Close</source> <translation>Zavřít</translation> </message> <message> - <location/> <source>Installation Path:</source> <translation>Cesta pro instalaci:</translation> </message> <message> - <location/> <source>...</source> <translation>...</translation> </message> @@ -440,342 +898,375 @@ <context> <name>MainWindow</name> <message> - <location filename="../tools/assistant/tools/assistant/mainwindow.cpp" line="+110"/> - <location line="+391"/> <source>Index</source> <translation>Rejstřík</translation> </message> <message> - <location line="-385"/> - <location line="+383"/> <source>Contents</source> <translation>Obsah</translation> </message> <message> - <location line="-378"/> - <location line="+382"/> <source>Bookmarks</source> <translation>Záložky</translation> </message> <message> - <location line="+2"/> <source>Search</source> <translation>Hledat</translation> </message> <message> - <location line="-372"/> - <location line="+215"/> - <location line="+512"/> <source>Qt Assistant</source> <translation>Qt Assistant</translation> </message> <message> - <location line="-544"/> - <location line="+5"/> <source>Unfiltered</source> - <translation>Bez filtru</translation> + <translation type="obsolete">Bez filtru</translation> </message> <message> - <location line="+107"/> <source>Page Set&up...</source> <translation>&Nastavení strany...</translation> </message> <message> - <location line="+2"/> <source>Print Preview...</source> <translation>Náhled tisku...</translation> </message> <message> - <location line="+3"/> <source>&Print...</source> <translation>&Tisk...</translation> </message> <message> - <location line="+7"/> <source>New &Tab</source> <translation>Nová &karta</translation> </message> <message> - <location line="+3"/> <source>&Close Tab</source> <translation>&Zavřít kartu</translation> </message> <message> - <location line="+4"/> <source>&Quit</source> <translation>&Ukončit</translation> </message> <message> - <location line="+5"/> + <source>CTRL+Q</source> + <translation>Ctrl+Q</translation> + </message> + <message> <source>&Copy selected Text</source> <translation>&Kopírovat vybraný text</translation> </message> <message> - <location line="+8"/> <source>&Find in Text...</source> <translation>&Najít v textu...</translation> </message> <message> - <location line="+6"/> + <source>&Find</source> + <translation>&Najít</translation> + </message> + <message> <source>Find &Next</source> <translation>Hledat &dál</translation> </message> <message> - <location line="+4"/> <source>Find &Previous</source> <translation>Najít &předchozí</translation> </message> <message> - <location line="+5"/> <source>Preferences...</source> <translation>Nastavení...</translation> </message> <message> - <location line="+4"/> <source>Zoom &in</source> <translation>&Zvětšit</translation> </message> <message> - <location line="+6"/> <source>Zoom &out</source> <translation>&Zmenšit</translation> </message> <message> - <location line="+6"/> <source>Normal &Size</source> <translation>Obvyklá &velikost</translation> </message> <message> - <location line="+4"/> <source>Ctrl+0</source> <translation>Ctrl+0</translation> </message> <message> - <location line="+5"/> <source>ALT+C</source> <translation>ALT+C</translation> </message> <message> - <location line="+2"/> <source>ALT+I</source> <translation>ALT+I</translation> </message> <message> - <location line="+4"/> <source>ALT+S</source> <translation>ALT+S</translation> </message> <message> - <location line="+3"/> <source>&Home</source> <translation>&Začáteční strana</translation> </message> <message> - <location line="+4"/> <source>&Back</source> <translation>&Zpět</translation> </message> <message> - <location line="+5"/> <source>&Forward</source> <translation>&Dopředu</translation> </message> <message> - <location line="+6"/> <source>Sync with Table of Contents</source> <translation>Seřídit stranu s kartou obsahu</translation> </message> <message> - <location line="+7"/> + <source>Sync</source> + <translation>Seřídit</translation> + </message> + <message> <source>Next Page</source> <translation>Další strana</translation> </message> <message> - <location line="+1"/> <source>Ctrl+Alt+Right</source> <translation>Ctrl+Alt+Right</translation> </message> <message> - <location line="+3"/> <source>Previous Page</source> <translation>Předchozí strana</translation> </message> <message> - <location line="+1"/> <source>Ctrl+Alt+Left</source> <translation>Ctrl+Alt+Left</translation> </message> <message> - <location line="+4"/> + <source>Could not register file '%1': %2</source> + <translation>Nepodařilo se zaznamenat soubor '%1': %2</translation> + </message> + <message> <source>Add Bookmark...</source> - <translation>Přidat záložku...</translation> + <translation type="obsolete">Přidat záložku...</translation> </message> <message> - <location line="+5"/> <source>About...</source> <translation>O...</translation> </message> <message> - <location line="+16"/> <source>Navigation Toolbar</source> <translation>Navigační pruh</translation> </message> <message> - <location line="+76"/> <source>Toolbars</source> <translation>Nástrojové pruhy</translation> </message> <message> - <location line="+15"/> <source>Filter Toolbar</source> <translation>Filtrovací pruh</translation> </message> <message> - <location line="+2"/> <source>Filtered by:</source> <translation>Filtr:</translation> </message> <message> - <location line="+23"/> <source>Address Toolbar</source> <translation>Adresní pruh</translation> </message> <message> - <location line="+4"/> <source>Address:</source> <translation>Adresa:</translation> </message> <message> - <location line="+114"/> <source>Could not find the associated content item.</source> <translation>Nepodařilo se najít příslušnou položku obsahu.</translation> </message> <message> - <location line="+71"/> + <source><center><h3>%1</h3><p>Version %2</p></center><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p></source> + <translation><center><h3>%1</h3><p>Verze %2</p></center><p>Autorské právo (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</p></translation> + </message> + <message> <source>About %1</source> <translation>O %1</translation> </message> <message> - <location line="+114"/> <source>Updating search index</source> <translation>Sestavuje se rejstřík hledání</translation> </message> <message> - <location line="-638"/> <source>Looking for Qt Documentation...</source> <translation>Hledá se dokumentace ke Qt...</translation> </message> <message> - <location line="+241"/> <source>&Window</source> <translation>&Okno</translation> </message> <message> - <location line="+3"/> <source>Minimize</source> <translation>Zmenšit</translation> </message> <message> - <location line="+1"/> <source>Ctrl+M</source> <translation>Ctrl+M</translation> </message> <message> - <location line="-2"/> <source>Zoom</source> <translation>Zvětšení</translation> </message> <message> - <location line="-159"/> <source>&File</source> <translation>&Soubor</translation> </message> <message> - <location line="+25"/> <source>&Edit</source> <translation>&Úpravy</translation> </message> <message> - <location line="+27"/> <source>&View</source> <translation>&Pohled</translation> </message> <message> - <location line="+30"/> <source>&Go</source> <translation>&Jít na</translation> </message> <message> - <location line="+2"/> <source>ALT+Home</source> <translation>ALT+Home</translation> </message> <message> - <location line="+29"/> <source>&Bookmarks</source> <translation>&Záložky</translation> </message> <message> - <location line="+5"/> <source>&Help</source> <translation>&Nápověda</translation> </message> <message> - <location line="-40"/> <source>ALT+O</source> <translation>ALT+O</translation> </message> <message> - <location line="+38"/> <source>CTRL+D</source> - <translation>CTRL+D</translation> + <translation type="obsolete">CTRL+D</translation> + </message> +</context> +<context> + <name>OutputPage</name> + <message> + <source>Form</source> + <translation>Formulář</translation> + </message> + <message> + <source>Project file name:</source> + <translation>Název projektového souboru:</translation> + </message> + <message> + <source>Collection file name:</source> + <translation>Název sbírkového souboru:</translation> + </message> + <message> + <source>Output File Names</source> + <translation>Názvy výstupních souborů</translation> + </message> + <message> + <source>Specify the file names for the output files.</source> + <translation>Zadejte názvy souborů pro výstupní soubory.</translation> + </message> + <message> + <source>Convert...</source> + <translation>Převést...</translation> + </message> + <message> + <source>Qt Help Project File</source> + <translation>Projektový soubor s nápovědou Qt</translation> + </message> + <message> + <source>Qt Help Collection Project File</source> + <translation>Projektový sbírkový soubor s nápovědou Qt</translation> + </message> + <message> + <source>The specified file %1 already exist. + +Do you want to remove it?</source> + <translation>Zadaný soubor %1 již existuje. + +Chcete jej odstranit?</translation> + </message> + <message> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <source>Cancel</source> + <translation>Zrušit</translation> + </message> +</context> +<context> + <name>PathPage</name> + <message> + <source>Form</source> + <translation>Formulář</translation> + </message> + <message> + <source>File filters:</source> + <translation>Souborové filtry:</translation> + </message> + <message> + <source>Documentation source file paths:</source> + <translation>Cesty ke zdrojovým souborům s dokumentací:</translation> + </message> + <message> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <source>Source File Paths</source> + <translation>Cesty ke zdrojovým souborům</translation> + </message> + <message> + <source>Specify the paths where the sources files are located. By default, all files in those directories matched by the file filter will be included.</source> + <translation>Zadejte cesty k místům, v nichž jsou uloženy zdrojové soubory. Ve výchozím nastavení budou zahrnuty všechny soubory v těchto adresářích odpovídající podle souborového filtru.</translation> + </message> + <message> + <source>Source File Path</source> + <translation>Cesta ke zdrojovému souboru</translation> </message> </context> <context> <name>PreferencesDialog</name> <message> - <location filename="../tools/assistant/tools/assistant/preferencesdialog.cpp" line="+259"/> - <location line="+43"/> <source>Add Documentation</source> <translation>Přidat dokumentaci</translation> </message> <message> - <location line="-43"/> <source>Qt Compressed Help Files (*.qch)</source> - <translation>Stlačené soubory s nápovědoun (*.qch)</translation> + <translation>Stlačené soubory s nápovědou (*.qch)</translation> </message> <message> - <location line="+37"/> <source>The specified file is not a valid Qt Help File!</source> <translation>Zadaný soubor není platným souborem nápovědy ke Qt.</translation> </message> <message> - <location line="-8"/> <source>The namespace %1 is already registered!</source> <translation>Jmenný prostor %1 je již zaznamenám!</translation> </message> <message> - <location line="+31"/> <source>Remove Documentation</source> <translation>Odstranit dokumentaci</translation> </message> <message> - <location line="+1"/> <source>Some documents currently opened in Assistant reference the documentation you are attempting to remove. Removing the documentation will close those documents.</source> <translation>Některé v současnosti otevřené dokumenty pocházejí z dokumentace, kterou se právě pokoušíte odstranit. Při odstraňování budou zavřeny.</translation> </message> <message> - <location line="+2"/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location line="+1"/> <source>OK</source> <translation>OK</translation> </message> <message> - <location line="+88"/> <source>Use custom settings</source> <translation>Použít nastavení stanovená uživatelem</translation> </message> @@ -783,239 +1274,334 @@ <context> <name>PreferencesDialogClass</name> <message> - <location filename="../tools/assistant/tools/assistant/preferencesdialog.ui"/> <source>Preferences</source> <translation>Nastavení</translation> </message> <message> - <location/> <source>Fonts</source> <translation>Písma</translation> </message> <message> - <location/> <source>Font settings:</source> <translation>Nastavení písem:</translation> </message> <message> - <location/> <source>Browser</source> <translation>Prohlížeč</translation> </message> <message> - <location/> <source>Application</source> <translation>Program</translation> </message> <message> - <location/> <source>Filters</source> <translation>Filtr</translation> </message> <message> - <location/> <source>Filter:</source> <translation>Filtr:</translation> </message> <message> - <location/> <source>Attributes:</source> <translation>Vlastnosti:</translation> </message> <message> - <location/> <source>1</source> <translation>1</translation> </message> <message> - <location/> <source>Add</source> <translation>Přidat</translation> </message> <message> - <location/> <source>Remove</source> <translation>Odstranit</translation> </message> <message> - <location/> <source>Documentation</source> <translation>Dokumentace</translation> </message> <message> - <location/> <source>Registered Documentation:</source> <translation>Zaznamenaná dokumentace:</translation> </message> <message> - <location/> <source>Add...</source> <translation>Přidat...</translation> </message> <message> - <location/> <source>Options</source> <translation>Volby</translation> </message> <message> - <location/> <source>Current Page</source> <translation>Nynější strana</translation> </message> <message> - <location/> <source>Restore to default</source> <translation>Obnovit výchozí nastavení</translation> </message> <message> - <location/> <source>Homepage</source> <translation>Začáteční stránka</translation> </message> <message> - <location/> <source>On help start:</source> <translation>Na začátek nápovědy:</translation> </message> <message> - <location/> <source>Show my home page</source> <translation>Ukázat moji domovskou stránku</translation> </message> <message> - <location/> <source>Show a blank page</source> <translation>Ukázat prázdnou stránku</translation> </message> <message> - <location/> <source>Show my tabs from last session</source> <translation>Ukázat mé karty z posledního sezení</translation> </message> <message> - <location/> <source>Blank Page</source> <translation>Prázdná strana</translation> </message> </context> <context> + <name>QCollectionGenerator</name> + <message> + <source>Unknown token at line %1.</source> + <translation>Neznámé klíčové slovo na řádku %1.</translation> + </message> + <message> + <source>Unknown token at line %1. Expected "QtHelpCollectionProject".</source> + <translation>Neznámé klíčové slovo na řádku %1. Očekáván "QtHelpCollectionProject".</translation> + </message> + <message> + <source>Missing end tags.</source> + <translation>Chybí zavírající prvky.</translation> + </message> + <message> + <source>Missing input or output file for help file generation.</source> + <translation>Chybí některé pro vytvoření souboru s nápovědou potřebné vstupní nebo výstupní soubory.</translation> + </message> + <message> + <source>Missing output file name.</source> + <translation>Nebyl zadán žádný název pro výstupní soubor.</translation> + </message> + <message> + <source>Qt Collection Generator version 1.0 (Qt %1) +</source> + <translation>Qt Collection Generator verze 1.0 (Qt %1) +</translation> + </message> + <message> + <source>Missing collection config file.</source> + <translation>Soubor s nastavením potřebný pro sbírku chybí.</translation> + </message> + <message> + <source> +Usage: + +qcollectiongenerator <collection-config-file> [options] + + -o <collection-file> Generates a collection file + called <collection-file>. If + this option is not specified + a default name will be used. + -v Displays the version of + qcollectiongenerator. + +</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Could not open %1. +</source> + <translation>Nepodařilo se otevřít %1. +</translation> + </message> + <message> + <source>Reading collection config file... +</source> + <translation>Čte se soubor s nastavením pro sbírku... +</translation> + </message> + <message> + <source>Collection config file error: %1 +</source> + <translation>Chyba v souboru s nastavením pro sbírku: %1 +</translation> + </message> + <message> + <source>Generating help for %1... +</source> + <translation>Vytváří se nápověda pro %1... +</translation> + </message> + <message> + <source>Creating collection file... +</source> + <translation>Vytváří se sbírkový soubor... +</translation> + </message> + <message> + <source>The file %1 cannot be overwritten. +</source> + <translation>Soubor %1 nelze přepsat. +</translation> + </message> + <message> + <source>Cannot open %1. +</source> + <translation>Nelze otevřít %1. +</translation> + </message> + <message> + <source>Cannot open referenced image file %1. +</source> + <translation>Nelze otevřít odkazovaný obrázkový soubor %1. +</translation> + </message> +</context> +<context> + <name>QHelpGenerator</name> + <message> + <source>Missing output file name.</source> + <translation>Nebyl zadán žádný název pro výstupní soubor.</translation> + </message> + <message> + <source>Qt Help Generator version 1.0 (Qt %1) +</source> + <translation>Qt Collection Generator verze 1.0 (Qt %1) +</translation> + </message> + <message> + <source>Missing Qt help project file.</source> + <translation>Chybí projektový soubor s nápovědou Qt.</translation> + </message> + <message> + <source> +Usage: + +qhelpgenerator <help-project-file> [options] + + -o <compressed-file> Generates a Qt compressed help + file called <compressed-file>. + If this option is not specified + a default name will be used. + -c Checks whether all links in HTML files + point to files in this help project. + -v Displays the version of + qhelpgenerator. + +</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Could not open %1. +</source> + <translation>Nepodařilo se otevřít %1. +</translation> + </message> + <message> + <source>Could not create output directory: %1 +</source> + <translation>Nepodařilo se vytvořit výstupní adresář: %1 +</translation> + </message> +</context> +<context> <name>QObject</name> <message> - <location filename="../tools/assistant/tools/assistant/cmdlineparser.cpp" line="+112"/> <source>The specified collection file does not exist!</source> - <translation>Zadaný sbírkový soubor nelze najít!</translation> + <translation type="obsolete">Zadaný sbírkový soubor nelze najít!</translation> </message> <message> - <location line="+4"/> <source>Missing collection file!</source> - <translation>Chybějící sbírkový soubor!</translation> + <translation type="obsolete">Chybějící sbírkový soubor!</translation> </message> <message> - <location line="+9"/> <source>Invalid URL!</source> - <translation>Neplatné URL!</translation> + <translation type="obsolete">Neplatné URL!</translation> </message> <message> - <location line="+4"/> <source>Missing URL!</source> - <translation>Chybějící URL!</translation> + <translation type="obsolete">Chybějící URL!</translation> </message> <message> - <location line="+17"/> - <location line="+19"/> - <location line="+19"/> <source>Unknown widget: %1</source> - <translation>Neznámý prvek: %1</translation> + <translation type="obsolete">Neznámý prvek: %1</translation> </message> <message> - <location line="-34"/> - <location line="+19"/> - <location line="+19"/> <source>Missing widget!</source> - <translation>Chybějící prvek!</translation> + <translation type="obsolete">Chybějící prvek!</translation> </message> <message> - <location line="+7"/> - <location line="+12"/> <source>The specified Qt help file does not exist!</source> - <translation>Zadaný soubor s nápovědou ke Qt nelze najít!</translation> + <translation type="obsolete">Zadaný soubor s nápovědou ke Qt nelze najít!</translation> </message> <message> - <location line="-7"/> - <location line="+12"/> <source>Missing help file!</source> - <translation>Chybějící soubor s nápovědou!</translation> + <translation type="obsolete">Chybějící soubor s nápovědou!</translation> </message> <message> - <location line="+7"/> <source>Missing filter argument!</source> - <translation>Chybějící argument pro filtr!</translation> + <translation type="obsolete">Chybějící argument pro filtr!</translation> </message> <message> - <location line="+12"/> <source>Unknown option: %1</source> - <translation>Neznámá volba: %1</translation> + <translation type="obsolete">Neznámá volba: %1</translation> </message> <message> - <location line="+30"/> - <location line="+2"/> <source>Qt Assistant</source> - <translation>Qt Assistant</translation> + <translation type="obsolete">Qt Assistant</translation> </message> <message> - <location filename="../tools/assistant/tools/assistant/main.cpp" line="+217"/> <source>Could not register documentation file %1 Reason: %2</source> - <translation>Soubor s dokumentací %1 nelze zaznamenat + <translation type="obsolete">Soubor s dokumentací %1 nelze zaznamenat Důvod: %2</translation> </message> <message> - <location line="+4"/> <source>Documentation successfully registered.</source> - <translation>Dokumentace byla úspěšně zaznamenána.</translation> + <translation type="obsolete">Dokumentace byla úspěšně zaznamenána.</translation> </message> <message> - <location line="+11"/> <source>Could not unregister documentation file %1 Reason: %2</source> - <translation>Zaznamenání souboru s dokumentací %1 nelze zrušit + <translation type="obsolete">Zaznamenání souboru s dokumentací %1 nelze zrušit Grund: %2</translation> </message> <message> - <location line="-3"/> <source>Documentation successfully unregistered.</source> - <translation>Dokumentace byla úspěšně odstraněna.</translation> + <translation type="obsolete">Dokumentace byla úspěšně odstraněna.</translation> </message> <message> - <location line="+40"/> <source>Cannot load sqlite database driver!</source> - <translation>Databázový ovladač pro SQLite nelze nahrát!</translation> + <translation type="obsolete">Databázový ovladač pro SQLite nelze nahrát!</translation> </message> <message> - <location line="+9"/> <source>The specified collection file could not be read!</source> - <translation>Zadaný sbírkový soubor nelze přečíst!</translation> + <translation type="obsolete">Zadaný sbírkový soubor nelze přečíst!</translation> </message> </context> <context> <name>RemoteControl</name> <message> - <location filename="../tools/assistant/tools/assistant/remotecontrol.cpp" line="+163"/> <source>Debugging Remote Control</source> <translation>Ladí se dálkové ovládání</translation> </message> <message> - <location line="+1"/> <source>Received Command: %1 %2</source> <translation>Přijatý příkaz: %1 : %2</translation> </message> @@ -1023,22 +1609,18 @@ Grund: <context> <name>SearchWidget</name> <message> - <location filename="../tools/assistant/tools/assistant/searchwidget.cpp" line="+195"/> <source>&Copy</source> <translation>&Kopírovat</translation> </message> <message> - <location line="+4"/> <source>Copy &Link Location</source> <translation>&Kopírovat adresu odkazu</translation> </message> <message> - <location line="+4"/> <source>Open Link in New Tab</source> <translation>Otevřít odkaz v nové kartě</translation> </message> <message> - <location line="+8"/> <source>Select All</source> <translation>Vybrat vše</translation> </message> @@ -1046,27 +1628,22 @@ Grund: <context> <name>TopicChooser</name> <message> - <location filename="../tools/assistant/tools/assistant/topicchooser.cpp" line="+54"/> <source>Choose a topic for <b>%1</b>:</source> <translation>Vyberte námět pro <b>%1</b>:</translation> </message> <message> - <location filename="../tools/assistant/tools/assistant/topicchooser.ui"/> <source>Choose Topic</source> <translation>Vybrat námět</translation> </message> <message> - <location/> <source>&Topics</source> <translation>&Náměty</translation> </message> <message> - <location/> <source>&Display</source> <translation>&Zobrazit</translation> </message> <message> - <location/> <source>&Close</source> <translation>&Zavřít</translation> </message> diff --git a/translations/designer_cs.ts b/translations/designer_cs.ts old mode 100644 new mode 100755 index ea33a57..4099695 --- a/translations/designer_cs.ts +++ b/translations/designer_cs.ts @@ -4,45 +4,80 @@ <context> <name>AbstractFindWidget</name> <message> - <location filename="../tools/shared/findwidget/abstractfindwidget.cpp" line="+127"/> <source>&Previous</source> <translation>&Předchozí</translation> </message> <message> - <location line="+8"/> <source>&Next</source> <translation>&Další</translation> </message> <message> - <location line="+24"/> <source>&Case sensitive</source> <translation>&Rozlišující velká a malá písmena</translation> </message> <message> - <location line="+8"/> <source>Whole &words</source> <translation>Celá &slova</translation> </message> <message> - <location line="+12"/> <source><img src=":/trolltech/shared/images/wrap.png">&nbsp;Search wrapped</source> <translation><img src=":/trolltech/shared/images/wrap.png">&nbsp;Hledání dosáhlo konce</translation> </message> </context> <context> + <name>AbstractItemEditor</name> + <message> + <source>Selectable</source> + <translation>Vybratelné</translation> + </message> + <message> + <source>Editable</source> + <translation>Upravitelné</translation> + </message> + <message> + <source>DragEnabled</source> + <translation>TáhnutíPovoleno</translation> + </message> + <message> + <source>DropEnabled</source> + <translation>UpuštěníPovoleno</translation> + </message> + <message> + <source>UserCheckable</source> + <translation>ZaškrtnutelnéUživatelem</translation> + </message> + <message> + <source>Enabled</source> + <translation>Povoleno</translation> + </message> + <message> + <source>Tristate</source> + <translation>Tristate</translation> + </message> + <message> + <source>Unchecked</source> + <translation>Zaškrtnutí zrušeno</translation> + </message> + <message> + <source>PartiallyChecked</source> + <translation>ČástečněZaškrtnuto</translation> + </message> + <message> + <source>Checked</source> + <translation>Zaškrtnuto</translation> + </message> +</context> +<context> <name>AddLinkDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/addlinkdialog.ui"/> <source>Insert Link</source> <translation>Vložit odkaz</translation> </message> <message> - <location/> <source>Title:</source> <translation>Název:</translation> </message> <message> - <location/> <source>URL:</source> <translation>URL:</translation> </message> @@ -50,7 +85,6 @@ <context> <name>AppFontDialog</name> <message> - <location filename="../tools/designer/src/designer/appfontdialog.cpp" line="+418"/> <source>Additional Fonts</source> <translation>Dodatečná písma</translation> </message> @@ -58,37 +92,30 @@ <context> <name>AppFontManager</name> <message> - <location line="-267"/> <source>'%1' is not a file.</source> <translation>'%1' není soubor.</translation> </message> <message> - <location line="+4"/> <source>The font file '%1' does not have read permissions.</source> <translation>Soubor s písmem '%1' nemá oprávnění ke čtení.</translation> </message> <message> - <location line="+8"/> <source>The font file '%1' is already loaded.</source> <translation>Soubor s písmem '%1' je již nahrán.</translation> </message> <message> - <location line="+7"/> <source>The font file '%1' could not be loaded.</source> <translation>Soubor s písmem '%1' se nepodařilo nahrát.</translation> </message> <message> - <location line="+17"/> <source>'%1' is not a valid font id.</source> <translation>'%1' není platným písmovým ID.</translation> </message> <message> - <location line="+11"/> <source>There is no loaded font matching the id '%1'.</source> <translation>Není nahráno žádné písmo s ID '%1'.</translation> </message> <message> - <location line="+15"/> <source>The font '%1' (%2) could not be unloaded.</source> <translation>Písmo '%1' (%2) se nepodařilo uvolnit z paměti.</translation> </message> @@ -96,52 +123,42 @@ <context> <name>AppFontWidget</name> <message> - <location line="+26"/> <source>Fonts</source> <translation>Písma</translation> </message> <message> - <location line="+58"/> <source>Add font files</source> <translation>Přidat soubory s písmy</translation> </message> <message> - <location line="+5"/> <source>Remove current font file</source> <translation>Odstranit současný soubor s písmem</translation> </message> <message> - <location line="+4"/> <source>Remove all font files</source> <translation>Odstranit všechny soubory s písmy</translation> </message> <message> - <location line="+19"/> <source>Add Font Files</source> <translation>Přidat soubory s písmy</translation> </message> <message> - <location line="+1"/> <source>Font files (*.ttf)</source> <translation>Soubory s písmy (*.ttf)</translation> </message> <message> - <location line="+13"/> <source>Error Adding Fonts</source> <translation>Chyba při přidávání písem</translation> </message> <message> - <location line="+24"/> <source>Error Removing Fonts</source> <translation>Chyba při odstraňování písem</translation> </message> <message> - <location line="+22"/> <source>Remove Fonts</source> <translation>Odstranit písma</translation> </message> <message> - <location line="+0"/> <source>Would you like to remove all fonts?</source> <translation>Chcete odstranit všechna písma?</translation> </message> @@ -149,12 +166,10 @@ <context> <name>AppearanceOptionsWidget</name> <message> - <location filename="../tools/designer/src/designer/qdesigner_appearanceoptions.ui"/> <source>Form</source> <translation>Formulář</translation> </message> <message> - <location/> <source>User Interface Mode</source> <translation>Okenní režim</translation> </message> @@ -162,17 +177,14 @@ <context> <name>AssistantClient</name> <message> - <location filename="../tools/designer/src/designer/assistantclient.cpp" line="+100"/> <source>Unable to send request: Assistant is not responding.</source> <translation>Chyba při posílání požadavku: Program Assistant neodpovídá.</translation> </message> <message> - <location line="+39"/> <source>The binary '%1' does not exist.</source> <translation>Proveditelný soubor '%1' neexistuje.</translation> </message> <message> - <location line="+9"/> <source>Unable to launch assistant (%1).</source> <translation>Program Assistant nelze spustit (%1).</translation> </message> @@ -180,92 +192,74 @@ <context> <name>BrushPropertyManager</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/brushpropertymanager.cpp" line="+149"/> <source>Style</source> <translation>Styl</translation> </message> <message> - <location line="-97"/> <source>No brush</source> <translation>Žádný vzor</translation> </message> <message> - <location line="+1"/> <source>Solid</source> <translation>Plný</translation> </message> <message> - <location line="+1"/> <source>Dense 1</source> <translation>Hustota 1</translation> </message> <message> - <location line="+1"/> <source>Dense 2</source> <translation>Hustota 2</translation> </message> <message> - <location line="+1"/> <source>Dense 3</source> <translation>Hustota 3</translation> </message> <message> - <location line="+1"/> <source>Dense 4</source> <translation>Hustota 4</translation> </message> <message> - <location line="+1"/> <source>Dense 5</source> <translation>Hustota 5</translation> </message> <message> - <location line="+1"/> <source>Dense 6</source> <translation>Hustota 6</translation> </message> <message> - <location line="+1"/> <source>Dense 7</source> <translation>Hustota 7</translation> </message> <message> - <location line="+1"/> <source>Horizontal</source> <translation>Vodorovný</translation> </message> <message> - <location line="+1"/> <source>Vertical</source> <translation>Svislý</translation> </message> <message> - <location line="+1"/> <source>Cross</source> <translation>Křížící se čáry</translation> </message> <message> - <location line="+1"/> <source>Backward diagonal</source> <translation>Zpětné úhlopříčky</translation> </message> <message> - <location line="+1"/> <source>Forward diagonal</source> <translation>Vpřed směřující úhlopříčky</translation> </message> <message> - <location line="+1"/> <source>Crossing diagonal</source> <translation>Křížící se úhlopříčky</translation> </message> <message> - <location line="+94"/> <source>Color</source> <translation>Barva</translation> </message> <message> - <location line="+105"/> <source>[%1, %2]</source> <translation>[%1, %2]</translation> </message> @@ -273,360 +267,277 @@ <context> <name>Command</name> <message> - <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor.cpp" line="+208"/> - <location line="+258"/> <source>Change signal</source> <translation>Změnit signál</translation> </message> <message> - <location line="-256"/> - <location line="+268"/> <source>Change slot</source> <translation>Změnit zdířku</translation> </message> <message> - <location line="-220"/> <source>Change signal-slot connection</source> <translation>Změnit spojení signál-zdířka</translation> </message> <message> - <location line="+234"/> <source>Change sender</source> <translation>Změnit vysílač</translation> </message> <message> - <location line="+18"/> <source>Change receiver</source> <translation>Změnit přijímač</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/connectionedit.cpp" line="+143"/> <source>Add connection</source> <translation>Přidat spojení</translation> </message> <message> - <location line="+54"/> <source>Adjust connection</source> <translation>Nastavit spojení</translation> </message> <message> - <location line="+19"/> <source>Delete connections</source> <translation>Smazat spojení</translation> </message> <message> - <location line="+58"/> <source>Change source</source> <translation>Změnit zdroj</translation> </message> <message> - <location line="+2"/> <source>Change target</source> <translation>Změnit koncový bod</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_command.cpp" line="+149"/> <source>Insert '%1'</source> <translation>Vložit '%1'</translation> </message> <message> - <location line="+167"/> <source>Raise '%1'</source> <translation>'%1' dopředu</translation> </message> <message> - <location line="+33"/> <source>Lower '%1'</source> <translation>'%1' dozadu</translation> </message> <message> - <location line="+113"/> <source>Delete '%1'</source> <translation>Smazat '%1'</translation> </message> <message> - <location line="+119"/> <source>Reparent '%1'</source> <translation>Přiřadit jiný prvek '%1'</translation> </message> <message> - <location line="+53"/> <source>Promote to custom widget</source> <translation>Vytvořit zástupný symbol pro uživatelsky stanovený prvek</translation> </message> <message> - <location line="+42"/> <source>Demote from custom widget</source> <translation>Odstranit zástupný symbol pro uživatelsky stanovenou třídu</translation> </message> <message> - <location line="+79"/> <source>Lay out using grid</source> <translation>Rozmístit předměty tabulkově</translation> </message> <message> - <location line="+3"/> <source>Lay out vertically</source> <translation>Rozmístit předměty svisle</translation> </message> <message> - <location line="+3"/> <source>Lay out horizontally</source> <translation>Rozmístit předměty vodorovně</translation> </message> <message> - <location line="+41"/> <source>Break layout</source> <translation>Zrušit rozvržení</translation> </message> <message> - <location line="+240"/> - <location line="+235"/> - <location line="+78"/> <source>Move Page</source> <translation>Posunout stranu</translation> </message> <message> - <location line="-279"/> - <location line="+123"/> - <location line="+188"/> - <location line="+666"/> <source>Delete Page</source> <translation>Smazat stranu</translation> </message> <message> - <location line="-939"/> - <location line="+123"/> <source>Page</source> <translation>Strana</translation> </message> <message> - <location line="+860"/> <source>page</source> <translation>Strana</translation> </message> <message> - <location line="-978"/> - <location line="+123"/> - <location line="+186"/> - <location line="+667"/> <source>Insert Page</source> <translation>Vložit stranu</translation> </message> <message> - <location line="-647"/> <source>Change Tab order</source> <translation>Změnit pořadí karet</translation> </message> <message> - <location line="+28"/> <source>Create Menu Bar</source> <translation>Vytvořit nabídkový pruh</translation> </message> <message> - <location line="+44"/> <source>Delete Menu Bar</source> <translation>Smazat nabídkový pruh</translation> </message> <message> - <location line="+47"/> <source>Create Status Bar</source> <translation>Vytvořit stavový pruh</translation> </message> <message> - <location line="+42"/> <source>Delete Status Bar</source> <translation>Smazat stavový pruh</translation> </message> <message> - <location line="+45"/> <source>Add Tool Bar</source> <translation>Přidat nástrojový pruh</translation> </message> <message> - <location line="+59"/> <source>Add Dock Window</source> <translation>Přidat ukotvené okno</translation> </message> <message> - <location line="+53"/> <source>Adjust Size of '%1'</source> <translation>Upravit velikost '%1'</translation> </message> <message> - <location line="+57"/> <source>Change Form Layout Item Geometry</source> <translation>Změnit uspořádání prvku rozvržení formuláře</translation> </message> <message> - <location line="+95"/> <source>Change Layout Item Geometry</source> <translation>Změnit uspořádání prvku rozvržení</translation> </message> <message> - <location line="+576"/> <source>Change Table Contents</source> <translation>Změnit obsah tabulky</translation> </message> <message> - <location line="+107"/> <source>Change Tree Contents</source> <translation>Změnit obsah stromu</translation> </message> <message> - <location line="+74"/> - <location line="+146"/> <source>Add action</source> <translation>Přidat činnost</translation> </message> <message> - <location line="-120"/> - <location line="+126"/> <source>Remove action</source> <translation>Odstranit činnost</translation> </message> <message> - <location line="+53"/> <source>Add menu</source> <translation>Přidat nabídku</translation> </message> <message> - <location line="+6"/> <source>Remove menu</source> <translation>Odstranit nabídku</translation> </message> <message> - <location line="+6"/> <source>Create submenu</source> <translation>Vytvořit vedlejší nabídku</translation> </message> <message> - <location line="+31"/> <source>Delete Tool Bar</source> <translation>Smazat nástrojový pruh</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="+1195"/> <source>Set action text</source> <translation>Nastavit text k činnosti</translation> </message> <message> - <location line="+3"/> <source>Insert action</source> <translation>Vložit činnost</translation> </message> <message> - <location line="+89"/> - <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="+907"/> <source>Move action</source> <translation>Posunout činnost</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-424"/> <source>Change Title</source> <translation>Změnit název</translation> </message> <message> - <location line="+2"/> <source>Insert Menu</source> <translation>Vložit nabídku</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/signalslotdialog.cpp" line="+202"/> <source>Change signals/slots</source> <translation>Změnit signály/zdířky</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_command.cpp" line="-867"/> <source>Delete Subwindow</source> <translation>Smazat podokno</translation> </message> <message> - <location line="+44"/> <source>Insert Subwindow</source> <translation>Vložit podokno</translation> </message> <message> - <location line="+2"/> <source>subwindow</source> <translation>Podokno</translation> </message> <message> - <location line="+1"/> <source>Subwindow</source> <translation>Podokno</translation> </message> <message> - <location line="-1821"/> <source>Change Z-order of '%1'</source> <translation>Změnit Z-pořadí '%1'</translation> </message> <message> - <location line="+625"/> <source>Simplify Grid Layout</source> <translation>Zjednodušit tabulkové rozvržení</translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+221"/> <source>Create button group</source> <translation>Seskupit tlačítka</translation> </message> <message> - <location line="+27"/> <source>Break button group</source> <translation>Zrušit seskupení tlačítek</translation> </message> <message> - <location line="+9"/> <source>Break button group '%1'</source> <translation>Zrušit seskupení '%1'</translation> </message> <message> - <location line="+17"/> <source>Add buttons to group</source> <translation>Přidat tlačítka do seskupení</translation> </message> <message> - <location line="+22"/> <source>Remove buttons from group</source> <translation>Odstranit tlačítka ze seskupení</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/morphmenu.cpp" line="+349"/> <source>Morph %1/'%2' into %3</source> <extracomment>MorphWidgetCommand description</extracomment> <translation>Přeměnit %1/'%2' na %3</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_command2.cpp" line="+154"/> <source>Change layout of '%1' from %2 to %3</source> <translation>Změnit rozvržení '%1' z %2 na %3</translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="-14"/> - <location filename="../tools/designer/src/lib/shared/formlayoutmenu.cpp" line="+458"/> <source>Add '%1' to '%2'</source> <extracomment>Command description for adding buttons to a QButtonGroup</extracomment> <translation>Přidat '%1' k '%2'</translation> </message> <message> - <location line="+29"/> <source>Remove '%1' from '%2'</source> <extracomment>Command description for removing buttons from a QButtonGroup</extracomment> <translation>Odstranit '%1' z '%2'</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/scriptcommand.cpp" line="+55"/> <source>Change script</source> <translation>Změnit skript</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_propertycommand.cpp" line="+1213"/> <source>Changed '%1' of '%2'</source> <translation>Změněno '%1' z '%2'</translation> </message> <message numerus="yes"> - <location line="+3"/> <source>Changed '%1' of %n objects</source> <translatorcomment>Singular will never be shown</translatorcomment> <translation> @@ -636,12 +547,10 @@ </translation> </message> <message> - <location line="+76"/> <source>Reset '%1' of '%2'</source> <translation>Znovu nastavit '%1' '%2'</translation> </message> <message numerus="yes"> - <location line="+3"/> <source>Reset '%1' of %n objects</source> <translatorcomment>Singular will never be shown</translatorcomment> <translation> @@ -651,12 +560,10 @@ </translation> </message> <message> - <location line="+89"/> <source>Add dynamic property '%1' to '%2'</source> <translation>Přidat dynamickou vlastnost '%1' do '%2'</translation> </message> <message numerus="yes"> - <location line="+3"/> <source>Add dynamic property '%1' to %n objects</source> <translatorcomment>Singular will never be shown</translatorcomment> <translation> @@ -666,12 +573,10 @@ </translation> </message> <message> - <location line="+86"/> <source>Remove dynamic property '%1' from '%2'</source> <translation>Odstranit dynamickou vlastnost '%1' z '%2'</translation> </message> <message numerus="yes"> - <location line="+3"/> <source>Remove dynamic property '%1' from %n objects</source> <translation> <numerusform>Odstranit dynamickou vlastnost '%1' z jednoho předmětu</numerusform> @@ -683,22 +588,18 @@ <context> <name>ConnectDialog</name> <message> - <location filename="../tools/designer/src/components/signalsloteditor/connectdialog.ui"/> <source>Configure Connection</source> <translation>Upravit spojení</translation> </message> <message> - <location/> <source>GroupBox</source> <translation>GroupBox</translation> </message> <message> - <location/> <source>Edit...</source> <translation>Upravit...</translation> </message> <message> - <location/> <source>Show signals and slots inherited from QWidget</source> <translation>Ukázat signály a zdířky zděděné z QWidget</translation> </message> @@ -706,17 +607,14 @@ <context> <name>ConnectionDelegate</name> <message> - <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp" line="+643"/> <source><object></source> <translation><Předmět></translation> </message> <message> - <location line="+18"/> <source><signal></source> <translation><Signál></translation> </message> <message> - <location line="+0"/> <source><slot></source> <translation><Zdířka></translation> </message> @@ -724,19 +622,16 @@ <context> <name>DPI_Chooser</name> <message> - <location filename="../tools/designer/src/components/formeditor/dpi_chooser.cpp" line="+69"/> <source>Standard (96 x 96)</source> <extracomment>Embedded device standard screen resolution</extracomment> <translation>Obvyklé rozlišení (96 x 96)</translation> </message> <message> - <location line="+2"/> <source>Greenphone (179 x 185)</source> <extracomment>Embedded device screen resolution</extracomment> <translation>Greenphone (179 x 185)</translation> </message> <message> - <location line="+2"/> <source>High (192 x 192)</source> <extracomment>Embedded device high definition screen resolution</extracomment> <translation>Vysoké rozlišení (192 x 192)</translation> @@ -745,89 +640,72 @@ <context> <name>Designer</name> <message> - <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+449"/> <source>Qt Designer</source> <translation>Qt Designer</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_utils.cpp" line="+682"/> <source>Unable to launch %1.</source> <translation>%1 se nepodařilo spustit.</translation> </message> <message> - <location line="+4"/> <source>%1 timed out.</source> <translation>Překročení času při provedení %1.</translation> </message> <message> - <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+10"/> <source>This file contains top level spacers.<br>They have <b>NOT</b> been saved into the form.</source> <translation>Formulář obsahuje volně stojící prvky rozložení, které <b>NEBYLY</b> uloženy do formuláře.</translation> </message> <message> - <location line="+2"/> <source>Perhaps you forgot to create a layout?</source> <translation>Přidal jste rozvržení?</translation> </message> <message> - <location line="+205"/> <source>This file cannot be read because it was created using %1.</source> <translation>Soubor nelze přečíst, protože byl vytvořen %1.</translation> </message> <message> - <location line="+14"/> <source>This file was created using Designer from Qt-%1 and cannot be read.</source> <translation>Soubor nelze přečíst, protože byl vytvořen programem Designer ve verzi %1.</translation> </message> <message> - <location line="+82"/> <source>This file cannot be read because the extra info extension failed to load.</source> <translation>Soubor nelze přečíst (Chyba při nahrávání dat ExtraInfoExtension).</translation> </message> <message> - <location line="-52"/> <source>The converted file could not be read.</source> <translation>Převedený soubor se nepodařilo přečíst.</translation> </message> <message> - <location line="-76"/> <source>Invalid UI file: The root element <ui> is missing.</source> <translation>Chyba při čtení souboru s rozhraním: Kořenový prvek <ui> chybí.</translation> </message> <message> - <location line="+6"/> <source>An error has occurred while reading the UI file at line %1, column %2: %3</source> <translation>Chyba při čtení souboru s rozhraním, řádek %1, sloupec %2: %3</translation> </message> <message> - <location line="+74"/> <source>This file was created using Designer from Qt-%1 and will be converted to a new form by Qt Designer.</source> <translation>Soubor byl vytvořen programem Designer ve verzi %1 a bude převeden na nový formulář pomocí programu Qt Designer.</translation> </message> <message> - <location line="+3"/> <source>The old form has not been touched, but you will have to save the form under a new name.</source> <translation>Starý formulář zůstává nezměněn. Nový formulář musí být uložen pod novým názvem.</translation> </message> <message> - <location line="+11"/> <source>This file was created using Designer from Qt-%1 and could not be read: %2</source> <translation>Čtení Designerem %1 vytvořeného souboru se nezdařilo: %2</translation> </message> <message> - <location line="+3"/> <source>Please run it through <b>uic3&nbsp;-convert</b> to convert it to Qt-4's ui format.</source> <translation>Přeměňte to, prosím, příkazem <b>uic3&nbsp;-convert</b> na formát rozhraní Qt 4.</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qsimpleresource.cpp" line="+339"/> <source>Custom Widgets</source> <translation>Uživatelsky stanovené prvky</translation> </message> <message> - <location line="+12"/> <source>Promoted Widgets</source> <translation>Zástupný symbol pro uživatelsky stanovené prvky</translation> </message> @@ -835,12 +713,10 @@ <context> <name>DesignerMetaEnum</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_utils.cpp" line="-513"/> <source>%1 is not a valid enumeration value of '%2'.</source> <translation>%1 není platnou výčtovou hodnotou '%2'.</translation> </message> <message> - <location line="+5"/> <source>'%1' could not be converted to an enumeration value of type '%2'.</source> <translation>'%1' se nepodařilo převést na výčtovou hodnotu typu '%2'.</translation> </message> @@ -848,7 +724,6 @@ <context> <name>DesignerMetaFlags</name> <message> - <location line="+78"/> <source>'%1' could not be converted to a flag value of type '%2'.</source> <translation>'%1' se nepodařilo převést na příznakovou hodnotu typu '%2'.</translation> </message> @@ -856,13 +731,11 @@ <context> <name>DeviceProfile</name> <message> - <location filename="../tools/designer/src/lib/shared/deviceprofile.cpp" line="+397"/> <source>'%1' is not a number.</source> <extracomment>Reading a number for an embedded device profile</extracomment> <translation>'%1' není platným číslem.</translation> </message> <message> - <location line="+23"/> <source>An invalid tag <%1> was encountered.</source> <translation> Byl zjištěn neplatný prvek'%1'.</translation> </message> @@ -870,27 +743,22 @@ <context> <name>DeviceProfileDialog</name> <message> - <location filename="../tools/designer/src/components/formeditor/deviceprofiledialog.ui"/> <source>&Family</source> <translation>&Písmová rodina</translation> </message> <message> - <location/> <source>&Point Size</source> <translation>&Bodová velikost</translation> </message> <message> - <location/> <source>Style</source> <translation>Styl</translation> </message> <message> - <location/> <source>Device DPI</source> <translation>Rozlišení obrazovky</translation> </message> <message> - <location/> <source>Name</source> <translation>Název</translation> </message> @@ -898,57 +766,46 @@ <context> <name>DeviceSkin</name> <message> - <location filename="../tools/shared/deviceskin/deviceskin.cpp" line="+79"/> <source>The image file '%1' could not be loaded.</source> <translation>Soubor s obrázkem '%1' se nepodařilo nahrát.</translation> </message> <message> - <location line="+64"/> <source>The skin directory '%1' does not contain a configuration file.</source> <translation>Adresář se vzhledem '%1' neobsahuje žádný soubor s nastavením.</translation> </message> <message> - <location line="+5"/> <source>The skin configuration file '%1' could not be opened.</source> <translation>Soubor s nastavením vzhledu '%1' se nepodařilo otevřít.</translation> </message> <message> - <location line="+76"/> <source>Syntax error: %1</source> <translation>Chyba ve skladbě: %1</translation> </message> <message> - <location line="+54"/> <source>The skin cursor image file '%1' does not exist.</source> <translation>Soubor s obrázkem pro vzhled ukazovátka '%1' neexistuje.</translation> </message> <message> - <location line="+25"/> <source>Syntax error in area definition: %1</source> <translation>Vymezení oblasti obsahuje chybu ve skladbě: %1</translation> </message> <message> - <location line="+38"/> <source>Mismatch in number of areas, expected %1, got %2.</source> <translation>Zadaný počet oblastí (%1) neodpovídá; byly nalezeny %2 oblasti.</translation> </message> <message> - <location line="-187"/> <source>The skin configuration file '%1' could not be read: %2</source> <translation>Soubor s nastavením vzhledu '%1' se nepodařilo přečíst: %2</translation> </message> <message> - <location line="+91"/> <source>The skin "up" image file '%1' does not exist.</source> <translation>Soubor s nastavením vzhledu '%1' (nahoru) neexistuje.</translation> </message> <message> - <location line="+10"/> <source>The skin "down" image file '%1' does not exist.</source> <translation>Soubor s nastavením vzhledu '%1' (dolů) neexistuje.</translation> </message> <message> - <location line="+11"/> <source>The skin "closed" image file '%1' does not exist.</source> <translation>Soubor s nastavením vzhledu '%1' (zavřeno) neexistuje.</translation> </message> @@ -956,7 +813,6 @@ <context> <name>EmbeddedOptionsControl</name> <message> - <location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="+307"/> <source><html><table><tr><td><b>Font</b></td><td>%1, %2</td></tr><tr><td><b>Style</b></td><td>%3</td></tr><tr><td><b>Resolution</b></td><td>%4 x %5</td></tr></table></html></source> <extracomment>Format embedded device profile description</extracomment> <translation><html><table><tr><td><b>Font</b></td><td>%1, %2</td></tr><tr><td><b>Stil</b></td><td>%3</td></tr><tr><td><b>Rozlišení</b></td><td>%4 x %5</td></tr></table></html></translation> @@ -965,13 +821,11 @@ <context> <name>EmbeddedOptionsPage</name> <message> - <location line="+103"/> <source>Embedded Design</source> <extracomment>Tab in preferences dialog</extracomment> <translation>Vložený návrh</translation> </message> <message> - <location line="+10"/> <source>Device Profiles</source> <extracomment>EmbeddedOptionsControl group box"</extracomment> <translation>Profily zařízení</translation> @@ -980,27 +834,22 @@ <context> <name>FontPanel</name> <message> - <location filename="../tools/shared/fontpanel/fontpanel.cpp" line="+63"/> <source>Font</source> <translation>Písmo</translation> </message> <message> - <location line="+11"/> <source>&Writing system</source> <translation>Způsob &psaní</translation> </message> <message> - <location line="+3"/> <source>&Family</source> <translation>&Písmová rodina</translation> </message> <message> - <location line="+4"/> <source>&Style</source> <translation>&Styl</translation> </message> <message> - <location line="+4"/> <source>&Point size</source> <translation>&Bodová velikost</translation> </message> @@ -1008,22 +857,18 @@ <context> <name>FontPropertyManager</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/fontpropertymanager.cpp" line="+62"/> <source>PreferDefault</source> <translation>Upřednostňovat výchozí</translation> </message> <message> - <location line="+1"/> <source>NoAntialias</source> <translation>Žádné vyhlazování</translation> </message> <message> - <location line="+1"/> <source>PreferAntialias</source> <translation>Upřednostňovat vyhlazování</translation> </message> <message> - <location line="+61"/> <source>Antialiasing</source> <translation>Vyhlazování</translation> </message> @@ -1031,43 +876,45 @@ <context> <name>FormBuilder</name> <message> - <location filename="../tools/designer/src/lib/uilib/formbuilderextra.cpp" line="+359"/> <source>Invalid stretch value for '%1': '%2'</source> - <extracomment>Parsing layout stretch values</extracomment> + <extracomment>Parsing layout stretch values +---------- +Parsing layout stretch values +---------- +Parsing layout stretch values</extracomment> <translation>Neplatná hodnota roztažení pro '%1': '%2'</translation> </message> <message> - <location line="+62"/> <source>Invalid minimum size for '%1': '%2'</source> - <extracomment>Parsing grid layout minimum size values</extracomment> + <extracomment>Parsing grid layout minimum size values +---------- +Parsing grid layout minimum size values +---------- +Parsing grid layout minimum size values</extracomment> <translation>Neplatná nejmenší velikost pro '%1': '%2'</translation> </message> </context> <context> <name>FormEditorOptionsPage</name> <message> - <location filename="../tools/designer/src/components/formeditor/formeditor_optionspage.cpp" line="+91"/> <source>%1 %</source> + <extracomment>Zoom percentage</extracomment> <translation>%1 %</translation> </message> <message> - <location line="+4"/> <source>Preview Zoom</source> <translation>Velikost zvětšení pro náhled</translation> </message> <message> - <location line="+2"/> <source>Default Zoom</source> <translation>Výchozí zvětšení</translation> </message> <message> - <location line="+29"/> <source>Forms</source> <extracomment>Tab in preferences dialog</extracomment> <translation>Formuláře</translation> </message> <message> - <location line="+13"/> <source>Default Grid</source> <translation>Výchozí mřížka pro nové formuláře</translation> </message> @@ -1075,37 +922,30 @@ <context> <name>FormLayoutRowDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/formlayoutrowdialog.ui"/> <source>Add Form Layout Row</source> <translation>Přidat řádek s rozvržením formuláře</translation> </message> <message> - <location/> <source>&Label text:</source> <translation>&Text popisku:</translation> </message> <message> - <location/> <source>Field &type:</source> <translation>&Typ datového pole:</translation> </message> <message> - <location/> <source>&Field name:</source> <translation>&Název pole:</translation> </message> <message> - <location/> <source>&Buddy:</source> <translation>&Kamarád:</translation> </message> <message> - <location/> <source>&Row:</source> <translation>&Řádek:</translation> </message> <message> - <location/> <source>Label &name:</source> <translation>&Název popisku:</translation> </message> @@ -1113,12 +953,10 @@ <context> <name>FormWindow</name> <message> - <location filename="../tools/designer/src/components/formeditor/formwindow.cpp" line="+1701"/> <source>Unexpected element <%1></source> <translation>Neplatný prvek <%1></translation> </message> <message> - <location line="+7"/> <source>Error while pasting clipboard contents at line %1, column %2: %3</source> <translation>Chyba při vložení obsahu schránky, řádek %1, sloupec %2: %3</translation> </message> @@ -1126,62 +964,50 @@ <context> <name>FormWindowSettings</name> <message> - <location filename="../tools/designer/src/components/formeditor/formwindowsettings.ui"/> <source>Form Settings</source> <translation>Nastavení formuláře</translation> </message> <message> - <location/> <source>Layout &Default</source> <translation>&Výchozí rozvržení</translation> </message> <message> - <location/> <source>&Spacing:</source> <translation>&Odstup:</translation> </message> <message> - <location/> <source>&Margin:</source> <translation>&Okraj:</translation> </message> <message> - <location/> <source>&Layout Function</source> <translation>&Funkce rozvržení</translation> </message> <message> - <location/> <source>Ma&rgin:</source> <translation>Ok&raj:</translation> </message> <message> - <location/> <source>Spa&cing:</source> <translation>Odstu&p:</translation> </message> <message> - <location/> <source>Embedded Design</source> <translation>Vložený návrh</translation> </message> <message> - <location/> <source>&Author</source> <translation>&Autor</translation> </message> <message> - <location/> <source>&Include Hints</source> <translation>&Zahrnout rady</translation> </message> <message> - <location/> <source>&Pixmap Function</source> <translation>&Funkce pixmapy</translation> </message> <message> - <location/> <source>Grid</source> <translation>Mřížka</translation> </message> @@ -1189,7 +1015,6 @@ <context> <name>IconSelector</name> <message> - <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="+352"/> <source>All Pixmaps (</source> <translation>Všechny soubory s pixmapami (</translation> </message> @@ -1197,7 +1022,6 @@ <context> <name>ItemPropertyBrowser</name> <message> - <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+66"/> <source>XX Icon Selected off</source> <extracomment>Sample string to determinate the width for the first column of the list item property browser</extracomment> <translation>Vybraná ikona, z</translation> @@ -1206,33 +1030,27 @@ <context> <name>MainWindowBase</name> <message> - <location filename="../tools/designer/src/designer/mainwindow.cpp" line="+119"/> <source>Main</source> <extracomment>Not currently used (main tool bar)</extracomment> <translation>Hlavní pruh s nástroji</translation> </message> <message> - <location line="+6"/> <source>File</source> <translation>Soubor</translation> </message> <message> - <location line="+1"/> <source>Edit</source> <translation>Úpravy</translation> </message> <message> - <location line="+1"/> <source>Tools</source> <translation>Nástroje</translation> </message> <message> - <location line="+1"/> <source>Form</source> <translation>Formulář</translation> </message> <message> - <location line="+7"/> <source>Qt Designer</source> <translation>Qt Designer</translation> </message> @@ -1240,52 +1058,42 @@ <context> <name>NewForm</name> <message> - <location filename="../tools/designer/src/designer/newform.cpp" line="+79"/> <source>C&reate</source> <translation>&Vytvořit nový z předlohy</translation> </message> <message> - <location line="+1"/> <source>Recent</source> <translation>Naposledy otevřený</translation> </message> <message> - <location line="+32"/> <source>&Close</source> <translation>&Zavřít</translation> </message> <message> - <location line="+3"/> <source>&Open...</source> <translation>&Otevřít...</translation> </message> <message> - <location line="+4"/> <source>&Recent Forms</source> <translation>&Naposledy otevřené formuláře</translation> </message> <message> - <location line="+64"/> <source>Read error</source> <translation>Chyba při čtení</translation> </message> <message> - <location line="-100"/> <source>New Form</source> <translation>Nový formulář</translation> </message> <message> - <location line="-5"/> <source>Show this Dialog on Startup</source> <translation>Ukázat tento dialog při spuštění</translation> </message> <message> - <location line="+128"/> <source>A temporary form file could not be created in %1.</source> <translation>V adresáři %1 se nepodařilo vytvořit dočasný soubor s formulářem.</translation> </message> <message> - <location line="+6"/> <source>The temporary form file %1 could not be written.</source> <translation>Dočasný soubor s formulářem %1 se nepodařilo zapsat.</translation> </message> @@ -1293,22 +1101,18 @@ <context> <name>ObjectInspectorModel</name> <message> - <location filename="../tools/designer/src/components/objectinspector/objectinspectormodel.cpp" line="+360"/> <source>Object</source> <translation>Předmět</translation> </message> <message> - <location line="+1"/> <source>Class</source> <translation>Třída</translation> </message> <message> - <location line="+35"/> <source>separator</source> <translation>Oddělovač</translation> </message> <message> - <location line="+98"/> <source><noname></source> <translation><nepojmenovaný></translation> </message> @@ -1316,12 +1120,10 @@ <context> <name>ObjectNameDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_taskmenu.cpp" line="+158"/> <source>Change Object Name</source> <translation>Změnit název předmětu</translation> </message> <message> - <location line="+4"/> <source>Object Name</source> <translation>Název předmětu</translation> </message> @@ -1329,12 +1131,10 @@ <context> <name>PluginDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/plugindialog.ui"/> <source>Plugin Information</source> <translation>Přídavné moduly</translation> </message> <message> - <location/> <source>1</source> <translation>1</translation> </message> @@ -1342,7 +1142,6 @@ <context> <name>PreferencesDialog</name> <message> - <location filename="../tools/designer/src/designer/preferencesdialog.ui"/> <source>Preferences</source> <translation>Nastavení</translation> </message> @@ -1350,32 +1149,26 @@ <context> <name>PreviewConfigurationWidget</name> <message> - <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.ui"/> <source>Form</source> <translation>Formulář</translation> </message> <message> - <location/> <source>Print/Preview Configuration</source> <translation>Nastavení tisku/náhledu</translation> </message> <message> - <location/> <source>Style</source> <translation>Styl</translation> </message> <message> - <location/> <source>Style sheet</source> <translation>Předlohový list</translation> </message> <message> - <location/> <source>...</source> <translation>...</translation> </message> <message> - <location/> <source>Device skin</source> <translation>Vzhled pro zařízení</translation> </message> @@ -1383,7 +1176,6 @@ <context> <name>PromotionModel</name> <message> - <location filename="../tools/designer/src/lib/shared/promotionmodel.cpp" line="+112"/> <source>Not used</source> <extracomment>Usage of promoted widgets</extracomment> <translation>Nepoužívaný</translation> @@ -1392,8 +1184,6 @@ <context> <name>Q3WizardContainer</name> <message> - <location filename="../tools/designer/src/plugins/widgets/q3wizard/q3wizard_container.cpp" line="+172"/> - <location line="+5"/> <source>Page</source> <translation>Strana</translation> </message> @@ -1401,58 +1191,47 @@ <context> <name>QAbstractFormBuilder</name> <message> - <location filename="../tools/designer/src/lib/uilib/abstractformbuilder.cpp" line="+206"/> <source>Unexpected element <%1></source> <translation>Neplatný prvek <%1></translation> </message> <message> - <location line="+5"/> <source>An error has occurred while reading the UI file at line %1, column %2: %3</source> <translation>Chyba při čtení souboru s rozhraním, řádek %1, sloupec %2: %3</translation> </message> <message> - <location line="+6"/> <source>Invalid UI file: The root element <ui> is missing.</source> <translation>Chyba při čtení souboru s rozhraním: Kořenový prvek <ui> chybí.</translation> </message> <message> - <location line="+119"/> <source>The creation of a widget of the class '%1' failed.</source> <translation>Nepodařilo se vytvořit žádný prvek třídy '%1'.</translation> </message> <message> - <location line="+296"/> <source>Attempt to add child that is not of class QWizardPage to QWizard.</source> <translation>Pokus o přidání strany předmětu třídy QWizard, která není typu QWizardPage.</translation> </message> <message> - <location line="+86"/> <source>Attempt to add a layout to a widget '%1' (%2) which already has a layout of non-box type %3. This indicates an inconsistency in the ui-file.</source> <translation>Pokus o přidání rozvržení na prvek '%1' (%2), který již má rozvržení typu %3 hat. Ukazuje to na nesrovnalost v souboru s rozhraním.</translation> </message> <message> - <location line="+144"/> <source>Empty widget item in %1 '%2'.</source> <translation>Prázdná položka prvku v %1 '%2'.</translation> </message> <message> - <location line="+680"/> <source>Flags property are not supported yet.</source> <translation>Vlastnosti typu "příznak" nejsou podporovány.</translation> </message> <message> - <location line="+81"/> <source>While applying tab stops: The widget '%1' could not be found.</source> <translation>Chyba při stanovení pořadí tabulátorů: Nepodařilo se nalézt žádný prvek s názvem '%1'.</translation> </message> <message> - <location line="+908"/> <source>Invalid QButtonGroup reference '%1' referenced by '%2'.</source> <translation>Neplatný odkaz na skupinu tlačítek '%1', odkazováno '%2'.</translation> </message> <message> - <location line="+511"/> <source>This version of the uitools library is linked without script support.</source> <translation>Tato verze knihovny uitools nepodporuje skripty.</translation> </message> @@ -1460,12 +1239,10 @@ This indicates an inconsistency in the ui-file.</source> <context> <name>QAxWidgetPlugin</name> <message> - <location filename="../tools/designer/src/plugins/activeqt/qaxwidgetplugin.cpp" line="+75"/> <source>ActiveX control</source> <translation>Ovládací prvek ActiveX</translation> </message> <message> - <location line="+5"/> <source>ActiveX control widget</source> <translation>Ovládací prvek ActiveX</translation> </message> @@ -1473,22 +1250,18 @@ This indicates an inconsistency in the ui-file.</source> <context> <name>QAxWidgetTaskMenu</name> <message> - <location filename="../tools/designer/src/plugins/activeqt/qaxwidgettaskmenu.cpp" line="+119"/> <source>Set Control</source> <translation>Nastavit ovládací prvek</translation> </message> <message> - <location line="+1"/> <source>Reset Control</source> <translation>Nastavit znovu ovládací prvek</translation> </message> <message> - <location line="+41"/> <source>Licensed Control</source> <translation>Licencovaný ovládací prvek</translation> </message> <message> - <location line="+1"/> <source>The control requires a design-time license</source> <translation>Ovládací prvek vyžaduje licenci k času návrhu</translation> </message> @@ -1496,67 +1269,54 @@ This indicates an inconsistency in the ui-file.</source> <context> <name>QCoreApplication</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_promotion.cpp" line="+83"/> <source>%1 is not a promoted class.</source> <translation>%1 není zástupným symbolem pro uživatelsky stanovenou třídu.</translation> </message> <message> - <location line="+65"/> <source>The base class %1 is invalid.</source> <translation>%1 není platnou základní třídou.</translation> </message> <message> - <location line="+7"/> <source>The class %1 already exists.</source> <translation>Již existuje třída s názvem %1.</translation> </message> <message> - <location line="+9"/> <source>Promoted Widgets</source> <translation>Zástupný symbol pro uživatelsky stanovené prvky</translation> </message> <message> - <location line="+126"/> <source>The class %1 cannot be removed</source> <translation>Třída %1 nemůže být odstraněna</translation> </message> <message> - <location line="+9"/> <source>The class %1 cannot be removed because it is still referenced.</source> <translation>Třída %1 nemůže být odstraněna, protože se stále používá.</translation> </message> <message> - <location line="+10"/> <source>The class %1 cannot be renamed</source> <translation>Třída %1 nemůže být přejmenována</translation> </message> <message> - <location line="+7"/> <source>The class %1 cannot be renamed to an empty name.</source> <translation>Název pro třídu nemůže zůstat prázdný (%1).</translation> </message> <message> - <location line="+5"/> <source>There is already a class named %1.</source> <translation>Již existuje třída s názvem %1.</translation> </message> <message> - <location line="+29"/> <source>Cannot set an empty include file.</source> <translation>Název pro hlavičkový soubor nemůže zůstat prázdný.</translation> </message> <message> - <location filename="../tools/designer/src/lib/uilib/formscriptrunner.cpp" line="+88"/> <source>Exception at line %1: %2</source> <translation>Chyba výjimky na řádku %1: %2</translation> </message> <message> - <location line="+36"/> <source>Unknown error</source> <translation>Neznámá chyba</translation> </message> <message> - <location line="+50"/> <source>An error occurred while running the script for %1: %2 Script: %3</source> <translation>Při provádění skriptu pro %1 se vyskytla chyba: %2Skript: %3</translation> @@ -1565,17 +1325,14 @@ Script: %3</source> <context> <name>QDesigner</name> <message> - <location filename="../tools/designer/src/designer/qdesigner.cpp" line="+141"/> <source>%1 - warning</source> <translation>%1 - Upozornění</translation> </message> <message> - <location line="+96"/> <source>Qt Designer</source> <translation>Qt Designer</translation> </message> <message> - <location line="+1"/> <source>This application cannot be used for the Console edition of Qt</source> <translation>Tato aplikace se nedá používat pro konzolové vydání Qt</translation> </message> @@ -1583,207 +1340,162 @@ Script: %3</source> <context> <name>QDesignerActions</name> <message> - <location filename="../tools/designer/src/designer/qdesigner_actions.cpp" line="+178"/> <source>Edit Widgets</source> <translation>Upravit prvky</translation> </message> <message> - <location line="+10"/> <source>&Quit</source> <translation>&Ukončit</translation> </message> <message> - <location line="+3"/> <source>&Minimize</source> <translation>&Zmenšit</translation> </message> <message> - <location line="+2"/> <source>Bring All to Front</source> <translation>Ukázat všechny formuláře</translation> </message> <message> - <location line="+2"/> <source>Preferences...</source> <translation>Nastavení...</translation> </message> <message> - <location line="+298"/> <source>Clear &Menu</source> <translation>Smazat &nabídku</translation> </message> <message> - <location line="-233"/> <source>CTRL+SHIFT+S</source> <translation>CTRL+SHIFT+S</translation> </message> <message> - <location line="+113"/> <source>CTRL+R</source> <translation>CTRL+R</translation> </message> <message> - <location line="+18"/> <source>CTRL+M</source> <translation>CTRL+M</translation> </message> <message> - <location line="+31"/> <source>Qt Designer &Help</source> <translation>&Nápověda k programu Qt Designer</translation> </message> <message> - <location line="+7"/> <source>Current Widget Help</source> <translation>Nápověda k vybranému prvku</translation> </message> <message> - <location line="+7"/> <source>What's New in Qt Designer?</source> <translation>Co je nového v programu Qt Designer?</translation> </message> <message> - <location line="+7"/> <source>About Plugins</source> <translation>Přídavné moduly</translation> </message> <message> - <location line="+6"/> - <location line="+601"/> <source>About Qt Designer</source> <translation>O programu Qt Designer</translation> </message> <message> - <location line="-595"/> <source>About Qt</source> <translation>O Qt</translation> </message> <message> - <location line="+121"/> - <location line="+197"/> <source>Open Form</source> <translation>Otevřít formulář</translation> </message> <message> - <location line="-196"/> - <location line="+37"/> - <location line="+160"/> <source>Designer UI files (*.%1);;All Files (*)</source> <translation>Soubory rozhraní programu Designer (*.%1);;Všechny soubory (*)</translation> </message> <message> - <location line="-620"/> <source>%1 already exists. Do you want to replace it?</source> <translation>Soubor %1 již existuje. Chcete jej nahradit?</translation> </message> <message> - <location line="-26"/> <source>Saved %1.</source> <translation>Formulář %1 byl uložen.</translation> </message> <message> - <location line="+371"/> <source>&Recent Forms</source> <translation>&Naposledy otevřené formuláře</translation> </message> <message> - <location line="+202"/> <source>Designer</source> <translation>Designer</translation> </message> <message> - <location line="+0"/> <source>Feature not implemented yet!</source> <translation>Tato funkce ještě není provedena!</translation> </message> <message> - <location line="+59"/> <source>Read error</source> <translation>Chyba při čtení</translation> </message> <message> - <location line="+1"/> <source>%1 Do you want to update the file location or generate a new form?</source> <translation>%1 Chcete zadat jiný název pro soubor, nebo vytvořit nový formulář?</translation> </message> <message> - <location line="+3"/> <source>&Update</source> <translation>&Jiný název</translation> </message> <message> - <location line="+1"/> <source>&New Form</source> <translation>&Nový formulář</translation> </message> <message> - <location line="+77"/> - <location line="+40"/> <source>Save Form?</source> <translation>Uložit formulář?</translation> </message> <message> - <location line="-39"/> <source>Could not open file</source> <translation>Soubor se nepodařilo otevřít</translation> </message> <message> - <location line="+282"/> - <location line="+23"/> <source>The backup file %1 could not be written.</source> <translation>Ukládání na pozadí: Soubor se zálohou %1 se nepodařilo zapsat.</translation> </message> <message> - <location line="+107"/> <source>The backup directory %1 could not be created.</source> <translation>Ukládání na pozadí: Adresář se zálohou %1 se nepodařilo.</translation> </message> <message> - <location line="+6"/> <source>The temporary backup directory %1 could not be created.</source> <translation>Ukládání na pozadí: Dočasný adresář se zálohou %1 se nepodařilo.</translation> </message> <message> - <location line="+94"/> <source>Please close all forms to enable the loading of additional fonts.</source> <translation>Zavřete, prosím, všechny formuláře kvůli umožnění nahrání dodatečných písem.</translation> </message> <message> - <location line="-502"/> <source>Select New File</source> <translation>Vybrat nový soubor</translation> </message> <message> - <location line="+30"/> <source>Could not write file</source> <translation>Soubor se nepodařilo zapsat</translation> </message> <message> - <location line="+201"/> <source>&Close Preview</source> <translation>&Zavřít náhled</translation> </message> <message> - <location line="-898"/> <source>Save &Image...</source> <translation>&Uložit obraz...</translation> </message> <message> - <location line="+1"/> <source>&Print...</source> <translation>&Tisk...</translation> </message> <message> - <location line="+9"/> <source>Additional Fonts...</source> <translation>Dodatečná písma...</translation> </message> <message> - <location line="+651"/> <source>The file %1 could not be opened. Reason: %2 Would you like to retry or select a different file?</source> @@ -1792,7 +1504,6 @@ Would you like to retry or select a different file?</source> Chcete to zkusit ještě jednou, nebo vybrat jiný soubor?</translation> </message> <message> - <location line="+39"/> <source>It was not possible to write the entire file %1 to disk. Reason:%2 Would you like to retry?</source> @@ -1801,96 +1512,74 @@ Důvod: %2 Chcete to zkusit ještě jednou?</translation> </message> <message> - <location line="+429"/> <source>Image files (*.%1)</source> <translation>Soubory s obrazem (*.%1)</translation> </message> <message> - <location line="+9"/> - <location line="+17"/> <source>Save Image</source> <translation>Uložit obraz</translation> </message> <message> - <location line="+1"/> <source>The file %1 could not be written.</source> <translation>Soubor %1 se nepodařilo zapsat.</translation> </message> <message> - <location line="-1163"/> <source>&New...</source> <translation>&Nový...</translation> </message> <message> - <location line="+1"/> <source>&Open...</source> <translation>&Otevřít...</translation> </message> <message> - <location line="+1"/> <source>&Save</source> <translation>&Uložit</translation> </message> <message> - <location line="+1"/> <source>Save &As...</source> <translation>Uložit &jako...</translation> </message> <message> - <location line="+1"/> <source>Save A&ll</source> <translation>&Uložit vše</translation> </message> <message> - <location line="+1"/> <source>Save As &Template...</source> <translation>Uložit jako &předlohu...</translation> </message> <message> - <location line="+1"/> - <location line="+901"/> <source>&Close</source> <translation>&Zavřít</translation> </message> <message> - <location line="-896"/> <source>View &Code...</source> <translation>Ukázat &kód...</translation> </message> <message> - <location line="+424"/> - <location line="+248"/> <source>Save Form As</source> <translation>Uložit formulář jako</translation> </message> <message> - <location line="+429"/> <source>Preview failed</source> <translation>Nepodařilo se vytvořit žádný náhled</translation> </message> <message> - <location line="-575"/> <source>Code generation failed</source> <translation>Nepodařilo se vytvořit žádný kód</translation> </message> <message> - <location line="+328"/> - <location line="+34"/> <source>Assistant</source> <translation>Assistant</translation> </message> <message> - <location line="+259"/> <source>Saved image %1.</source> <translation>Obraz byl uložen pod %1.</translation> </message> <message> - <location line="+70"/> <source>Printed %1.</source> <translation>%1 byl vytištěn.</translation> </message> <message> - <location line="-1149"/> <source>ALT+CTRL+S</source> <translation>ALT+CTRL+S</translation> </message> @@ -1898,7 +1587,6 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerAppearanceOptionsPage</name> <message> - <location filename="../tools/designer/src/designer/qdesigner_appearanceoptions.cpp" line="+138"/> <source>Appearance</source> <extracomment>Tab in preferences dialog</extracomment> <translation>Vzhled</translation> @@ -1907,17 +1595,14 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerAppearanceOptionsWidget</name> <message> - <location line="-53"/> <source>Docked Window</source> <translation>Režim ukotveného okna</translation> </message> <message> - <location line="+1"/> <source>Multiple Top-Level Windows</source> <translation>Režim více oken</translation> </message> <message> - <location line="+5"/> <source>Toolwindow Font</source> <translation>Písmo pro okno s nástroji</translation> </message> @@ -1925,22 +1610,18 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerAxWidget</name> <message> - <location filename="../tools/designer/src/plugins/activeqt/qaxwidgettaskmenu.cpp" line="-71"/> <source>Reset control</source> <translation>Nastavit znovu ovládací prvek</translation> </message> <message> - <location line="+2"/> <source>Set control</source> <translation>Nastavit ovládací prvek</translation> </message> <message> - <location filename="../tools/designer/src/plugins/activeqt/qdesigneraxwidget.cpp" line="+179"/> <source>Control loaded</source> <translation>Ovládací prvek nahrán</translation> </message> <message> - <location line="+40"/> <source>A COM exception occurred when executing a meta call of type %1, index %2 of "%3".</source> <translation>Při vyvolání postupu typu %1 se vyskytla výjimka COM, rejstřík %2 "%3".</translation> </message> @@ -1948,17 +1629,14 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerFormBuilder</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_formbuilder.cpp" line="+89"/> <source>Script errors occurred:</source> <translation>Vyskytly se chyby ve skriptech:</translation> </message> <message> - <location line="+307"/> <source>The preview failed to build.</source> <translation>Nepodařilo se vytvořit žádný náhled.</translation> </message> <message> - <location line="+65"/> <source>Designer</source> <translation>Designer</translation> </message> @@ -1966,22 +1644,18 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerFormWindow</name> <message> - <location filename="../tools/designer/src/designer/qdesigner_formwindow.cpp" line="+217"/> <source>%1 - %2[*]</source> <translation>%1 - %2[*]</translation> </message> <message> - <location line="+10"/> <source>Save Form?</source> <translation>Uložit formulář?</translation> </message> <message> - <location line="+1"/> <source>Do you want to save the changes to this document before closing?</source> <translation>Chcete v tomto formuláři uložit před zavřením změny?</translation> </message> <message> - <location line="+2"/> <source>If you don't save, your changes will be lost.</source> <translation>Pokud neprovedete uložení, budou vaše změny ztraceny. </translation> </message> @@ -1989,38 +1663,30 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerMenu</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="-1181"/> <source>Type Here</source> <translation>Zadejte text</translation> </message> <message> - <location line="+3"/> <source>Add Separator</source> <translation>Přidat oddělovač</translation> </message> <message> - <location line="+371"/> <source>Insert separator</source> <translation>Vložit oddělovač</translation> </message> <message> - <location line="+7"/> <source>Remove action '%1'</source> <translation>Odstranit činnost '%1'</translation> </message> <message> - <location line="-2"/> <source>Remove separator</source> <translation>Odstranit oddělovač</translation> </message> <message> - <location line="+27"/> - <location line="+650"/> <source>Add separator</source> <translation>Přidat oddělovač</translation> </message> <message> - <location line="-348"/> <source>Insert action</source> <translation>Vložit činnost</translation> </message> @@ -2028,22 +1694,18 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerMenuBar</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-375"/> <source>Type Here</source> <translation>Zadejte text</translation> </message> <message> - <location line="+298"/> <source>Remove Menu '%1'</source> <translation>Odstranit nabídku '%1'</translation> </message> <message> - <location line="+12"/> <source>Remove Menu Bar</source> <translation>Odstranit pruh s nabídkou</translation> </message> <message> - <location line="+70"/> <source>Menu</source> <translation>Nabídka</translation> </message> @@ -2051,37 +1713,30 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerPluginManager</name> <message> - <location filename="../tools/designer/src/lib/shared/pluginmanager.cpp" line="+271"/> <source>An XML error was encountered when parsing the XML of the custom widget %1: %2</source> <translation>Chyba při vyhodnocování XML uživatelsky stanoveného prvku %1: %2</translation> </message> <message> - <location line="+5"/> <source>A required attribute ('%1') is missing.</source> <translation>U prvku chybí vyžadovaná vlastnost ('%1').</translation> </message> <message> - <location line="+38"/> <source>An invalid property specification ('%1') was encountered. Supported types: %2</source> <translation>'%1' není platným vymezením vlastnosti. Jsou podporovány následující typy: %2</translation> </message> <message> - <location line="+20"/> <source>'%1' is not a valid string property specification.</source> <translation>'%1' není platným vymezením vlastnosti řetězce znaků.</translation> </message> <message> - <location line="+40"/> <source>The XML of the custom widget %1 does not contain any of the elements <widget> or <ui>.</source> <translation>Kód XML pro prvek %1 neobsahuje platný kořenový prvek (<widget>, nebo <ui>).</translation> </message> <message> - <location line="+12"/> <source>The class attribute for the class %1 is missing.</source> <translation>Chybí vlastnost třídy pro třídu %1.</translation> </message> <message> - <location line="+4"/> <source>The class attribute for the class %1 does not match the class name %2.</source> <translation>Vlastnost třídy pro třídu %1 neodpovídá názvu třídy (%2).</translation> </message> @@ -2089,7 +1744,6 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerPropertySheet</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_propertysheet.cpp" line="+754"/> <source>Dynamic Properties</source> <translation>Dynamické vlastnosti</translation> </message> @@ -2097,31 +1751,26 @@ Chcete to zkusit ještě jednou?</translation> <context> <name>QDesignerResource</name> <message> - <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+492"/> <source>The layout type '%1' is not supported, defaulting to grid.</source> <translation>Typ rozvržení '%1' není podporován; bylo vytvořeno mřížkové rozvržení.</translation> </message> <message> - <location line="+243"/> <source>The container extension of the widget '%1' (%2) returned a widget not managed by Designer '%3' (%4) when queried for page #%5. Container pages should only be added by specifying them in XML returned by the domXml() method of the custom widget.</source> <translation>Kontejnerové rozšíření prvku '%1' (%2) vrátilo pro stranu %5 prvek '%3' (%4), který není spravován programem Designer. Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu domXML() uživatelsky stanoveného prvku.</translation> </message> <message> - <location line="+599"/> <source>Unexpected element <%1></source> <extracomment>Parsing clipboard contents</extracomment> <translation>Neplatný prvek <%1></translation> </message> <message> - <location line="+6"/> <source>Error while pasting clipboard contents at line %1, column %2: %3</source> <extracomment>Parsing clipboard contents</extracomment> <translation>Chyba při vložení obsahu schránky, řádek %1, sloupec %2: %3</translation> </message> <message> - <location line="+6"/> <source>Error while pasting clipboard contents: The root element <ui> is missing.</source> <extracomment>Parsing clipboard contents</extracomment> <translation>Chyba při vložení obsahu schránky: Kořenový prvek <ui> chybí.</translation> @@ -2130,12 +1779,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QDesignerSharedSettings</name> <message> - <location filename="../tools/designer/src/lib/shared/shared_settings.cpp" line="+83"/> <source>The template path %1 could not be created.</source> <translation>Adresář s předlohami %1 se nepodařilo zřídit.</translation> </message> <message> - <location line="+184"/> <source>An error has been encountered while parsing device profile XML: %1</source> <translation>Při čtení XML profilu zařízení se vyskytla chyba: %1</translation> </message> @@ -2143,32 +1790,26 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QDesignerToolWindow</name> <message> - <location filename="../tools/designer/src/designer/qdesigner_toolwindow.cpp" line="+190"/> <source>Property Editor</source> <translation>Editor vlastností</translation> </message> <message> - <location line="+54"/> <source>Action Editor</source> <translation>Editor činností</translation> </message> <message> - <location line="+42"/> <source>Object Inspector</source> <translation>Ukazatel předmětů</translation> </message> <message> - <location line="+35"/> <source>Resource Browser</source> <translation>Prohlížeč zdrojů</translation> </message> <message> - <location line="+34"/> <source>Signal/Slot Editor</source> <translation>Editor signálů a zdířek</translation> </message> <message> - <location line="+41"/> <source>Widget Box</source> <translation>Krabice s prvky</translation> </message> @@ -2176,97 +1817,78 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QDesignerWorkbench</name> <message> - <location filename="../tools/designer/src/designer/qdesigner_workbench.cpp" line="+199"/> <source>&File</source> <translation>&Soubor</translation> </message> <message> - <location line="+6"/> <source>F&orm</source> <translation>F&ormulář</translation> </message> <message> - <location line="+1"/> <source>Preview in</source> <translation>Náhled v</translation> </message> <message> - <location line="+8"/> <source>&Window</source> <translation>&Okno</translation> </message> <message> - <location line="+2"/> <source>&Help</source> <translation>&Nápověda</translation> </message> <message> - <location line="-15"/> <source>Edit</source> <translation>Úpravy</translation> </message> <message> - <location line="+38"/> <source>Toolbars</source> <translation>Nástrojové pruhy</translation> </message> <message> - <location line="+465"/> <source>Save Forms?</source> <translation>Uložit formuláře?</translation> </message> <message> - <location line="-494"/> <source>&View</source> <translation>&Pohled</translation> </message> <message> - <location line="+2"/> <source>&Settings</source> <translation>&Nastavení</translation> </message> <message> - <location line="+204"/> <source>Widget Box</source> <translation>Krabice s prvky</translation> </message> <message> - <location line="+292"/> <source>If you do not review your documents, all your changes will be lost.</source> <translation>Změny budou ztraceny, pokud se na formuláře ještě jednou nepodíváte.</translation> </message> <message> - <location line="+1"/> <source>Discard Changes</source> <translation>Zahodit změny</translation> </message> <message> - <location line="+2"/> <source>Review Changes</source> <translation>Podívat se na změny</translation> </message> <message> - <location line="+95"/> <source>Backup Information</source> <translation>Informace o ukládání na pozadí</translation> </message> <message> - <location line="+1"/> <source>The last session of Designer was not terminated correctly. Backup files were left behind. Do you want to load them?</source> <translation>Designer zřejmě nebyl řádně ukončen; existují soubory z ukládání na pozadí. Chcete je nahrát?</translation> </message> <message> - <location line="+111"/> <source>The file <b>%1</b> could not be opened.</source> <translation>Soubor <b>%1</b> se nepodařilo otevřít.</translation> </message> <message> - <location line="+46"/> <source>The file <b>%1</b> is not a valid Designer UI file.</source> <translation>Soubor <b>%1</b> není platným souborem rozhraní programu Designer.</translation> </message> <message numerus="yes"> - <location line="-259"/> <source>There are %n forms with unsaved changes. Do you want to review these changes before quitting?</source> <translation> <numerusform>Formulář byl změněn, ale změny nebyl uloženy. Chcete se na tyto změny podívat předtím, než program ukončíte?</numerusform> @@ -2278,92 +1900,86 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QFormBuilder</name> <message> - <location filename="../tools/designer/src/lib/uilib/formbuilder.cpp" line="+163"/> <source>An empty class name was passed on to %1 (object name: '%2').</source> - <extracomment>Empty class name passed to widget factory method</extracomment> + <extracomment>Empty class name passed to widget factory method +---------- +Empty class name passed to widget factory method +---------- +Empty class name passed to widget factory method</extracomment> <translation>Postupu %1 byl předán prázdný název třídy (název předmětu '%2').</translation> </message> <message> - <location line="+56"/> <source>QFormBuilder was unable to create a custom widget of the class '%1'; defaulting to base class '%2'.</source> <translation>QFormBuilderu se nepodařilo vytvořit uživatelsky stanovený prvek třídy '%1'; byl vytvořen prvek základní třídy '%2'.</translation> </message> <message> - <location line="+6"/> <source>QFormBuilder was unable to create a widget of the class '%1'.</source> <translation>QFormBuilderu se nepodařilo vytvořit předmět třídy '%1'.</translation> </message> <message> - <location line="+61"/> <source>The layout type `%1' is not supported.</source> <translation>Rozvržení typu `%1' nejsou podporována.</translation> </message> <message> - <location filename="../tools/designer/src/lib/uilib/properties.cpp" line="+106"/> <source>The set-type property %1 could not be read.</source> <translation>Vlastnost %1 se nepodařilo přečíst (typ: množství).</translation> </message> <message> - <location line="+23"/> <source>The enumeration-type property %1 could not be read.</source> <translation>Vlastnost %1 se nepodařilo přečíst (typ: výčet).</translation> </message> <message> - <location line="+190"/> <source>Reading properties of the type %1 is not supported yet.</source> <translation>Čtení vlastností typu %1 není podporováno.</translation> </message> <message> - <location line="+266"/> <source>The property %1 could not be written. The type %2 is not supported yet.</source> <translation>Vlastnost %1 se nepodařilo zapsat, protože typ %2 není podporován.</translation> </message> + <message> + <source>The enumeration-value '%1' is invalid. The default value '%2' will be used instead.</source> + <translation>Výčtová hodnota '%1' je neplatná. Místo ní se použije výchozí hodnota '%2'.</translation> + </message> + <message> + <source>The flag-value '%1' is invalid. Zero will be used instead.</source> + <translation>Příznaková hodnota '%1' je neplatná. Místo ní se použije nulová hodnota.</translation> + </message> </context> <context> <name>QStackedWidgetEventFilter</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_stackedbox.cpp" line="+194"/> <source>Previous Page</source> <translation>Předchozí strana</translation> </message> <message> - <location line="+1"/> <source>Next Page</source> <translation>Další strana</translation> </message> <message> - <location line="+1"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="+1"/> <source>Before Current Page</source> <translation>Před nynější stranu</translation> </message> <message> - <location line="+1"/> <source>After Current Page</source> <translation>Po nynější straně</translation> </message> <message> - <location line="+1"/> <source>Change Page Order...</source> <translation>Změnit pořadí stran...</translation> </message> <message> - <location line="+72"/> <source>Change Page Order</source> <translation>Změnit pořadí stran</translation> </message> <message> - <location line="+49"/> <source>Page %1 of %2</source> <translation>Strana %1 z %2</translation> </message> <message> - <location line="+10"/> - <location line="+4"/> <source>Insert Page</source> <translation>Vložit stranu</translation> </message> @@ -2371,12 +1987,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QStackedWidgetPreviewEventFilter</name> <message> - <location line="-153"/> <source>Go to previous page of %1 '%2' (%3/%4).</source> <translation>Jít na předchozí stranu %1 '%2' (%3/%4).</translation> </message> <message> - <location line="+4"/> <source>Go to next page of %1 '%2' (%3/%4).</source> <translation>Jít na další stranu %1 '%2' (%3/%4).</translation> </message> @@ -2384,28 +1998,22 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QTabWidgetEventFilter</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_tabwidget.cpp" line="+89"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="+1"/> <source>Before Current Page</source> <translation>Před nynější stranu</translation> </message> <message> - <location line="+1"/> <source>After Current Page</source> <translation>Po nynější straně</translation> </message> <message> - <location line="+283"/> <source>Page %1 of %2</source> <translation>Strana %1 z %2</translation> </message> <message> - <location line="+10"/> - <location line="+4"/> <source>Insert Page</source> <translation>Vložit stranu</translation> </message> @@ -2413,37 +2021,30 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QToolBoxHelper</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_toolbox.cpp" line="+64"/> <source>Delete Page</source> <translation>Smazat stranu</translation> </message> <message> - <location line="+1"/> <source>Before Current Page</source> <translation>Před nynější stranu</translation> </message> <message> - <location line="+1"/> <source>After Current Page</source> <translation>Po nynější straně</translation> </message> <message> - <location line="+1"/> <source>Change Page Order...</source> <translation>Změnit pořadí stran...</translation> </message> <message> - <location line="+116"/> <source>Change Page Order</source> <translation>Změnit pořadí stran</translation> </message> <message> - <location line="+44"/> <source>Page %1 of %2</source> <translation>Strana %1 z %2</translation> </message> <message> - <location line="+12"/> <source>Insert Page</source> <translation>Vložit stranu</translation> </message> @@ -2451,15 +2052,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtBoolEdit</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="+226"/> - <location line="+10"/> - <location line="+25"/> <source>True</source> <translation>Pravdivý</translation> </message> <message> - <location line="-25"/> - <location line="+25"/> <source>False</source> <translation>Nepravdivý</translation> </message> @@ -2467,12 +2063,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtBoolPropertyManager</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1469"/> <source>True</source> <translation>Pravdivý</translation> </message> <message> - <location line="+1"/> <source>False</source> <translation>Nepravdivý</translation> </message> @@ -2480,7 +2074,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtCharEdit</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+1581"/> <source>Clear Char</source> <translation>Smazat znak</translation> </message> @@ -2488,7 +2081,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtColorEditWidget</name> <message> - <location line="+605"/> <source>...</source> <translation>...</translation> </message> @@ -2496,22 +2088,18 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtColorPropertyManager</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+4743"/> <source>Red</source> <translation>Červená</translation> </message> <message> - <location line="+8"/> <source>Green</source> <translation>Zelená</translation> </message> <message> - <location line="+8"/> <source>Blue</source> <translation>Modrá</translation> </message> <message> - <location line="+8"/> <source>Alpha</source> <translation>Alfa</translation> </message> @@ -2519,97 +2107,78 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtCursorDatabase</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="-206"/> <source>Arrow</source> <translation>Šipka</translation> </message> <message> - <location line="+2"/> <source>Up Arrow</source> <translation>Šipka nahoru</translation> </message> <message> - <location line="+2"/> <source>Cross</source> <translation>Křížící se čáry</translation> </message> <message> - <location line="+2"/> <source>Wait</source> <translation>Přesýpací hodiny</translation> </message> <message> - <location line="+2"/> <source>IBeam</source> <translation>I trámec</translation> </message> <message> - <location line="+2"/> <source>Size Vertical</source> <translation>Zvětšit svisle</translation> </message> <message> - <location line="+2"/> <source>Size Horizontal</source> <translation>Zvětšit vodorovně</translation> </message> <message> - <location line="+2"/> <source>Size Backslash</source> <translation>Zvětšit zpětné/obrácené lomítko</translation> </message> <message> - <location line="+2"/> <source>Size Slash</source> <translation>Zvětšit lomítko</translation> </message> <message> - <location line="+2"/> <source>Size All</source> <translation>Zvětšit vše</translation> </message> <message> - <location line="+2"/> <source>Blank</source> <translation>Prázdný</translation> </message> <message> - <location line="+2"/> <source>Split Vertical</source> <translation>Rozdělit svisle</translation> </message> <message> - <location line="+2"/> <source>Split Horizontal</source> <translation>Rozdělit vodorovně</translation> </message> <message> - <location line="+2"/> <source>Pointing Hand</source> <translation>Ukazující ruka</translation> </message> <message> - <location line="+2"/> <source>Forbidden</source> <translation>Zakázáno</translation> </message> <message> - <location line="+2"/> <source>Open Hand</source> <translation>Otevřená ruka</translation> </message> <message> - <location line="+2"/> <source>Closed Hand</source> <translation>Zavřená ruka</translation> </message> <message> - <location line="+2"/> <source>What's This</source> <translation>A co je toto</translation> </message> <message> - <location line="+2"/> <source>Busy</source> <translation>Zaneprázdněn</translation> </message> @@ -2617,12 +2186,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtFontEditWidget</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+198"/> <source>...</source> <translation>...</translation> </message> <message> - <location line="+20"/> <source>Select Font</source> <translation>Vybrat písmo</translation> </message> @@ -2630,37 +2197,30 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtFontPropertyManager</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-351"/> <source>Family</source> <translation>Písmová rodina</translation> </message> <message> - <location line="+13"/> <source>Point Size</source> <translation>Bodová velikost</translation> </message> <message> - <location line="+8"/> <source>Bold</source> <translation>Tučné</translation> </message> <message> - <location line="+7"/> <source>Italic</source> <translation>Kurzíva</translation> </message> <message> - <location line="+7"/> <source>Underline</source> <translation>Podtržení</translation> </message> <message> - <location line="+7"/> <source>Strikeout</source> <translation>Přeškrtnuté</translation> </message> <message> - <location line="+7"/> <source>Kerning</source> <translation>Podřezávání</translation> </message> @@ -2668,7 +2228,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtGradientDialog</name> <message> - <location filename="../tools/shared/qtgradienteditor/qtgradientdialog.ui"/> <source>Edit Gradient</source> <translation>Upravit přechod</translation> </message> @@ -2676,304 +2235,242 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtGradientEditor</name> <message> - <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.cpp" line="+431"/> <source>Start X</source> <translation>Začáteční hodnota x</translation> </message> <message> - <location line="+4"/> <source>Start Y</source> <translation>Začáteční hodnota y</translation> </message> <message> - <location line="+4"/> <source>Final X</source> <translation>Koncová hodnota x</translation> </message> <message> - <location line="+4"/> <source>Final Y</source> <translation>Koncová hodnota y</translation> </message> <message> - <location line="+7"/> - <location line="+24"/> <source>Central X</source> <translation>Střed x</translation> </message> <message> - <location line="-20"/> - <location line="+24"/> <source>Central Y</source> <translation>Střed y</translation> </message> <message> - <location line="-20"/> <source>Focal X</source> <translation>Ohnisko x</translation> </message> <message> - <location line="+4"/> <source>Focal Y</source> <translation>Ohnisko y</translation> </message> <message> - <location line="+4"/> <source>Radius</source> <translation>Poloměr</translation> </message> <message> - <location line="+16"/> <source>Angle</source> <translation>Úhel</translation> </message> <message> - <location line="+288"/> <source>Linear</source> <translation>Přímočarý</translation> </message> <message> - <location line="+1"/> <source>Radial</source> <translation>Paprskovitý</translation> </message> <message> - <location line="+1"/> <source>Conical</source> <translation>Kuželovitý</translation> </message> <message> - <location line="+20"/> <source>Pad</source> <translation>Doplnit</translation> </message> <message> - <location line="+1"/> <source>Repeat</source> <translation>Opakovat</translation> </message> <message> - <location line="+1"/> <source>Reflect</source> <translation>Zrcadlit</translation> </message> <message> - <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.ui"/> <source>Form</source> <translation>Formulář</translation> </message> <message> - <location/> <source>Gradient Editor</source> <translation>Úpravy přechodů</translation> </message> <message> - <location/> <source>1</source> <translation>1</translation> </message> <message> - <location/> <source>2</source> <translation>2</translation> </message> <message> - <location/> <source>3</source> <translation>3</translation> </message> <message> - <location/> <source>4</source> <translation>4</translation> </message> <message> - <location/> <source>5</source> <translation>5</translation> </message> <message> - <location/> <source>Gradient Stops Editor</source> <translation>Editor bodů zastavení přechodu</translation> </message> <message> - <location/> <source>This area allows you to edit gradient stops. Double click on the existing stop handle to duplicate it. Double click outside of the existing stop handles to create a new stop. Drag & drop the handle to reposition it. Use right mouse button to popup context menu with extra actions.</source> <translation>Tato oblast slouží pro úpravy bodů zastavení přechodu. Dvakrát klepněte na orientační bod kvůli jeho zdvojení. Dvakrát klepněte na plochu kvůli vytvoření nového orientačního bodu. Použijte tažení & upuštění pro posunutí bodu. Pravým tlačítkem myši se vyvolává nabídka s dalšími souvisejícími volbami.</translation> </message> <message> - <location/> <source>Zoom</source> <translation>Zvětšení</translation> </message> <message> - <location/> <source>Position</source> <translation>Poloha</translation> </message> <message> - <location/> <source>Hue</source> <translation>Barevný odstín</translation> </message> <message> - <location/> <source>H</source> <translation>H</translation> </message> <message> - <location/> <source>Saturation</source> <translation>Sytost</translation> </message> <message> - <location/> <source>S</source> <translation>S</translation> </message> <message> - <location/> <source>Sat</source> <translation>Sytost</translation> </message> <message> - <location/> <source>Value</source> <translation>Hodnota</translation> </message> <message> - <location/> <source>V</source> <translation>V</translation> </message> <message> - <location/> <source>Val</source> <translation>Hodnota</translation> </message> <message> - <location/> <source>Alpha</source> <translation>Alfa</translation> </message> <message> - <location/> <source>A</source> <translation>A</translation> </message> <message> - <location/> <source>Type</source> <translation>Typ</translation> </message> <message> - <location/> <source>Spread</source> <translation>Rozšiřování</translation> </message> <message> - <location/> <source>Color</source> <translation>Barva</translation> </message> <message> - <location/> <source>Current stop's color</source> <translation>Barva nynějšího zastavení</translation> </message> <message> - <location/> <source>HSV</source> <translation>HSV</translation> </message> <message> - <location/> <source>RGB</source> <translation>RGB</translation> </message> <message> - <location/> <source>Current stop's position</source> <translation>Poloha nynějšího zastavení</translation> </message> <message> - <location/> <source>%</source> <translation>%</translation> </message> <message> - <location/> <source>Zoom In</source> <translation>Přiblížit</translation> </message> <message> - <location/> <source>Zoom Out</source> <translation>Oddálit</translation> </message> <message> - <location/> <source>Toggle details extension</source> <translation>Zařadit další volby</translation> </message> <message> - <location/> <source>></source> <translation>></translation> </message> <message> - <location/> <source>Linear Type</source> <translation>Přímočarý typ</translation> </message> <message> - <location/> <source>...</source> <translation>...</translation> </message> <message> - <location/> <source>Radial Type</source> <translation>Paprskovitý typ</translation> </message> <message> - <location/> <source>Conical Type</source> <translation>Kuželovitý typ</translation> </message> <message> - <location/> <source>Pad Spread</source> <translation>Doplnit rozšiřování</translation> </message> <message> - <location/> <source>Repeat Spread</source> <translation>Opakovat rozšiřování</translation> </message> <message> - <location/> <source>Reflect Spread</source> <translation>Zrcadlit rozšiřování</translation> </message> <message> - <location/> <source>This area shows a preview of the gradient being edited. It also allows you to edit parameters specific to the gradient's type such as start and final point, radius, etc. by drag & drop.</source> <translation>tato oblast ukazuje náhled právě upravovaného přechodu. Zde můžete upravovat proměnné příznačné pro přechod, jako začáteční a koncový bod, poloměr etd. pomocí tažení a pouštění.</translation> </message> <message> - <location/> <source>Show HSV specification</source> <translation>Ukázat přesné vymezení HSV</translation> </message> <message> - <location/> <source>Show RGB specification</source> <translation>Ukázat přesné vymezení RGB</translation> </message> <message> - <location/> <source>Reset Zoom</source> <translation>Nastavit znovu zvětšení</translation> </message> @@ -2981,37 +2478,30 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtGradientStopsWidget</name> <message> - <location filename="../tools/shared/qtgradienteditor/qtgradientstopswidget.cpp" line="+947"/> <source>New Stop</source> <translation>Nové zastavení</translation> </message> <message> - <location line="+1"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="+1"/> <source>Flip All</source> <translation>Obrátit vše</translation> </message> <message> - <location line="+1"/> <source>Select All</source> <translation>Vybrat vše</translation> </message> <message> - <location line="+1"/> <source>Zoom In</source> <translation>Zvětšit</translation> </message> <message> - <location line="+1"/> <source>Zoom Out</source> <translation>Zmenšit</translation> </message> <message> - <location line="+1"/> <source>Reset Zoom</source> <translation>Nastavit znovu zvětšení</translation> </message> @@ -3019,46 +2509,34 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtGradientView</name> <message> - <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+107"/> <source>Grad</source> <translation>Přechod</translation> </message> <message> - <location line="+26"/> <source>Remove Gradient</source> <translation>Odstranit přechod</translation> </message> <message> - <location line="+1"/> <source>Are you sure you want to remove the selected gradient?</source> <translation>Opravdu chcete odstranit vybraný přechod?</translation> </message> <message> - <location filename="../tools/shared/qtgradienteditor/qtgradientview.ui"/> - <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+74"/> <source>New...</source> <translation>Nový...</translation> </message> <message> - <location/> - <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/> <source>Edit...</source> <translation>Upravit...</translation> </message> <message> - <location/> - <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/> <source>Rename</source> <translation>Přejmenovat</translation> </message> <message> - <location/> - <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/> <source>Remove</source> <translation>Odstranit</translation> </message> <message> - <location/> <source>Gradient View</source> <translation>Pohled na přechod</translation> </message> @@ -3066,7 +2544,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtGradientViewDialog</name> <message> - <location filename="../tools/shared/qtgradienteditor/qtgradientviewdialog.ui"/> <source>Select Gradient</source> <translation>Vybrat přechod</translation> </message> @@ -3074,7 +2551,6 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtKeySequenceEdit</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="+221"/> <source>Clear Shortcut</source> <translation>Smazat klávesové zkratky</translation> </message> @@ -3082,17 +2558,18 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtLocalePropertyManager</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-3541"/> + <source><Invalid></source> + <translation><Neplatný></translation> + </message> + <message> <source>%1, %2</source> <translation>%1, %2</translation> </message> <message> - <location line="+53"/> <source>Language</source> <translation>Jazyk</translation> </message> <message> - <location line="+8"/> <source>Country</source> <translation>Země</translation> </message> @@ -3100,17 +2577,14 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtPointFPropertyManager</name> <message> - <location line="+411"/> <source>(%1, %2)</source> <translation>(%1, %2)</translation> </message> <message> - <location line="+71"/> <source>X</source> <translation>X</translation> </message> <message> - <location line="+8"/> <source>Y</source> <translation>Y</translation> </message> @@ -3118,17 +2592,14 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtPointPropertyManager</name> <message> - <location line="-320"/> <source>(%1, %2)</source> <translation>(%1, %2)</translation> </message> <message> - <location line="+37"/> <source>X</source> <translation>X</translation> </message> <message> - <location line="+7"/> <source>Y</source> <translation>Y</translation> </message> @@ -3136,12 +2607,10 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtPropertyBrowserUtils</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="-136"/> <source>[%1, %2, %3] (%4)</source> <translation>[%1, %2, %3] (%4)</translation> </message> <message> - <location line="+30"/> <source>[%1, %2]</source> <translation>[%1, %2]</translation> </message> @@ -3149,27 +2618,22 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtRectFPropertyManager</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1706"/> <source>[(%1, %2), %3 x %4]</source> <translation>[(%1, %2), %3 x %4]</translation> </message> <message> - <location line="+156"/> <source>X</source> <translation>X</translation> </message> <message> - <location line="+8"/> <source>Y</source> <translation>Y</translation> </message> <message> - <location line="+8"/> <source>Width</source> <translation>Šířka</translation> </message> <message> - <location line="+9"/> <source>Height</source> <translation>Výška</translation> </message> @@ -3177,27 +2641,22 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtRectPropertyManager</name> <message> - <location line="-612"/> <source>[(%1, %2), %3 x %4]</source> <translation>[(%1, %2), %3 x %4]</translation> </message> <message> - <location line="+120"/> <source>X</source> <translation>X</translation> </message> <message> - <location line="+7"/> <source>Y</source> <translation>Y</translation> </message> <message> - <location line="+7"/> <source>Width</source> <translation>Šířka</translation> </message> <message> - <location line="+8"/> <source>Height</source> <translation>Výška</translation> </message> @@ -3205,33 +2664,26 @@ Kontejnerové stránky by měly být zadány výhradně v XML vráceném postupu <context> <name>QtResourceEditorDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.cpp" line="+1961"/> <source>Edit Resources</source> <translation>Upravit zdroje</translation> </message> <message> - <location line="+35"/> <source>New...</source> <translation>Nový...</translation> </message> <message> - <location line="-565"/> - <location line="+566"/> <source>New Resource File</source> <translation>Nový zdrojový soubor</translation> </message> <message> - <location line="-413"/> <source><p><b>Warning:</b> The file</p><p>%1</p><p>is outside of the current resource file's parent directory.</p></source> <translation><p><b>Upozornění:</b><p>Zvolený soubor: </p><p>%1</p><p>se nachází mimo adresář se nynějším zdrojovým souborem:</p></translation> </message> <message> - <location line="+8"/> <source><p>To resolve the issue, press:</p><table><tr><th align="left">Copy</th><td>to copy the file to the resource file's parent directory.</td></tr><tr><th align="left">Copy As...</th><td>to copy the file into a subdirectory of the resource file's parent directory.</td></tr><tr><th align="left">Keep</th><td>to use its current location.</td></tr></table></source> <translation><p>Zvolte, prosím:</p><table><tr><th align="left">Kopírovat</th><td>pro zkopírování souboru do adresáře se zdrojovým souborem.</td></tr><tr><th align="left">Kopírovat jako...</th><td>pro zkopírování souboru do podadresáře se zdrojovým souborem.</td></tr><tr><th align="left">Zachovat</th><td>, aby se soubor používal ve svém nynějším adresáři.</td></tr></table></translation> </message> <message> - <location line="+288"/> <source>Could not copy %1 to @@ -3242,248 +2694,192 @@ zu: %2</translation> </message> <message> - <location line="+35"/> <source>A parse error occurred at line %1, column %2 of %3: %4</source> <translation>V souboru %3 se na řádku %1, v sloupci %2 vyskytla chyba: %4</translation> </message> <message> - <location line="+83"/> <source>Open...</source> <translation>Otevřít...</translation> </message> <message> - <location line="+2"/> - <location line="+11"/> <source>Remove</source> <translation>Odstranit</translation> </message> <message> - <location line="-10"/> - <location line="+11"/> <source>Move Up</source> <translation>Posunout nahoru</translation> </message> <message> - <location line="-10"/> - <location line="+11"/> <source>Move Down</source> <translation>Posunout dolů</translation> </message> <message> - <location line="-9"/> - <location line="+1"/> <source>Add Prefix</source> <translation>Přidat předponu</translation> </message> <message> - <location line="+1"/> <source>Add Files...</source> <translation>Přidat soubory...</translation> </message> <message> - <location line="+1"/> <source>Change Prefix</source> <translation>Změnit předponu</translation> </message> <message> - <location line="+1"/> <source>Change Language</source> <translation>Změnit jazyk</translation> </message> <message> - <location line="+1"/> <source>Change Alias</source> <translation>Změnit přezdívku</translation> </message> <message> - <location line="+1"/> <source>Clone Prefix...</source> <translation>Zdvojit předponu...</translation> </message> <message> - <location line="+37"/> <source>Prefix / Path</source> <translation>Předpona/Cesta</translation> </message> <message> - <location line="+1"/> <source>Language / Alias</source> <translation>Jazyk/Přezdívka</translation> </message> <message> - <location line="+117"/> <source><html><p><b>Warning:</b> There have been problems while reloading the resources:</p><pre>%1</pre></html></source> <translation><html><p><b>Varování:</b> Při opětovném nahrání souboru se vyskytly chyby:</p><pre>%1</pre></html></translation> </message> <message> - <location line="+2"/> <source>Resource Warning</source> <translation>Zdroje - Varování</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.ui"/> <source>Dialog</source> <translation>Dialog</translation> </message> <message> - <location/> <source>New File</source> <translation>Nový soubor</translation> </message> <message> - <location/> <source>N</source> <translation>N</translation> </message> <message> - <location/> <source>Remove File</source> <translation>Odstranit soubor</translation> </message> <message> - <location/> <source>R</source> <translation>L</translation> </message> <message> - <location/> <source>I</source> <translation>I</translation> </message> <message> - <location/> <source>New Resource</source> <translation>Nový zdroj</translation> </message> <message> - <location/> <source>A</source> <translation>A</translation> </message> <message> - <location/> <source>Remove Resource or File</source> <translation>Odstranit zdroj nebo soubor</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.cpp" line="-2091"/> <source>%1 already exists. Do you want to replace it?</source> <translation>Soubor %1 již existuje. Chcete jej nahradit?</translation> </message> <message> - <location line="+5"/> <source>The file does not appear to be a resource file; element '%1' was found where '%2' was expected.</source> <translation>Soubor zřejmě není zdrojovým souborem; Na místě, kde byl očekáván prvek '%2' byl nalezen prvek '%1'.</translation> </message> <message> - <location line="+902"/> <source>%1 [read-only]</source> <translation>%1 [pouze pro čtení]</translation> </message> <message> - <location line="+2"/> - <location line="+198"/> <source>%1 [missing]</source> <translation>%1 [chybí]</translation> </message> <message> - <location line="-72"/> <source><no prefix></source> <translation><žádná předpona></translation> </message> <message> - <location line="+322"/> - <location line="+25"/> <source>Resource files (*.qrc)</source> <translation>Zdrojové soubory (*.qrc)</translation> </message> <message> - <location line="-2"/> <source>Import Resource File</source> <translation>Zavést zdrojový soubor</translation> </message> <message> - <location line="+112"/> <source>newPrefix</source> <translation>nováPředpona</translation> </message> <message> - <location line="+49"/> <source>Add Files</source> <translation>Přidat soubory</translation> </message> <message> - <location line="+21"/> <source>Incorrect Path</source> <translation>Nesprávný údaj o cestě</translation> </message> <message> - <location line="+3"/> - <location line="+19"/> - <location line="+212"/> - <location line="+7"/> <source>Copy</source> <translation>Kopírovat</translation> </message> <message> - <location line="-236"/> <source>Copy As...</source> <translation>Kopírovat jako...</translation> </message> <message> - <location line="+2"/> <source>Keep</source> <translation>Zachovat</translation> </message> <message> - <location line="+2"/> <source>Skip</source> <translation>Přeskočit</translation> </message> <message> - <location line="+87"/> <source>Clone Prefix</source> <translation>Zdvojit předponu</translation> </message> <message> - <location line="+1"/> <source>Enter the suffix which you want to add to the names of the cloned files. This could for example be a language extension like "_de".</source> <translation>Zadejte, prosím, příponu, kterou chcete přidat k názvům zdvojených souborů. Může to být například jazykové rozšíření "_cs".</translation> </message> <message> - <location line="+113"/> - <location line="+4"/> <source>Copy As</source> <translation>Kopírovat jako</translation> </message> <message> - <location line="+1"/> <source><p>The selected file:</p><p>%1</p><p>is outside of the current resource file's directory:</p><p>%2</p><p>Please select another path within this directory.<p></source> <translation><p>Vybraný soubor: </p><p>%1</p><p>se nachází mimo adresář se zdrojovým souborem:</p><p>%2</p><p>Zvolte, prosím, jinou cestu, která je obsažena v tomto adresáři.</p></translation> </message> <message> - <location line="+20"/> <source>Could not overwrite %1.</source> <translation>%1 se nepodařilo přepsat.</translation> </message> <message> - <location line="+54"/> <source>Save Resource File</source> <translation>Uložit zdrojový soubor</translation> </message> <message> - <location line="+1"/> <source>Could not write %1: %2</source> <translation>Soubor %1 se nepodařilo zapsat: %2</translation> </message> <message> - <location line="+71"/> <source>Open Resource File</source> <translation>Otevřít zdrojový soubor</translation> </message> @@ -3491,24 +2887,20 @@ Může to být například jazykové rozšíření "_cs".</translation <context> <name>QtResourceView</name> <message> - <location filename="../tools/designer/src/lib/shared/qtresourceview.cpp" line="+566"/> <source>Size: %1 x %2 %3</source> <translation>Velikost: %1 x %2 %3</translation> </message> <message> - <location line="+20"/> <source>Edit Resources...</source> <translation>Upravit zdroje...</translation> </message> <message> - <location line="+6"/> <source>Reload</source> <translation>Nahrát znovu</translation> </message> <message> - <location line="+7"/> <source>Copy Path</source> <translation>Kopírovat cestu</translation> </message> @@ -3516,7 +2908,6 @@ Může to být například jazykové rozšíření "_cs".</translation <context> <name>QtResourceViewDialog</name> <message> - <location line="+250"/> <source>Select Resource</source> <translation>Vybrat zdroj</translation> </message> @@ -3524,17 +2915,14 @@ Může to být například jazykové rozšíření "_cs".</translation <context> <name>QtSizeFPropertyManager</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-535"/> <source>%1 x %2</source> <translation>%1 x %2</translation> </message> <message> - <location line="+130"/> <source>Width</source> <translation>Šířka</translation> </message> <message> - <location line="+9"/> <source>Height</source> <translation>Výška</translation> </message> @@ -3542,33 +2930,26 @@ Může to být například jazykové rozšíření "_cs".</translation <context> <name>QtSizePolicyPropertyManager</name> <message> - <location line="+1709"/> - <location line="+1"/> <source><Invalid></source> <translation><Neplatný></translation> </message> <message> - <location line="+1"/> <source>[%1, %2, %3, %4]</source> <translation>[%1, %2, %3, %4]</translation> </message> <message> - <location line="+45"/> <source>Horizontal Policy</source> <translation>Vodorovné nastavení</translation> </message> <message> - <location line="+9"/> <source>Vertical Policy</source> <translation>Svislé nastavení</translation> </message> <message> - <location line="+9"/> <source>Horizontal Stretch</source> <translation>Vodorovné protažení</translation> </message> <message> - <location line="+8"/> <source>Vertical Stretch</source> <translation>Svislé protažení</translation> </message> @@ -3576,17 +2957,14 @@ Může to být například jazykové rozšíření "_cs".</translation <context> <name>QtSizePropertyManager</name> <message> - <location line="-2286"/> <source>%1 x %2</source> <translation>%1 x %2</translation> </message> <message> - <location line="+96"/> <source>Width</source> <translation>Šířka</translation> </message> <message> - <location line="+8"/> <source>Height</source> <translation>Výška</translation> </message> @@ -3594,107 +2972,86 @@ Může to být například jazykové rozšíření "_cs".</translation <context> <name>QtToolBarDialog</name> <message> - <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="+1784"/> <source>< S E P A R A T O R ></source> <translation>< O D D Ě L O V A Č ></translation> </message> <message> - <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.ui"/> <source>Customize Toolbars</source> <translation>Přizpůsobit nástrojové pruhy</translation> </message> <message> - <location/> <source>1</source> <translation>1</translation> </message> <message> - <location/> <source>Actions</source> <translation>Činnosti</translation> </message> <message> - <location/> <source>Toolbars</source> <translation>Nástrojové pruhy</translation> </message> <message> - <location/> <source>New</source> <translation>Nový</translation> </message> <message> - <location/> <source>Remove</source> <translation>Odstranit</translation> </message> <message> - <location/> <source>Rename</source> <translation>Přejmenovat</translation> </message> <message> - <location/> <source>Up</source> <translation>Nahoru</translation> </message> <message> - <location/> <source><-</source> <translation><-</translation> </message> <message> - <location/> <source>-></source> <translation>-></translation> </message> <message> - <location/> <source>Down</source> <translation>Dolů</translation> </message> <message> - <location/> <source>Current Toolbar Actions</source> <translation>Činnosti současného nástrojového pruhu</translation> </message> <message> - <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="-544"/> <source>Custom Toolbar</source> <translation>Uživatelsky stanovené nástrojové pruhy</translation> </message> <message> - <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.ui"/> <source>Add new toolbar</source> <translation>Přidat nový nástrojový pruh</translation> </message> <message> - <location/> <source>Remove selected toolbar</source> <translation>Odstranit vybraný nástrojový pruh</translation> </message> <message> - <location/> <source>Rename toolbar</source> <translation>Přejmenovat nástrojový pruh</translation> </message> <message> - <location/> <source>Move action up</source> <translation>Posunout činnost nahoru</translation> </message> <message> - <location/> <source>Remove action from toolbar</source> <translation>Odstranit činnost z nástrojového pruhu</translation> </message> <message> - <location/> <source>Add action to toolbar</source> <translation>Přidat činnost do nástrojového pruhu</translation> </message> <message> - <location/> <source>Move action down</source> <translation>Posunout činnost dolů</translation> </message> @@ -3702,12 +3059,10 @@ Může to být například jazykové rozšíření "_cs".</translation <context> <name>QtTreePropertyBrowser</name> <message> - <location filename="../tools/shared/qtpropertybrowser/qttreepropertybrowser.cpp" line="+442"/> <source>Property</source> <translation>Vlastnost</translation> </message> <message> - <location line="+1"/> <source>Value</source> <translation>Hodnota</translation> </message> @@ -3715,64 +3070,52 @@ Může to být například jazykové rozšíření "_cs".</translation <context> <name>SaveFormAsTemplate</name> <message> - <location filename="../tools/designer/src/designer/saveformastemplate.cpp" line="+72"/> <source>Add path...</source> <translation>Přidat cestu...</translation> </message> <message> - <location line="+23"/> <source>Template Exists</source> <translation>Předloha již existuje</translation> </message> <message> - <location line="+1"/> <source>A template with the name %1 already exists. Do you want overwrite the template?</source> <translation>Již existuje předloha s názvem %1. Chcete tuto předlohu přepsat?</translation> </message> <message> - <location line="+3"/> <source>Overwrite Template</source> <translation>Přepsat předlohu</translation> </message> <message> - <location line="+7"/> <source>Open Error</source> <translation>Chyba při otevírání</translation> </message> <message> - <location line="+1"/> <source>There was an error opening template %1 for writing. Reason: %2</source> <translation>Předlohu %1 se nepodařilo otevřít pro zápis. Důvod: %2</translation> </message> <message> - <location line="+13"/> <source>Write Error</source> <translation>Chyba při zápisu</translation> </message> <message> - <location line="+1"/> <source>There was an error writing the template %1 to disk. Reason: %2</source> <translation>Předlohu %1 se nepodařilo zapsat do souboru na disku. Důvod: %2</translation> </message> <message> - <location line="+27"/> <source>Pick a directory to save templates in</source> <translation>Vyberte adresář pro ukládání předloh</translation> </message> <message> - <location filename="../tools/designer/src/designer/saveformastemplate.ui"/> <source>Save Form As Template</source> <translation>Uložit formulář jako předlohu</translation> </message> <message> - <location/> <source>&Category:</source> <translation>&Skupina:</translation> </message> <message> - <location/> <source>&Name:</source> <translation>&Název:</translation> </message> @@ -3780,7 +3123,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>ScriptErrorDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/scripterrordialog.cpp" line="+59"/> <source>An error occurred while running the scripts for "%1": </source> <translation>Při provádění skriptu "%1" se vyskytly chyby: @@ -3790,22 +3132,18 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>SelectSignalDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/selectsignaldialog.ui"/> <source>Go to slot</source> <translation>Jít na zdířku</translation> </message> <message> - <location/> <source>Select signal</source> <translation>Vybrat signál</translation> </message> <message> - <location/> <source>signal</source> <translation>Signál</translation> </message> <message> - <location/> <source>class</source> <translation>Třída</translation> </message> @@ -3813,7 +3151,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>SignalSlotConnection</name> <message> - <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor.cpp" line="-358"/> <source>SENDER(%1), SIGNAL(%2), RECEIVER(%3), SLOT(%4)</source> <translation>VYSÍLAČ(%1), SIGNÁL(%2), PŘIJÍMAČ(%3), ZDÍŘKA(%4)</translation> </message> @@ -3821,32 +3158,26 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>SignalSlotDialogClass</name> <message> - <location filename="../tools/designer/src/lib/shared/signalslotdialog.ui"/> <source>Signals and slots</source> <translation>Signály a zdířky</translation> </message> <message> - <location/> <source>Slots</source> <translation>Zdířky</translation> </message> <message> - <location/> <source>...</source> <translation>...</translation> </message> <message> - <location/> <source>Signals</source> <translation>Signály</translation> </message> <message> - <location/> <source>Add</source> <translation>Přidat</translation> </message> <message> - <location/> <source>Delete</source> <translation>Smazat</translation> </message> @@ -3854,12 +3185,10 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>Spacer</name> <message> - <location filename="../tools/designer/src/lib/shared/spacer_widget.cpp" line="+275"/> <source>Horizontal Spacer '%1', %2 x %3</source> <translation>Vodorovný vymezovač '%1', %2 x %3</translation> </message> <message> - <location line="+0"/> <source>Vertical Spacer '%1', %2 x %3</source> <translation>Svislý vymezovač '%1', %2 x %3</translation> </message> @@ -3867,7 +3196,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>TemplateOptionsPage</name> <message> - <location filename="../tools/designer/src/components/formeditor/templateoptionspage.cpp" line="+156"/> <source>Template Paths</source> <extracomment>Tab in preferences dialog</extracomment> <translation>Adresáře pro předlohy</translation> @@ -3876,32 +3204,42 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>ToolBarManager</name> <message> - <location filename="../tools/designer/src/designer/mainwindow.cpp" line="+89"/> <source>Configure Toolbars...</source> <translation>Nastavit nástrojové pruhy...</translation> </message> <message> - <location line="+15"/> <source>Window</source> <translation>Okno</translation> </message> <message> - <location line="+1"/> <source>Help</source> <translation>Nápověda</translation> </message> <message> - <location line="+7"/> <source>Style</source> <translation>Styl</translation> </message> <message> - <location line="+2"/> <source>Dock views</source> <translation>Kotvící okno</translation> </message> <message> - <location line="+6"/> + <source>File</source> + <translation>Soubor</translation> + </message> + <message> + <source>Edit</source> + <translation>Úpravy</translation> + </message> + <message> + <source>Tools</source> + <translation>Nástroje</translation> + </message> + <message> + <source>Form</source> + <translation>Formulář</translation> + </message> + <message> <source>Toolbars</source> <translation>Nástrojové pruhy</translation> </message> @@ -3909,30 +3247,68 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>VersionDialog</name> <message> - <location filename="../tools/designer/src/designer/versiondialog.cpp" line="+171"/> <source><h3>%1</h3><br/><br/>Version %2</source> <translation><h3>%1</h3><br/><br/>Verze %2</translation> </message> <message> - <location line="+1"/> <source>Qt Designer</source> <translation>Qt Designer</translation> </message> <message> - <location line="+1"/> <source><br/>Qt Designer is a graphical user interface designer for Qt applications.<br/></source> <translation><br/>Qt Designer je obrazový návrhář uživatelského rozhraní pro programy Qt.<br/></translation> </message> <message> - <location line="+2"/> - <source>%1<br/>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source> + <source>%1<br/>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</source> <translation>%1<br/>Autorské právo (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</translation> </message> + <message> + <source>%1<br/>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source> + <translation type="obsolete">%1<br/>Autorské právo (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</translation> + </message> +</context> +<context> + <name>VideoPlayerTaskMenu</name> + <message> + <source>Available Mime Types</source> + <translation>Dostupné mime typy</translation> + </message> + <message> + <source>Display supported mime types...</source> + <translation>Zobrazit podporované mime typy...</translation> + </message> + <message> + <source>Load...</source> + <translation>Nahrát...</translation> + </message> + <message> + <source>Play</source> + <translation>Přehrát</translation> + </message> + <message> + <source>Pause</source> + <translation>Pozastavit</translation> + </message> + <message> + <source>Stop</source> + <translation>Zastavit</translation> + </message> + <message> + <source>Choose Video Player Media Source</source> + <translation>Vybrat zdroje se soubory pro přehrávač videa</translation> + </message> + <message> + <source>An error has occurred in '%1': %2</source> + <translation>V '%1': %2 se vyskytla chyba</translation> + </message> + <message> + <source>Video Player Error</source> + <translation>Chyba v přehrávači videa</translation> + </message> </context> <context> <name>WidgetDataBase</name> <message> - <location filename="../tools/designer/src/lib/shared/widgetdatabase.cpp" line="+814"/> <source>The file contains a custom widget '%1' whose base class (%2) differs from the current entry in the widget database (%3). The widget database is left unchanged.</source> <translation>Soubor obsahuje uživatelsky stanovený prvek '%1', jehož základní třída (%2) se neshoduje se současným záznamem v databázi prvků (%3). databáze prvků se nemění.</translation> </message> @@ -3940,87 +3316,70 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ActionEditor</name> <message> - <location filename="../tools/designer/src/lib/shared/actioneditor.cpp" line="+139"/> <source>Actions</source> <translation>Činnosti</translation> </message> <message> - <location line="-16"/> <source>New...</source> <translation>Nový...</translation> </message> <message> - <location line="+7"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="+313"/> <source>New action</source> <translation>Nová činnost</translation> </message> <message> - <location line="+98"/> <source>Edit action</source> <translation>Upravit činnost</translation> </message> <message> - <location line="-417"/> <source>Edit...</source> <translation>Upravit...</translation> </message> <message> - <location line="+1"/> <source>Go to slot...</source> <translation>Jít na zdířku...</translation> </message> <message> - <location line="+1"/> <source>Copy</source> <translation>Kopírovat</translation> </message> <message> - <location line="+1"/> <source>Cut</source> <translation>Vyjmout</translation> </message> <message> - <location line="+1"/> <source>Paste</source> <translation>Vložit</translation> </message> <message> - <location line="+1"/> <source>Select all</source> <translation>Vybrat vše</translation> </message> <message> - <location line="+62"/> <source>Icon View</source> <translation>Pohled s ikonami</translation> </message> <message> - <location line="+6"/> <source>Detailed View</source> <translation>Podrobný pohled</translation> </message> <message> - <location line="+413"/> <source>Remove actions</source> <translation>Odstranit činnosti</translation> </message> <message> - <location line="+0"/> <source>Remove action '%1'</source> <translation>Odstranit činnost '%1'</translation> </message> <message> - <location line="+186"/> <source>Used In</source> <translation>Používaný v</translation> </message> <message> - <location line="-608"/> <source>Configure Action Editor</source> <translation>Nastavit editor činností</translation> </message> @@ -4028,32 +3387,26 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ActionModel</name> <message> - <location filename="../tools/designer/src/lib/shared/actionrepository.cpp" line="+95"/> <source>Name</source> <translation>Název</translation> </message> <message> - <location line="+1"/> <source>Used</source> <translation>Používaný</translation> </message> <message> - <location line="+1"/> <source>Text</source> <translation>Text</translation> </message> <message> - <location line="+1"/> <source>Shortcut</source> <translation>Klávesová zkratka</translation> </message> <message> - <location line="+1"/> <source>Checkable</source> <translation>Zaškrtnutelná</translation> </message> <message> - <location line="+1"/> <source>ToolTip</source> <translation>Rada k nástroji</translation> </message> @@ -4061,27 +3414,22 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::BrushManagerProxy</name> <message> - <location filename="../tools/designer/src/components/formeditor/brushmanagerproxy.cpp" line="+219"/> <source>The element '%1' is missing the required attribute '%2'.</source> <translation>U prvku '%1' chybí vyžadovaná vlastnost '%2'..</translation> </message> <message> - <location line="+11"/> <source>Empty brush name encountered.</source> <translation>Chybějící název u vymezení štětce.</translation> </message> <message> - <location line="+10"/> <source>An unexpected element '%1' was encountered.</source> <translation>Byl zjištěn neplatný prvek '%1'.</translation> </message> <message> - <location line="+7"/> <source>An error occurred when reading the brush definition file '%1' at line line %2, column %3: %4</source> <translation>Chyba při čtení souboru s vymezením štětce '%1' na řádku %2, sloupec %3: %4</translation> </message> <message> - <location line="+43"/> <source>An error occurred when reading the resource file '%1' at line %2, column %3: %4</source> <translation>Chyba při čtení zdrojového souboru '%1' na řádku %2, sloupec %3: %4</translation> </message> @@ -4089,17 +3437,14 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::BuddyEditor</name> <message> - <location filename="../tools/designer/src/components/buddyeditor/buddyeditor.cpp" line="+261"/> <source>Add buddy</source> <translation>Přidat kamaráda</translation> </message> <message> - <location line="+52"/> <source>Remove buddies</source> <translation>Odstranit kamarády</translation> </message> <message numerus="yes"> - <location line="+24"/> <source>Remove %n buddies</source> <translation> <numerusform>Odstranit jednoho kamaráda</numerusform> @@ -4108,7 +3453,6 @@ Chcete tuto předlohu přepsat?</translation> </translation> </message> <message numerus="yes"> - <location line="+51"/> <source>Add %n buddies</source> <translation> <numerusform>Přidat jednoho kamaráda</numerusform> @@ -4117,7 +3461,6 @@ Chcete tuto předlohu přepsat?</translation> </translation> </message> <message> - <location line="+47"/> <source>Set automatically</source> <translation>Nastavit automaticky</translation> </message> @@ -4125,7 +3468,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::BuddyEditorPlugin</name> <message> - <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_plugin.cpp" line="+73"/> <source>Edit Buddies</source> <translation>Upravit kamarády</translation> </message> @@ -4133,7 +3475,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::BuddyEditorTool</name> <message> - <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_tool.cpp" line="+56"/> <source>Edit Buddies</source> <translation>Upravit kamarády</translation> </message> @@ -4141,12 +3482,10 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ButtonGroupMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+7"/> <source>Select members</source> <translation>Vybrat členy</translation> </message> <message> - <location line="+1"/> <source>Break</source> <translation>Zrušit</translation> </message> @@ -4154,32 +3493,26 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ButtonTaskMenu</name> <message> - <location line="+121"/> <source>Assign to button group</source> <translation>Přiřadit ke skupině tlačítek</translation> </message> <message> - <location line="+2"/> <source>Button group</source> <translation>Skupina tlačítek</translation> </message> <message> - <location line="+1"/> <source>New button group</source> <translation>Nová skupina tlačítek</translation> </message> <message> - <location line="+1"/> <source>Change text...</source> <translation>Změnit text...</translation> </message> <message> - <location line="+1"/> <source>None</source> <translation>Žádný</translation> </message> <message> - <location line="+101"/> <source>Button group '%1'</source> <translation>Skupina tlačítek '%1'</translation> </message> @@ -4187,57 +3520,46 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::CodeDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/codedialog.cpp" line="+95"/> <source>Save...</source> <translation>Uložit...</translation> </message> <message> - <location line="+4"/> <source>Copy All</source> <translation>Kopírovat vše</translation> </message> <message> - <location line="+5"/> <source>&Find in Text...</source> <translation>&Najít v textu...</translation> </message> <message> - <location line="+75"/> <source>A temporary form file could not be created in %1.</source> <translation>V adresáři %1 se nepodařilo vytvořit dočasný soubor s formulářem.</translation> </message> <message> - <location line="+6"/> <source>The temporary form file %1 could not be written.</source> <translation>Dočasný soubor s formulářem %1 se nepodařilo zapsat.</translation> </message> <message> - <location line="+21"/> <source>%1 - [Code]</source> <translation>%1 - [Kód]</translation> </message> <message> - <location line="+23"/> <source>Save Code</source> <translation>Uložit kód</translation> </message> <message> - <location line="+0"/> <source>Header Files (*.%1)</source> <translation>Hlavičkové soubory (*.%1)</translation> </message> <message> - <location line="+6"/> <source>The file %1 could not be opened: %2</source> <translation>Soubor %1 se nepodařilo otevřít: %2</translation> </message> <message> - <location line="+5"/> <source>The file %1 could not be written: %2</source> <translation>Soubor %1 se nepodařilo zapsat: %2</translation> </message> <message> - <location line="+11"/> <source>%1 - Error</source> <translation>%1 - Chyba</translation> </message> @@ -4245,7 +3567,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ColorAction</name> <message> - <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="+246"/> <source>Text Color</source> <translation>Barva textu</translation> </message> @@ -4253,12 +3574,10 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ComboBoxTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/combobox_taskmenu.cpp" line="+68"/> <source>Edit Items...</source> <translation>Upravit záznamy...</translation> </message> <message> - <location line="+38"/> <source>Change Combobox Contents</source> <translation>Změnit obsah skupinové krabice</translation> </message> @@ -4266,7 +3585,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::CommandLinkButtonTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+156"/> <source>Change description...</source> <translation>Změnit popis...</translation> </message> @@ -4274,17 +3592,14 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ConnectionEdit</name> <message> - <location filename="../tools/designer/src/lib/shared/connectionedit.cpp" line="+1313"/> <source>Select All</source> <translation>Vybrat vše</translation> </message> <message> - <location line="+8"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="-5"/> <source>Deselect All</source> <translation>Zrušit výběr všeho</translation> </message> @@ -4292,52 +3607,42 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ConnectionModel</name> <message> - <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp" line="-465"/> <source>Sender</source> <translation>Vysílač</translation> </message> <message> - <location line="+1"/> <source>Signal</source> <translation>Signál</translation> </message> <message> - <location line="+1"/> <source>Receiver</source> <translation>Přijímač</translation> </message> <message> - <location line="+1"/> <source>Slot</source> <translation>Zdířka</translation> </message> <message> - <location line="+90"/> <source><sender></source> <translation><Vysílač></translation> </message> <message> - <location line="+1"/> <source><signal></source> <translation><Signál></translation> </message> <message> - <location line="+1"/> <source><receiver></source> <translation><Přijímač></translation> </message> <message> - <location line="+1"/> <source><slot></source> <translation><Zdířka></translation> </message> <message> - <location line="+110"/> <source>Signal and Slot Editor</source> <translation>Editor signálů a zdířek</translation> </message> <message> - <location line="-2"/> <source>The connection already exists!<br>%1</source> <translation>Toto spojení již existuje!<br>%1</br></translation> </message> @@ -4345,42 +3650,34 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ContainerWidgetTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="+107"/> <source>Insert Page Before Current Page</source> <translation>Vložit stranu před nynější stranu</translation> </message> <message> - <location line="+4"/> <source>Insert Page After Current Page</source> <translation>Vložit stranu po nynější straně</translation> </message> <message> - <location line="+8"/> <source>Add Subwindow</source> <translation>Přidat podokno</translation> </message> <message> - <location line="-40"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="+25"/> <source>Insert</source> <translation>Vložit</translation> </message> <message> - <location line="+53"/> <source>Subwindow</source> <translation>Podokno</translation> </message> <message> - <location line="+2"/> <source>Page</source> <translation>Strana</translation> </message> <message> - <location line="+1"/> <source>Page %1 of %2</source> <translation>Strana %1 z %2</translation> </message> @@ -4388,19 +3685,16 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::DPI_Chooser</name> <message> - <location filename="../tools/designer/src/components/formeditor/dpi_chooser.cpp" line="+52"/> <source> x </source> <extracomment>DPI X/Y separator</extracomment> <translation> x </translation> </message> <message> - <location line="-25"/> <source>System (%1 x %2)</source> <extracomment>System resolution</extracomment> <translation>Systémové rozlišení (%1 x %2)</translation> </message> <message> - <location line="+7"/> <source>User defined</source> <translation>Stanoveno uživatelem</translation> </message> @@ -4408,49 +3702,38 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::DesignerPropertyManager</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="+647"/> - <location line="+6"/> <source>AlignLeft</source> <translation>Zarovnat k levému okraji</translation> </message> <message> - <location line="-5"/> <source>AlignHCenter</source> <translation>Zarovnat vodorovně na střed</translation> </message> <message> - <location line="+1"/> <source>AlignRight</source> <translation>Zarovnat k pravému okraji</translation> </message> <message> - <location line="+1"/> <source>AlignJustify</source> <translation>Zarovnat do bloku</translation> </message> <message> - <location line="+9"/> <source>AlignTop</source> <translation>Zarovnat k hornímu okraji</translation> </message> <message> - <location line="+1"/> - <location line="+4"/> <source>AlignVCenter</source> <translation>Zarovnat svisle na střed</translation> </message> <message> - <location line="-3"/> <source>AlignBottom</source> <translation>Zarovnat k dolnímu okraji</translation> </message> <message> - <location line="+565"/> <source>%1, %2</source> <translation>%1, %2</translation> </message> <message numerus="yes"> - <location line="+6"/> <source>Customized (%n roles)</source> <translation> <numerusform>Přizpůsobeno (role)</numerusform> @@ -4459,75 +3742,58 @@ Chcete tuto předlohu přepsat?</translation> </translation> </message> <message> - <location line="+1"/> <source>Inherited</source> <translation>Zděděno</translation> </message> <message> - <location line="+566"/> <source>Horizontal</source> <translation>Vodorovný</translation> </message> <message> - <location line="+9"/> <source>Vertical</source> <translation>Svislý</translation> </message> <message> - <location line="+15"/> <source>Normal Off</source> <translation>Obvyklé, vypnuto</translation> </message> <message> - <location line="+1"/> <source>Normal On</source> <translation>Obvyklé, zapnuto</translation> </message> <message> - <location line="+1"/> <source>Disabled Off</source> <translation>Zakázáno, vypnuto</translation> </message> <message> - <location line="+1"/> <source>Disabled On</source> <translation>Zakázáno, zapnuto</translation> </message> <message> - <location line="+1"/> <source>Active Off</source> <translation>V činnosti, vypnuto</translation> </message> <message> - <location line="+1"/> <source>Active On</source> <translation>V činnosti, zapnuto</translation> </message> <message> - <location line="+1"/> <source>Selected Off</source> <translation>Vybráno, vypnuto</translation> </message> <message> - <location line="+1"/> <source>Selected On</source> <translation>Vybráno, zapnuto</translation> </message> <message> - <location line="+7"/> - <location line="+21"/> <source>translatable</source> <translation>Překlad</translation> </message> <message> - <location line="-15"/> - <location line="+21"/> <source>disambiguation</source> <translation>Zabránění dvojznačnosti</translation> </message> <message> - <location line="-15"/> - <location line="+21"/> <source>comment</source> <translation>Poznámka</translation> </message> @@ -4535,48 +3801,38 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::DeviceProfileDialog</name> <message> - <location filename="../tools/designer/src/components/formeditor/deviceprofiledialog.cpp" line="+63"/> <source>Device Profiles (*.%1)</source> <translation>Profily zařízení (*.%1)</translation> </message> <message> - <location line="+31"/> <source>Default</source> <translation>Výchozí</translation> </message> <message> - <location line="+67"/> <source>Save Profile</source> <translation>Uložit profil</translation> </message> <message> - <location line="+10"/> <source>Save Profile - Error</source> <translation>Chyba při ukládání profilu</translation> </message> <message> - <location line="+0"/> <source>Unable to open the file '%1' for writing: %2</source> <translation>Soubor '%1' se nepodařilo otevřít pro zápis: %2</translation> </message> <message> - <location line="+14"/> <source>Unable to open the file '%1' for reading: %2</source> <translation>Soubor '%1' se nepodařilo otevřít pro čtení: %2</translation> </message> <message> - <location line="+6"/> <source>'%1' is not a valid profile: %2</source> <translation>'%1' není platným profilem: %2</translation> </message> <message> - <location line="-12"/> <source>Open profile</source> <translation>Otevřít profil</translation> </message> <message> - <location line="+6"/> - <location line="+6"/> <source>Open Profile - Error</source> <translation>Chyba při otevírání profilu</translation> </message> @@ -4584,57 +3840,46 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::Dialog</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/stringlisteditor.ui"/> <source>Dialog</source> <translation>Dialog</translation> </message> <message> - <location/> <source>StringList</source> <translation>Seznam řetězců znaků</translation> </message> <message> - <location/> <source>New String</source> <translation>Nový řetězec znaků</translation> </message> <message> - <location/> <source>&New</source> <translation>&Nový</translation> </message> <message> - <location/> <source>Delete String</source> <translation>Smazat řetězec znaků</translation> </message> <message> - <location/> <source>&Delete</source> <translation>&Smazat</translation> </message> <message> - <location/> <source>&Value:</source> <translation>&Hodnota:</translation> </message> <message> - <location/> <source>Move String Up</source> <translation>Posunout řetězec znaků nahoru</translation> </message> <message> - <location/> <source>Up</source> <translation>Nahoru</translation> </message> <message> - <location/> <source>Move String Down</source> <translation>Posunout řetězec znaků dolů</translation> </message> <message> - <location/> <source>Down</source> <translation>Dolů</translation> </message> @@ -4642,52 +3887,42 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::EmbeddedOptionsControl</name> <message> - <location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="-260"/> <source>None</source> <translation>Žádný</translation> </message> <message> - <location line="+4"/> <source>Add a profile</source> <translation>Přidat profil</translation> </message> <message> - <location line="+6"/> <source>Edit the selected profile</source> <translation>Upravit vybraný profil</translation> </message> <message> - <location line="+4"/> <source>Delete the selected profile</source> <translation>Smazat vybraný profil</translation> </message> <message> - <location line="+22"/> <source>Add Profile</source> <translation>Přidat profil</translation> </message> <message> - <location line="+7"/> <source>New profile</source> <translation>Nový profil</translation> </message> <message> - <location line="+35"/> <source>Edit Profile</source> <translation>Upravit profil</translation> </message> <message> - <location line="+26"/> <source>Delete Profile</source> <translation>Smazat profil</translation> </message> <message> - <location line="+1"/> <source>Would you like to delete the profile '%1'?</source> <translation>Chcete smazat profil '%1'?</translation> </message> <message> - <location line="+55"/> <source>Default</source> <translation>Výchozí</translation> </message> @@ -4695,20 +3930,25 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::FilterWidget</name> <message> - <location filename="../tools/designer/src/lib/shared/filterwidget.cpp" line="+185"/> <source><Filter></source> - <translation><FIltr></translation> + <translation type="obsolete"><FIltr></translation> + </message> + <message> + <source>Filter</source> + <translation>Filtr</translation> + </message> + <message> + <source>Clear text</source> + <translation>Smazat text</translation> </message> </context> <context> <name>qdesigner_internal::FormEditor</name> <message> - <location filename="../tools/designer/src/components/formeditor/formeditor.cpp" line="+190"/> <source>Resource File Changed</source> <translation>Zdrojový soubor byl změněn</translation> </message> <message> - <location line="+1"/> <source>The file "%1" has changed outside Designer. Do you want to reload it?</source> <translation>Zdrojový soubor "%1" byl změněn mimo program Designer. Chcete jej znovu nahrát?</translation> </message> @@ -4716,7 +3956,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::FormLayoutMenu</name> <message> - <location filename="../tools/designer/src/lib/shared/formlayoutmenu.cpp" line="+24"/> <source>Add form layout row...</source> <translation>Přidat řádek s rozvržením formuláře...</translation> </message> @@ -4724,44 +3963,34 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::FormWindow</name> <message> - <location filename="../tools/designer/src/components/formeditor/formwindow.cpp" line="-1267"/> <source>Edit contents</source> <translation>Upravit obsah</translation> </message> <message> - <location line="+1"/> <source>F2</source> <translation>F2</translation> </message> <message> - <location line="+841"/> <source>Resize</source> <translation>Změnit velikost</translation> </message> <message> - <location line="+218"/> - <location line="+15"/> <source>Key Move</source> <translation>Posunout s pomocí klávesnice</translation> </message> <message> - <location line="+276"/> <source>Paste error</source> <translation>Chyba při vložení</translation> </message> <message> - <location line="+445"/> <source>Lay out</source> <translation>Rozvržení</translation> </message> <message> - <location line="+493"/> - <location line="+55"/> <source>Drop widget</source> <translation>Vložit prvek</translation> </message> <message numerus="yes"> - <location line="-1058"/> <source>Paste %n action(s)</source> <translation> <numerusform>Vložit jednu činnost</numerusform> @@ -4770,12 +3999,14 @@ Chcete tuto předlohu přepsat?</translation> </translation> </message> <message> - <location line="-511"/> <source>Insert widget '%1'</source> <translation>Vložit prvek '%1'</translation> </message> + <message> + <source>Key Resize</source> + <translation>Změnit velikost pomocí klávesnice</translation> + </message> <message numerus="yes"> - <location line="+513"/> <source>Paste %n widget(s)</source> <translation> <numerusform>Vložit jeden prvek</numerusform> @@ -4784,37 +4015,30 @@ Chcete tuto předlohu přepsat?</translation> </translation> </message> <message> - <location line="+1"/> <source>Paste (%1 widgets, %2 actions)</source> <translation>Vložit (%1 prvky, %2 činnosti)</translation> </message> <message> - <location line="+56"/> <source>Cannot paste widgets. Designer could not find a container without a layout to paste into.</source> <translation>Prvky nelze vložit, protože se nepodařilo nalézt kontejner, který již nemá rozvržení.</translation> </message> <message> - <location line="+2"/> <source>Break the layout of the container you want to paste into, select this container and then paste again.</source> <translation>Zrušte, prosím, rozvržení kontejneru, do kterého chcete vkládat. Vyberte jej znovu a proveďte vložení znovu.</translation> </message> <message> - <location line="+408"/> <source>Select Ancestor</source> <translation>Vybrat nadřazený prvek</translation> </message> <message> - <location line="+576"/> <source>A QMainWindow-based form does not contain a central widget.</source> <translation>Formulář založený na QMainWindow neobsahuje ústřední prvek.</translation> </message> <message> - <location line="-797"/> <source>Raise widgets</source> <translation>Přenést prvky do popředí</translation> </message> <message> - <location line="+17"/> <source>Lower widgets</source> <translation>Přenést prvky do pozadí</translation> </message> @@ -4822,12 +4046,10 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::FormWindowBase</name> <message> - <location filename="../tools/designer/src/lib/shared/formwindowbase.cpp" line="+393"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="+0"/> <source>Delete '%1'</source> <translation>Smazat '%1'</translation> </message> @@ -4835,200 +4057,159 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::FormWindowManager</name> <message> - <location filename="../tools/designer/src/components/formeditor/formwindowmanager.cpp" line="+364"/> <source>Cu&t</source> <translation>Vyj&mout</translation> </message> <message> - <location line="+3"/> <source>Cuts the selected widgets and puts them on the clipboard</source> <translation>Vyjme vybrané prvky a odloží je do schránky</translation> </message> <message> - <location line="+5"/> <source>&Copy</source> <translation>&Kopírovat</translation> </message> <message> - <location line="+3"/> <source>Copies the selected widgets to the clipboard</source> <translation>Zkopíruje vybrané prvky do schránky</translation> </message> <message> - <location line="+5"/> <source>&Paste</source> <translation>&Vložit</translation> </message> <message> - <location line="+3"/> <source>Pastes the clipboard's contents</source> <translation>Vloží obsah schránky</translation> </message> <message> - <location line="+5"/> <source>&Delete</source> <translation>&Smazat</translation> </message> <message> - <location line="+2"/> <source>Deletes the selected widgets</source> <translation>Smaže vybrané prvky</translation> </message> <message> - <location line="+5"/> <source>Select &All</source> <translation>Vybrat &vše</translation> </message> <message> - <location line="+3"/> <source>Selects all widgets</source> <translation>Vybere všechny prvky</translation> </message> <message> - <location line="+5"/> <source>Bring to &Front</source> <translation>Přenést do &popředí</translation> </message> <message> - <location line="+3"/> - <location line="+1"/> <source>Raises the selected widgets</source> <translation>Přenese vybrané prvky do popředí</translation> </message> <message> - <location line="+4"/> <source>Send to &Back</source> <translation>Přenést do po&zadí</translation> </message> <message> - <location line="+3"/> - <location line="+1"/> <source>Lowers the selected widgets</source> <translation>Přenese vybrané prvky do pozadí</translation> </message> <message> - <location line="+4"/> <source>Adjust &Size</source> <translation>Přizpůsobit &velikost</translation> </message> <message> - <location line="+3"/> <source>Adjusts the size of the selected widget</source> <translation>Spočítá velikost vybraného prvku z rozvržení a přizpůsobí velikost prvku</translation> </message> <message> - <location line="+6"/> <source>Lay Out &Horizontally</source> <translation>Uspořádat předměty &vodorovně</translation> </message> <message> - <location line="+3"/> <source>Lays out the selected widgets horizontally</source> <translation>Uspořádá vybrané předměty vodorovně</translation> </message> <message> - <location line="+6"/> <source>Lay Out &Vertically</source> <translation>Uspořádat předměty &svisle</translation> </message> <message> - <location line="+3"/> <source>Lays out the selected widgets vertically</source> <translation>Uspořádá vybrané předměty svisle</translation> </message> <message> - <location line="+17"/> <source>Lay Out in a &Grid</source> <translation>Uspořádat předměty &tabulkově</translation> </message> <message> - <location line="+3"/> <source>Lays out the selected widgets in a grid</source> <translation>Uspořádá vybrané předměty tabulkově</translation> </message> <message> - <location line="+7"/> <source>Lay Out Horizontally in S&plitter</source> <translation>Uspořádat předměty vodorovně okolo &dělící příčky</translation> </message> <message> - <location line="+3"/> <source>Lays out the selected widgets horizontally in a splitter</source> <translation>Uspořádá vybrané předměty vodorovně okolo dělící příčky</translation> </message> <message> - <location line="+7"/> <source>Lay Out Vertically in Sp&litter</source> <translation>Uspořádat předměty svisle okolo dě&lící příčky</translation> </message> <message> - <location line="+3"/> <source>Lays out the selected widgets vertically in a splitter</source> <translation>Uspořádá vybrané předměty svisle okolo dělící příčky</translation> </message> <message> - <location line="+7"/> <source>&Break Layout</source> <translation>&Zrušit rozvržení</translation> </message> <message> - <location line="+3"/> <source>Breaks the selected layout</source> <translation>Zruší vybrané rozvržení</translation> </message> <message> - <location line="+13"/> <source>&Preview...</source> <translation>&Náhled...</translation> </message> <message> - <location line="+2"/> <source>Preview current form</source> <translation>Náhled nynějšího formuláře</translation> </message> <message> - <location line="+15"/> <source>Form &Settings...</source> <translation>&Nastavení formuláře...</translation> </message> <message> - <location line="+92"/> <source>Break Layout</source> <translation>Zrušit rozvržení</translation> </message> <message> - <location line="+26"/> <source>Adjust Size</source> <translation>Přizpůsobit velikost</translation> </message> <message> - <location line="+43"/> <source>Could not create form preview</source> <comment>Title of warning message box</comment> <translation>Nepodařilo se vytvořit náhled formuláře</translation> </message> <message> - <location line="+341"/> <source>Form Settings - %1</source> <translation>Nastavení formuláře - %1</translation> </message> <message> - <location line="-525"/> <source>Removes empty columns and rows</source> <translation>Odstraní prázdné řádky a sloupce</translation> </message> <message> - <location line="-50"/> <source>Lay Out in a &Form Layout</source> <translation>Uspořádat předměty v &rozvržení formuláře</translation> </message> <message> - <location line="+3"/> <source>Lays out the selected widgets in a form layout</source> <translation>Uspořádá vybrané předměty v dvousloupcovém rozvržení formuláře</translation> </message> <message> - <location line="+45"/> <source>Si&mplify Grid Layout</source> <translation>Z&jednodušit tabulkové rozvržení</translation> </message> @@ -5036,12 +4217,10 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::FormWindowSettings</name> <message> - <location filename="../tools/designer/src/components/formeditor/formwindowsettings.cpp" line="+193"/> <source>None</source> <translation>Žádný</translation> </message> <message> - <location line="+1"/> <source>Device Profile: %1</source> <translation>Profil zařízení: %1</translation> </message> @@ -5049,37 +4228,30 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::GridPanel</name> <message> - <location filename="../tools/designer/src/lib/shared/gridpanel.ui"/> <source>Visible</source> <translation>Viditelný</translation> </message> <message> - <location/> <source>Snap</source> <translation>Zapadnout</translation> </message> <message> - <location/> <source>Reset</source> <translation>Nastavit znovu</translation> </message> <message> - <location/> <source>Form</source> <translation>Formulář</translation> </message> <message> - <location/> <source>Grid</source> <translation>Mřížka</translation> </message> <message> - <location/> <source>Grid &X</source> <translation>Mřížka &x</translation> </message> <message> - <location/> <source>Grid &Y</source> <translation>Mřížka &y</translation> </message> @@ -5087,7 +4259,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::GroupBoxTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/groupbox_taskmenu.cpp" line="+82"/> <source>Change title...</source> <translation>Změnit název...</translation> </message> @@ -5095,7 +4266,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::HtmlTextEdit</name> <message> - <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="-58"/> <source>Insert HTML entity</source> <translation>Vložit HTML znak</translation> </message> @@ -5103,92 +4273,74 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::IconSelector</name> <message> - <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-24"/> <source>The pixmap file '%1' cannot be read.</source> <translation>Soubor s pixmapou '%1' nelze přečíst.</translation> </message> <message> - <location line="+6"/> <source>The file '%1' does not appear to be a valid pixmap file: %2</source> <translation>Soubor '%1' není platným souborem s pixmapou: %2</translation> </message> <message> - <location line="+9"/> <source>The file '%1' could not be read: %2</source> <translation>Soubor %1 se nepodařilo přečít: %2</translation> </message> <message> - <location line="+40"/> <source>Pixmap Read Error</source> <translation>Chyba při čtení pixmapy</translation> </message> <message> - <location line="+54"/> <source>...</source> <translation>...</translation> </message> <message> - <location line="+6"/> <source>Normal Off</source> <translation>Obvyklé, vypnuto</translation> </message> <message> - <location line="+1"/> <source>Normal On</source> <translation>Obvyklé, zapnuto</translation> </message> <message> - <location line="+1"/> <source>Disabled Off</source> <translation>Zakázáno, vypnuto</translation> </message> <message> - <location line="+1"/> <source>Disabled On</source> <translation>Zakázáno, zapnuto</translation> </message> <message> - <location line="+1"/> <source>Active Off</source> <translation>V činnosti, vypnuto</translation> </message> <message> - <location line="+1"/> <source>Active On</source> <translation>V činnosti, zapnuto</translation> </message> <message> - <location line="+1"/> <source>Selected Off</source> <translation>Vybráno, vypnuto</translation> </message> <message> - <location line="+1"/> <source>Selected On</source> <translation>Vybráno, zapnuto</translation> </message> <message> - <location line="+8"/> <source>Choose Resource...</source> <translation>Vybrat zdroj...</translation> </message> <message> - <location line="+1"/> <source>Choose File...</source> <translation>Vybrat soubor...</translation> </message> <message> - <location line="+1"/> <source>Reset</source> <translation>Nastavit znovu</translation> </message> <message> - <location line="+1"/> <source>Reset All</source> <translation>Nastavit znovu vše</translation> </message> <message> - <location line="-85"/> <source>Choose a Pixmap</source> <translation>Vybrat pixmapu</translation> </message> @@ -5196,58 +4348,46 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ItemListEditor</name> <message> - <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+358"/> <source>Properties &<<</source> <translation>Vlastnosti &<<</translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.ui"/> - <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+2"/> <source>Properties &>></source> <translation>Vlastnosti &>></translation> </message> <message> - <location/> <source>Items List</source> <translation>Seznam prvků</translation> </message> <message> - <location/> <source>New Item</source> <translation>Nový prvek</translation> </message> <message> - <location/> <source>&New</source> <translation>&Nový</translation> </message> <message> - <location/> <source>Delete Item</source> <translation>Smazat prvek</translation> </message> <message> - <location/> <source>&Delete</source> <translation>&Smazat</translation> </message> <message> - <location/> <source>Move Item Up</source> <translation>Posunout prvek nahoru</translation> </message> <message> - <location/> <source>U</source> <translation>U</translation> </message> <message> - <location/> <source>Move Item Down</source> <translation>Posunout prvek dolů</translation> </message> <message> - <location/> <source>D</source> <translation>D</translation> </message> @@ -5255,12 +4395,10 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::LabelTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/label_taskmenu.cpp" line="+85"/> <source>Change rich text...</source> <translation>Změnit upravovatelný text...</translation> </message> <message> - <location line="+1"/> <source>Change plain text...</source> <translation>Změnit prostý text...</translation> </message> @@ -5268,7 +4406,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::LanguageResourceDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-258"/> <source>Choose Resource</source> <translation>Vybrat zdroj</translation> </message> @@ -5276,7 +4413,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::LineEditTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/lineedit_taskmenu.cpp" line="+80"/> <source>Change text...</source> <translation>Změnit text...</translation> </message> @@ -5284,17 +4420,14 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ListWidgetEditor</name> <message> - <location filename="../tools/designer/src/components/taskmenu/listwidgeteditor.cpp" line="+101"/> <source>Edit List Widget</source> <translation>Upravit seznam prvků</translation> </message> <message> - <location line="+19"/> <source>Edit Combobox</source> <translation>Upravit skupinovou krabici</translation> </message> <message> - <location line="-51"/> <source>New Item</source> <translation>Nový prvek</translation> </message> @@ -5302,12 +4435,10 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::ListWidgetTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/listwidget_taskmenu.cpp" line="+67"/> <source>Edit Items...</source> <translation>Upravit prvky...</translation> </message> <message> - <location line="+38"/> <source>Change List Contents</source> <translation>Změnit obsah seznamu</translation> </message> @@ -5315,22 +4446,18 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::MdiContainerWidgetTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="+118"/> <source>Next Subwindow</source> <translation>Další podokno</translation> </message> <message> - <location line="+1"/> <source>Previous Subwindow</source> <translation>Předchozí podokno</translation> </message> <message> - <location line="+1"/> <source>Tile</source> <translation>Uspořádat jedno vedle druhého</translation> </message> <message> - <location line="+1"/> <source>Cascade</source> <translation>Překrývat</translation> </message> @@ -5338,7 +4465,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::MenuTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/menutaskmenu.cpp" line="+56"/> <source>Remove</source> <translation>Odstranit</translation> </message> @@ -5346,7 +4472,6 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::MorphMenu</name> <message> - <location filename="../tools/designer/src/lib/shared/morphmenu.cpp" line="+264"/> <source>Morph into</source> <translation>Přeměnit prvek na</translation> </message> @@ -5354,42 +4479,34 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::NewActionDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/newactiondialog.ui"/> <source>New Action...</source> <translation>Nová činnost...</translation> </message> <message> - <location/> <source>&Text:</source> <translation>&Text:</translation> </message> <message> - <location/> <source>Shortcut:</source> <translation>Klávesová zkratka:</translation> </message> <message> - <location/> <source>Checkable:</source> <translation>Zaškrtnutelná:</translation> </message> <message> - <location/> <source>ToolTip:</source> <translation>Rada k nástroji:</translation> </message> <message> - <location/> <source>...</source> <translation>...</translation> </message> <message> - <location/> <source>&Icon:</source> <translation>&Ikona:</translation> </message> <message> - <location/> <source>Object &name:</source> <translation>&Název předmětu:</translation> </message> @@ -5397,41 +4514,34 @@ Chcete tuto předlohu přepsat?</translation> <context> <name>qdesigner_internal::NewDynamicPropertyDialog</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.cpp" line="+134"/> <source>Set Property Name</source> <translation>Nastavit název vlastnosti</translation> </message> <message> - <location line="+11"/> <source>The current object already has a property named '%1'. Please select another, unique one.</source> <translation>nynější předmět již má vlastnost s názvem '%1'. Zvolte, prosím, jiný, jedinečný název.</translation> </message> <message> - <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.ui"/> <source>Create Dynamic Property</source> <translation>Vytvořit dynamickou vlastnost</translation> </message> <message> - <location/> <source>Property Name</source> <translation>Název vlastnosti</translation> </message> <message> - <location/> <source>Property Type</source> <translation>typ vlastnosti</translation> </message> <message> - <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.cpp" line="+4"/> <source>The '_q_' prefix is reserved for the Qt library. Please select another name.</source> <translation>Předpona '_q_' je používána knihovnou Qt pro vnitřní účely. Zvolte, prosím, jiný název.</translation> </message> <message> - <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.ui"/> <source>horizontalSpacer</source> <translation>Vodorovný vymezovač</translation> </message> @@ -5439,83 +4549,67 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::NewFormWidget</name> <message> - <location filename="../tools/designer/src/lib/shared/newformwidget.cpp" line="+104"/> <source>Default size</source> <translation>Výchozí velikost</translation> </message> <message> - <location line="+1"/> <source>QVGA portrait (240x320)</source> <translation>QVGA formát na výšku (240x320)</translation> </message> <message> - <location line="+1"/> <source>QVGA landscape (320x240)</source> <translation>QVGA formát na šířku (320x240)</translation> </message> <message> - <location line="+1"/> <source>VGA portrait (480x640)</source> <translation>VGA formát na výšku (480x640)</translation> </message> <message> - <location line="+1"/> <source>VGA landscape (640x480)</source> <translation>VGA formát na šířku (640x480)</translation> </message> <message> - <location line="+66"/> <source>Widgets</source> <extracomment>New Form Dialog Categories</extracomment> <translation>Prvky</translation> </message> <message> - <location line="+1"/> <source>Custom Widgets</source> <translation>Uživatelsky stanovené prvky</translation> </message> <message> - <location line="+18"/> <source>None</source> <translation>Žádný</translation> </message> <message> - <location line="+57"/> <source>Error loading form</source> <translation>Formulář se nepodařilo nahrát</translation> </message> <message> - <location line="+244"/> <source>Unable to open the form template file '%1': %2</source> <translation>Nepodařilo se otevřít předlohu s formulářem '%1': %2</translation> </message> <message> - <location line="+67"/> <source>Internal error: No template selected.</source> <translation>Vnitřní chyba: Není vybrána žádná předloha.</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/newformwidget.ui"/> <source>0</source> <translation>0</translation> </message> <message> - <location/> <source>Choose a template for a preview</source> <translation>Vyberte předlohu pro náhled</translation> </message> <message> - <location/> <source>Embedded Design</source> <translation>Vložený návrh</translation> </message> <message> - <location/> <source>Device:</source> <translation>Zařízení:</translation> </message> <message> - <location/> <source>Screen Size:</source> <translation>Velikost obrazovky:</translation> </message> @@ -5523,37 +4617,30 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::NewPromotedClassPanel</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp" line="+92"/> <source>Add</source> <translation>Přidat</translation> </message> <message> - <location line="+2"/> <source>New Promoted Class</source> <translation>Nová uživatelsky stanovená třída</translation> </message> <message> - <location line="+15"/> <source>Base class name:</source> <translation>Název základní třídy:</translation> </message> <message> - <location line="+1"/> <source>Promoted class name:</source> <translation>Název uživatelsky stanovené třídy:</translation> </message> <message> - <location line="+1"/> <source>Header file:</source> <translation>Hlavičkový soubor:</translation> </message> <message> - <location line="+1"/> <source>Global include</source> <translation>Celkový hlavičkový soubor</translation> </message> <message> - <location line="+11"/> <source>Reset</source> <translation>Nastavit znovu</translation> </message> @@ -5561,12 +4648,10 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::ObjectInspector</name> <message> - <location filename="../tools/designer/src/components/objectinspector/objectinspector.cpp" line="+316"/> <source>Change Current Page</source> <translation>Změnit nynější stranu</translation> </message> <message> - <location line="+438"/> <source>&Find in Text...</source> <translation>&Najít v textu...</translation> </message> @@ -5581,32 +4666,26 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::OrderDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/orderdialog.cpp" line="+109"/> <source>Index %1 (%2)</source> <translation>Poloha %1 (%2)</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/orderdialog.ui"/> <source>Change Page Order</source> <translation>Změnit pořadí stran</translation> </message> <message> - <location/> <source>Page Order</source> <translation>Pořadí stran</translation> </message> <message> - <location/> <source>Move page up</source> <translation>Posunout stranu nahoru</translation> </message> <message> - <location/> <source>Move page down</source> <translation>Posunout stranu dolů</translation> </message> <message> - <location filename="../tools/designer/src/lib/shared/orderdialog.cpp" line="+3"/> <source>%1 %2</source> <translation>%1 %2</translation> </message> @@ -5614,47 +4693,38 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PaletteEditor</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/paletteeditor.ui"/> <source>Edit Palette</source> <translation>Upravit paletu</translation> </message> <message> - <location/> <source>Tune Palette</source> <translation>Vyladit paletu</translation> </message> <message> - <location/> <source>Show Details</source> <translation>Ukázat podrobnosti</translation> </message> <message> - <location/> <source>Compute Details</source> <translation>Spočítat podrobnosti</translation> </message> <message> - <location/> <source>Quick</source> <translation>Jednoduchý</translation> </message> <message> - <location/> <source>Preview</source> <translation>Náhled</translation> </message> <message> - <location/> <source>Disabled</source> <translation>Zakázáno</translation> </message> <message> - <location/> <source>Inactive</source> <translation>Nečinný</translation> </message> <message> - <location/> <source>Active</source> <translation>V činnosti</translation> </message> @@ -5662,7 +4732,6 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PaletteEditorButton</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/paletteeditorbutton.cpp" line="+57"/> <source>Change Palette</source> <translation>Změnit paletu</translation> </message> @@ -5670,22 +4739,18 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PaletteModel</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/paletteeditor.cpp" line="+374"/> <source>Color Role</source> <translation>Barevné kolo</translation> </message> <message> - <location line="+2"/> <source>Active</source> <translation>V činnosti</translation> </message> <message> - <location line="+2"/> <source>Inactive</source> <translation>Nečinný</translation> </message> <message> - <location line="+2"/> <source>Disabled</source> <translation>Zakázáno</translation> </message> @@ -5693,28 +4758,22 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PixmapEditor</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="-1539"/> <source>Copy Path</source> <translation>Kopírovat cestu</translation> </message> <message> - <location line="+1"/> <source>Paste Path</source> <translation>Vložit cestu</translation> </message> <message> - <location line="-3"/> <source>Choose Resource...</source> <translation>Vybrat zdroj...</translation> </message> <message> - <location line="+1"/> <source>Choose File...</source> <translation>Vybrat soubor...</translation> </message> <message> - <location line="+8"/> - <location line="+16"/> <source>...</source> <translation>...</translation> </message> @@ -5722,7 +4781,6 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PlainTextEditorDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/plaintexteditor.cpp" line="+65"/> <source>Edit text</source> <translation>Upravit text</translation> </message> @@ -5730,37 +4788,38 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PluginDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/plugindialog.cpp" line="+72"/> <source>Components</source> <translation>Součásti</translation> </message> <message> - <location line="+13"/> <source>Plugin Information</source> <translation>Informace o přídavných modulech</translation> </message> <message> - <location line="+4"/> <source>Refresh</source> <translation>Obnovit</translation> </message> <message> - <location line="+1"/> <source>Scan for newly installed custom widget plugins.</source> <translation>Prohledat kvůli nově nainstalovaným přídavným modulům s uživatelsky stanovenými prvky.</translation> </message> <message> - <location line="+48"/> + <source>Loaded Plugins</source> + <translation>Nahrané přídavné moduly</translation> + </message> + <message> + <source>Failed Plugins</source> + <translation>Přídavné moduly, které se nepodařilo nahrát</translation> + </message> + <message> <source>Qt Designer couldn't find any plugins</source> <translation>Programu Qt Designer se nepodařilo najít jakékoli přídavné moduly</translation> </message> <message> - <location line="+3"/> <source>Qt Designer found the following plugins</source> <translation>Programu Qt Designer se podařilo najít následující přídavné moduly</translation> </message> <message> - <location line="+55"/> <source>New custom widget plugins have been found.</source> <translation>Byly nalezeny nové přídavné moduly s uživatelsky stanovenými prvky.</translation> </message> @@ -5768,7 +4827,6 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PreviewActionGroup</name> <message> - <location filename="../tools/designer/src/components/formeditor/previewactiongroup.cpp" line="+95"/> <source>%1 Style</source> <translation>%1-Styl</translation> </message> @@ -5776,47 +4834,38 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PreviewConfigurationWidget</name> <message> - <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.cpp" line="+139"/> <source>Default</source> <translation>Výchozí</translation> </message> <message> - <location line="+22"/> <source>None</source> <translation>Žádný</translation> </message> <message> - <location line="+6"/> <source>Browse...</source> <translation>Procházet...</translation> </message> <message> - <location line="+118"/> <source>Load Custom Device Skin</source> <translation>Nahrát uživatelsky stanovený vzhled zařízení</translation> </message> <message> - <location line="+2"/> <source>All QVFB Skins (*.%1)</source> <translation>Všechny vzhledy QVFB (*.%1)</translation> </message> <message> - <location line="+16"/> <source>%1 - Duplicate Skin</source> <translation>%1 - Zdvojit vzhled</translation> </message> <message> - <location line="+1"/> <source>The skin '%1' already exists.</source> <translation>Vzhled '%1' již existuje.</translation> </message> <message> - <location line="+14"/> <source>%1 - Error</source> <translation>%1 - Chyba</translation> </message> <message> - <location line="+1"/> <source>%1 is not a valid skin directory: %2</source> <translation>%1 není platným adresářem pro vzhled: @@ -5855,24 +4904,20 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PreviewDeviceSkin</name> <message> - <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="+259"/> <source>&Portrait</source> <translation>Formát na &výšku</translation> </message> <message> - <location line="+2"/> <source>Landscape (&CCW)</source> <extracomment>Rotate form preview counter-clockwise</extracomment> <translation>Formát na šířku (&proti směru otáčení hodinových ručiček)</translation> </message> <message> - <location line="+2"/> <source>&Landscape (CW)</source> <extracomment>Rotate form preview clockwise</extracomment> <translation>Formát na šířku (po směru &otáčení hodinových ručiček)</translation> </message> <message> - <location line="+1"/> <source>&Close</source> <translation>&Zavřít</translation> </message> @@ -5880,7 +4925,6 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PreviewManager</name> <message> - <location line="+426"/> <source>%1 - [Preview]</source> <translation>%1 - [Náhled]</translation> </message> @@ -5888,7 +4932,6 @@ Zvolte, prosím, jiný název.</translation> <context> <name>qdesigner_internal::PreviewMdiArea</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/previewframe.cpp" line="+72"/> <source>The moose in the noose ate the goose who was loose.</source> <extracomment>Palette editor background</extracomment> @@ -5899,57 +4942,46 @@ která byla volně puštěná.</translation> <context> <name>qdesigner_internal::PreviewWidget</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/previewwidget.ui"/> <source>Preview Window</source> <translation>Náhledové okno</translation> </message> <message> - <location/> <source>LineEdit</source> <translation>Úprava čáry</translation> </message> <message> - <location/> <source>ComboBox</source> <translation>Skupinová krabice</translation> </message> <message> - <location/> <source>PushButton</source> <translation>Tlačítko na postrčení</translation> </message> <message> - <location/> <source>ButtonGroup2</source> <translation>Skupina tlačítek 2</translation> </message> <message> - <location/> <source>CheckBox1</source> <translation>Zaškrtnutelné políčko 1</translation> </message> <message> - <location/> <source>CheckBox2</source> <translation>Zaškrtnutelné políčko 2</translation> </message> <message> - <location/> <source>ButtonGroup</source> <translation>Skupina tlačítek</translation> </message> <message> - <location/> <source>RadioButton1</source> <translation>Rozhlasové tlačítko 1</translation> </message> <message> - <location/> <source>RadioButton2</source> <translation>Rozhlasové tlačítko 2</translation> </message> <message> - <location/> <source>RadioButton3</source> <translation>Rozhlasové tlačítko 3</translation> </message> @@ -5957,22 +4989,18 @@ která byla volně puštěná.</translation> <context> <name>qdesigner_internal::PromotionModel</name> <message> - <location filename="../tools/designer/src/lib/shared/promotionmodel.cpp" line="+17"/> <source>Name</source> <translation>Název</translation> </message> <message> - <location line="+1"/> <source>Header file</source> <translation>Hlavičkový soubor</translation> </message> <message> - <location line="+1"/> <source>Global include</source> <translation>Celkový hlavičkový soubor</translation> </message> <message> - <location line="+1"/> <source>Usage</source> <translation>Použití</translation> </message> @@ -5980,27 +5008,22 @@ která byla volně puštěná.</translation> <context> <name>qdesigner_internal::PromotionTaskMenu</name> <message> - <location filename="../tools/designer/src/lib/shared/promotiontaskmenu.cpp" line="+85"/> <source>Promoted widgets...</source> <translation>Uživatelsky stanovené prvky...</translation> </message> <message> - <location line="+1"/> <source>Promote to ...</source> <translation>Stanovit jako zástupný symbol pro uživatelsky stanovenou třídu...</translation> </message> <message> - <location line="+2"/> <source>Promote to</source> <translation>Stanovit jako zástupný symbol pro uživatelsky stanovenou třídu</translation> </message> <message> - <location line="+1"/> <source>Demote to %1</source> <translation>Odstranit zástupný symbol pro uživatelsky stanovenou třídu a přeměnit na %1</translation> </message> <message> - <location line="-2"/> <source>Change signals/slots...</source> <translation>Změnit signály/zdířky...</translation> </message> @@ -6008,59 +5031,48 @@ která byla volně puštěná.</translation> <context> <name>qdesigner_internal::PropertyEditor</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/propertyeditor.cpp" line="+183"/> <source>Add Dynamic Property...</source> <translation>Přidat dynamickou vlastnost...</translation> </message> <message> - <location line="+1"/> <source>Remove Dynamic Property</source> <translation>Odstranit dynamickou vlastnost</translation> </message> <message> - <location line="+3"/> <source>Tree View</source> <translation>Stromový pohled</translation> </message> <message> - <location line="+1"/> <source>Drop Down Button View</source> <translation>Podrobný pohled</translation> </message> <message> - <location line="+597"/> <source>Object: %1 Class: %2</source> <translation>Předmět: %1 Třída: %2</translation> </message> <message> - <location line="-600"/> <source>Sorting</source> <translation>Třídění</translation> </message> <message> - <location line="+1"/> <source>Color Groups</source> <translation>Barevné zdůraznění</translation> </message> <message> - <location line="+66"/> <source>Configure Property Editor</source> <translation>Nastavit editor vlastností</translation> </message> <message> - <location line="-14"/> <source>String...</source> <translation>Řetězec znaků...</translation> </message> <message> - <location line="+3"/> <source>Bool...</source> <translation>Booleánská hodnota...</translation> </message> <message> - <location line="+4"/> <source>Other...</source> <translation>Jiný typ...</translation> </message> @@ -6068,7 +5080,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::PropertyLineEdit</name> <message> - <location filename="../tools/designer/src/lib/shared/propertylineedit.cpp" line="+88"/> <source>Insert line break</source> <translation>Vložit zalomení řádku</translation> </message> @@ -6076,27 +5087,22 @@ Třída: %2</translation> <context> <name>qdesigner_internal::QDesignerPromotionDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp" line="+85"/> <source>Promoted Widgets</source> <translation>Zástupný symbol pro uživatelsky stanovené prvky</translation> </message> <message> - <location line="+7"/> <source>Promoted Classes</source> <translation>Zástupný symbol pro uživatelsky stanovené třídy</translation> </message> <message> - <location line="+60"/> <source>Promote</source> <translation>Používat</translation> </message> <message> - <location line="+169"/> <source>%1 - Error</source> <translation>%1 - Chyba</translation> </message> <message> - <location line="-17"/> <source>Change signals/slots...</source> <translation>Změnit signály/zdířky...</translation> </message> @@ -6104,22 +5110,18 @@ Třída: %2</translation> <context> <name>qdesigner_internal::QDesignerResource</name> <message> - <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+277"/> <source>Loading qrc file</source> <translation>Nahrává se zdrojový soubor</translation> </message> <message> - <location line="+1"/> <source>The specified qrc file <p><b>%1</b></p><p>could not be found. Do you want to update the file location?</p></source> <translation>Zadaný zdrojový soubor <p><b>%1</b></p><p> se nepodařilo najít. Chcete zadat novou cestu k umístění souboru?</p></translation> </message> <message> - <location line="+6"/> <source>New location for %1</source> <translation>Nové umístění %1</translation> </message> <message> - <location line="+1"/> <source>Resource files (*.qrc)</source> <translation>Zdrojové soubory (*.qrc)</translation> </message> @@ -6127,67 +5129,54 @@ Třída: %2</translation> <context> <name>qdesigner_internal::QDesignerTaskMenu</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_taskmenu.cpp" line="+68"/> <source>Change objectName...</source> <translation>Změnit název předmětu...</translation> </message> <message> - <location line="+1"/> <source>Change toolTip...</source> <translation>Změnit radu k nástroji...</translation> </message> <message> - <location line="+1"/> <source>Change whatsThis...</source> <translation>Změnit "A co je toto"...</translation> </message> <message> - <location line="+1"/> <source>Change styleSheet...</source> <translation>Změnit předlohový list...</translation> </message> <message> - <location line="+3"/> <source>Create Menu Bar</source> <translation>Vytvořit nabídkový pruh</translation> </message> <message> - <location line="+1"/> <source>Add Tool Bar</source> <translation>Přidat nástrojový pruh</translation> </message> <message> - <location line="+1"/> <source>Create Status Bar</source> <translation>Vytvořit stavový pruh</translation> </message> <message> - <location line="+1"/> <source>Remove Status Bar</source> <translation>Odstranit stavový pruh</translation> </message> <message> - <location line="+1"/> <source>Change script...</source> <translation>Změnit skript...</translation> </message> <message> - <location line="+1"/> <source>Change signals/slots...</source> <translation>Změnit signály/zdířky...</translation> </message> <message> - <location line="+1"/> <source>Go to slot...</source> <translation>Jít na zdířku...</translation> </message> <message> - <location line="+413"/> <source>no signals available</source> <translation>Nejsou dostupné žádné signály</translation> </message> <message numerus="yes"> - <location line="+67"/> <source>Set size constraint on %n widget(s)</source> <translation> <numerusform>Nastavit omezení velikosti u jednoho prvku</numerusform> @@ -6196,47 +5185,38 @@ Třída: %2</translation> </translation> </message> <message> - <location line="-477"/> <source>Size Constraints</source> <translation>Omezení velikosti</translation> </message> <message> - <location line="+4"/> <source>Set Minimum Width</source> <translation>Nastavit nejmenší šířku</translation> </message> <message> - <location line="+4"/> <source>Set Minimum Height</source> <translation>Nastavit nejmenší výšku</translation> </message> <message> - <location line="+4"/> <source>Set Minimum Size</source> <translation>Nastavit nejmenší velikost</translation> </message> <message> - <location line="+6"/> <source>Set Maximum Width</source> <translation>Nastavit největší šířku</translation> </message> <message> - <location line="+4"/> <source>Set Maximum Height</source> <translation>Nastavit největší výšku</translation> </message> <message> - <location line="+4"/> <source>Set Maximum Size</source> <translation>Nastavit největší velikost</translation> </message> <message> - <location line="+235"/> <source>Edit ToolTip</source> <translation>Upravit radu k nástroji</translation> </message> <message> - <location line="+5"/> <source>Edit WhatsThis</source> <translation>Upravit "A co je toto"</translation> </message> @@ -6244,42 +5224,34 @@ Třída: %2</translation> <context> <name>qdesigner_internal::QDesignerWidgetBox</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_widgetbox.cpp" line="+123"/> - <location line="+13"/> <source>Unexpected element <%1></source> <translation>Neplatný prvek <%1></translation> </message> <message> - <location line="+7"/> <source>A parse error occurred at line %1, column %2 of the XML code specified for the widget %3: %4 %5</source> <translation>Kód XML pro prvek %3 obsahuje chybu na řádku %1, sloupec %2:%4: %5</translation> </message> <message> - <location line="+9"/> <source>The XML code specified for the widget %1 does not contain any widget elements. %2</source> <translation>Kód XML pro prvek %1 neobsahuje prvky. %2</translation> </message> <message> - <location filename="../tools/designer/src/components/widgetbox/widgetboxtreewidget.cpp" line="+349"/> <source>An error has been encountered at line %1 of %2: %3</source> <translation>Chyba na řádku %1 z %2: %3</translation> </message> <message> - <location line="+139"/> <source>Unexpected element <%1> encountered when parsing for <widget> or <ui></source> <translation>Na místě očekávaného <prvek>- nebo prvku <ui> byl nalezen <%1></translation> </message> <message> - <location line="+19"/> <source>Unexpected end of file encountered when parsing widgets.</source> <translation>Při čtení nastavení krabice s prvky se vyskytl předčasný konec souboru.</translation> </message> <message> - <location line="+9"/> <source>A widget element could not be found.</source> <translation>Nepodařilo se najít prvek.</translation> </message> @@ -6287,73 +5259,58 @@ Třída: %2</translation> <context> <name>qdesigner_internal::QtGradientStopsController</name> <message> - <location filename="../tools/shared/qtgradienteditor/qtgradientstopscontroller.cpp" line="+173"/> <source>H</source> <translation>H</translation> </message> <message> - <location line="+1"/> <source>S</source> <translation>S</translation> </message> <message> - <location line="+1"/> <source>V</source> <translation>V</translation> </message> <message> - <location line="+6"/> - <location line="+4"/> <source>Hue</source> <translation>Barevný odstín</translation> </message> <message> - <location line="-3"/> <source>Sat</source> <translation>Sytost</translation> </message> <message> - <location line="+1"/> <source>Val</source> <translation>Hodnota</translation> </message> <message> - <location line="+3"/> <source>Saturation</source> <translation>Sytost</translation> </message> <message> - <location line="+1"/> <source>Value</source> <translation>Hodnota</translation> </message> <message> - <location line="+22"/> <source>R</source> <translation>R</translation> </message> <message> - <location line="+1"/> <source>G</source> <translation>G</translation> </message> <message> - <location line="+1"/> <source>B</source> <translation>B</translation> </message> <message> - <location line="+6"/> <source>Red</source> <translation>Červená</translation> </message> <message> - <location line="+1"/> <source>Green</source> <translation>Zelená</translation> </message> <message> - <location line="+1"/> <source>Blue</source> <translation>Modrá</translation> </message> @@ -6361,27 +5318,22 @@ Třída: %2</translation> <context> <name>qdesigner_internal::RichTextEditorDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="+436"/> <source>Edit text</source> <translation>Upravit text</translation> </message> <message> - <location line="+30"/> <source>&OK</source> <translation>&OK</translation> </message> <message> - <location line="+2"/> <source>&Cancel</source> <translation>&Zrušit</translation> </message> <message> - <location line="-9"/> <source>Rich Text</source> <translation>Upravovatelný text</translation> </message> <message> - <location line="+1"/> <source>Source</source> <translation>Zdroj</translation> </message> @@ -6389,72 +5341,58 @@ Třída: %2</translation> <context> <name>qdesigner_internal::RichTextEditorToolBar</name> <message> - <location line="-294"/> <source>Bold</source> <translation>Tučné</translation> </message> <message> - <location line="+1"/> <source>CTRL+B</source> <translation>CTRL+F</translation> </message> <message> - <location line="+5"/> <source>Italic</source> <translation>Kurzíva</translation> </message> <message> - <location line="+1"/> <source>CTRL+I</source> <translation>CTRL+K</translation> </message> <message> - <location line="+5"/> <source>Underline</source> <translation>Podtržení</translation> </message> <message> - <location line="+1"/> <source>CTRL+U</source> <translation>CTRL+U</translation> </message> <message> - <location line="+13"/> <source>Left Align</source> <translation>Zarovnat k levému okraji</translation> </message> <message> - <location line="+5"/> <source>Center</source> <translation>Zarovnat na střed</translation> </message> <message> - <location line="+5"/> <source>Right Align</source> <translation>Zarovnat k pravému okraji</translation> </message> <message> - <location line="+5"/> <source>Justify</source> <translation>Zarovnat do bloku</translation> </message> <message> - <location line="+9"/> <source>Superscript</source> <translation>Horní index</translation> </message> <message> - <location line="+6"/> <source>Subscript</source> <translation>Dolní index</translation> </message> <message> - <location line="+9"/> <source>Insert &Link</source> <translation>Vložit &odkaz</translation> </message> <message> - <location line="+5"/> <source>Insert &Image</source> <translation>Vložit &obrázek</translation> </message> @@ -6462,17 +5400,14 @@ Třída: %2</translation> <context> <name>qdesigner_internal::ScriptDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/scriptdialog.cpp" line="+66"/> <source>Edit script</source> <translation>Upravit skript</translation> </message> <message> - <location line="+56"/> <source>Syntax error</source> <translation>Chyba ve skladbě</translation> </message> <message> - <location line="-51"/> <source><html>Enter a Qt Script snippet to be executed while loading the form.<br>The widget and its children are accessible via the variables <i>widget</i> and <i>childWidgets</i>, respectively.</source> <translation><html>Zadejte kousek Qt skriptu k provedení v průběhu nahrávání formuláře.<br>Prvek a jemu podřízené prvky jsou přístupné prostřednictvím proměnných <i>widget</i> und <i>childWidgets</i>.</translation> </message> @@ -6480,7 +5415,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::ScriptErrorDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/scripterrordialog.cpp" line="+27"/> <source>Script errors</source> <translation>Chyby ve skriptu</translation> </message> @@ -6488,23 +5422,18 @@ Třída: %2</translation> <context> <name>qdesigner_internal::SignalSlotDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/signalslotdialog.cpp" line="+199"/> <source>There is already a slot with the signature '%1'.</source> <translation>Již existuje zdířka s podpisem '%1'.</translation> </message> <message> - <location line="+5"/> <source>There is already a signal with the signature '%1'.</source> <translation>Již existuje signál s podpisem '%1'.</translation> </message> <message> - <location line="+7"/> <source>%1 - Duplicate Signature</source> <translation>%1 - Podpis již existuje</translation> </message> <message> - <location line="+21"/> - <location line="+76"/> <source>Signals/Slots of %1</source> <translation>Signály/Zdířky od %1</translation> </message> @@ -6512,12 +5441,10 @@ Třída: %2</translation> <context> <name>qdesigner_internal::SignalSlotEditorPlugin</name> <message> - <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_plugin.cpp" line="+72"/> <source>Edit Signals/Slots</source> <translation>Upravit signály/zdířky</translation> </message> <message> - <location line="+2"/> <source>F4</source> <translation>F4</translation> </message> @@ -6525,7 +5452,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::SignalSlotEditorTool</name> <message> - <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_tool.cpp" line="+58"/> <source>Edit Signals/Slots</source> <translation>Upravit signály/zdířky</translation> </message> @@ -6533,7 +5459,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::StatusBarTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/toolbar_taskmenu.cpp" line="+81"/> <source>Remove</source> <translation>Odstranit</translation> </message> @@ -6541,7 +5466,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::StringListEditorButton</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/stringlisteditorbutton.cpp" line="+56"/> <source>Change String List</source> <translation>Změnit seznamy s řetězci znaků</translation> </message> @@ -6549,38 +5473,30 @@ Třída: %2</translation> <context> <name>qdesigner_internal::StyleSheetEditorDialog</name> <message> - <location filename="../tools/designer/src/lib/shared/stylesheeteditor.cpp" line="+97"/> <source>Edit Style Sheet</source> <translation>Upravit předlohový list</translation> </message> <message> - <location line="-7"/> - <location line="+280"/> <source>Valid Style Sheet</source> <translation>Platný předlohový list</translation> </message> <message> - <location line="+3"/> <source>Invalid Style Sheet</source> <translation>Neplatný předlohový list</translation> </message> <message> - <location line="-281"/> <source>Add Resource...</source> <translation>Přidat zdroj...</translation> </message> <message> - <location line="+1"/> <source>Add Gradient...</source> <translation>Přidat přechod...</translation> </message> <message> - <location line="+1"/> <source>Add Color...</source> <translation>Přidat barvu...</translation> </message> <message> - <location line="+1"/> <source>Add Font...</source> <translation>Přidat písmo...</translation> </message> @@ -6588,27 +5504,22 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TabOrderEditor</name> <message> - <location filename="../tools/designer/src/components/tabordereditor/tabordereditor.cpp" line="+363"/> <source>Start from Here</source> <translation>Začít znovu odtud</translation> </message> <message> - <location line="+3"/> <source>Restart</source> <translation>Začít znovu</translation> </message> <message> - <location line="+2"/> <source>Tab Order List...</source> <translation>Seznam s pořadím tabulátorů...</translation> </message> <message> - <location line="+44"/> <source>Tab Order List</source> <translation>Seznam s pořadím tabulátorů</translation> </message> <message> - <location line="+1"/> <source>Tab Order</source> <translation>Pořadí tabulátorů</translation> </message> @@ -6616,7 +5527,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TabOrderEditorPlugin</name> <message> - <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_plugin.cpp" line="+73"/> <source>Edit Tab Order</source> <translation>Upravit pořadí tabulátorů</translation> </message> @@ -6624,7 +5534,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TabOrderEditorTool</name> <message> - <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_tool.cpp" line="+57"/> <source>Edit Tab Order</source> <translation>Upravit pořadí tabulátorů</translation> </message> @@ -6632,48 +5541,38 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TableWidgetEditor</name> <message> - <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="+67"/> <source>New Column</source> <translation>Nový sloupec</translation> </message> <message> - <location line="+3"/> <source>New Row</source> <translation>Nový řádek</translation> </message> <message> - <location line="+8"/> <source>&Columns</source> <translation>&Sloupce</translation> </message> <message> - <location line="+1"/> <source>&Rows</source> <translation>&Řádky</translation> </message> <message> - <location line="+137"/> <source>Properties &<<</source> <translation>Vlastnosti &<<</translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.ui"/> - <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="+2"/> <source>Properties &>></source> <translation>Vlastnosti &>></translation> </message> <message> - <location/> <source>Edit Table Widget</source> <translation>Upravit prvek s tabulkou</translation> </message> <message> - <location/> <source>&Items</source> <translation>&Prvky</translation> </message> <message> - <location/> <source>Table Items</source> <translation>Prvky tabulek</translation> </message> @@ -6681,7 +5580,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TableWidgetTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/tablewidget_taskmenu.cpp" line="+64"/> <source>Edit Items...</source> <translation>Upravit prvky...</translation> </message> @@ -6689,22 +5587,18 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TemplateOptionsWidget</name> <message> - <location filename="../tools/designer/src/components/formeditor/templateoptionspage.cpp" line="-18"/> <source>Pick a directory to save templates in</source> <translation>Vyberte adresář pro ukládání předloh</translation> </message> <message> - <location filename="../tools/designer/src/components/formeditor/templateoptionspage.ui"/> <source>Form</source> <translation>Formulář</translation> </message> <message> - <location/> <source>Additional Template Paths</source> <translation>Dodatečné adresáře pro předlohy</translation> </message> <message> - <location/> <source>...</source> <translation>...</translation> </message> @@ -6712,22 +5606,18 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TextEditTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/textedit_taskmenu.cpp" line="+59"/> <source>Change HTML...</source> <translation>Změnit HTML...</translation> </message> <message> - <location line="-1"/> <source>Edit HTML</source> <translation>Upravit HTML</translation> </message> <message> - <location line="+10"/> <source>Edit Text</source> <translation>Upravit text</translation> </message> <message> - <location line="+1"/> <source>Change Plain Text...</source> <translation>Změnit prostý text...</translation> </message> @@ -6735,22 +5625,18 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TextEditor</name> <message> - <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="-204"/> <source>Choose Resource...</source> <translation>Vybrat zdroj...</translation> </message> <message> - <location line="+1"/> <source>Choose File...</source> <translation>Vybrat soubor...</translation> </message> <message> - <location line="+123"/> <source>Choose a File</source> <translation>Vybrat soubor</translation> </message> <message> - <location line="-118"/> <source>...</source> <translation>...</translation> </message> @@ -6758,27 +5644,22 @@ Třída: %2</translation> <context> <name>qdesigner_internal::ToolBarEventFilter</name> <message> - <location filename="../tools/designer/src/lib/shared/qdesigner_toolbar.cpp" line="+234"/> <source>Insert Separator</source> <translation>Vložit oddělovač</translation> </message> <message> - <location line="-65"/> <source>Remove action '%1'</source> <translation>Odstranit činnost '%1'</translation> </message> <message> - <location line="+7"/> <source>Remove Toolbar '%1'</source> <translation>Odstranit nástrojový pruh '%1'</translation> </message> <message> - <location line="-28"/> <source>Insert Separator before '%1'</source> <translation>Vložit oddělovač před '%1'</translation> </message> <message> - <location line="+9"/> <source>Append Separator</source> <translation>Připojit oddělovač</translation> </message> @@ -6786,125 +5667,98 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TreeWidgetEditor</name> <message> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+76"/> <source>&Columns</source> <translation>&Sloupce</translation> </message> <message> - <location line="+69"/> <source>Per column properties</source> <translation>Vlastnosti sloupců</translation> </message> <message> - <location line="+1"/> <source>Common properties</source> <translation>Společné vlastnosti</translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+53"/> <source>New Item</source> <translation>Nový prvek</translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+194"/> <source>Properties &<<</source> <translation>Vlastnosti &<<</translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+2"/> <source>Properties &>></source> <translation>Vlastnosti &>></translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="-327"/> <source>New Column</source> <translation>Nový sloupec</translation> </message> <message> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/> <source>Edit Tree Widget</source> <translation>Upravit stromový prvek</translation> </message> <message> - <location/> <source>&Items</source> <translation>&Prvky</translation> </message> <message> - <location/> <source>Tree Items</source> <translation>Stromové prvky</translation> </message> <message> - <location/> - <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+150"/> <source>New Subitem</source> <translation>Nový podřízený prvek</translation> </message> <message> - <location/> <source>New &Subitem</source> <translation>Nový po&dřízený prvek</translation> </message> <message> - <location/> <source>Delete Item</source> <translation>Smazat prvek</translation> </message> <message> - <location/> <source>Move Item Left (before Parent Item)</source> <translation>Posunout prvek doleva (před nadřízený prvek)</translation> </message> <message> - <location/> <source>L</source> <translation>L</translation> </message> <message> - <location/> <source>Move Item Right (as a First Subitem of the Next Sibling Item)</source> <translation>Posunout prvek doprava (jako první podřízený prvek dalšího rovnocenného prvku)</translation> </message> <message> - <location/> <source>R</source> <translation>R</translation> </message> <message> - <location/> <source>Move Item Up</source> <translation>Posunout prvek nahoru</translation> </message> <message> - <location/> <source>U</source> <translation>U</translation> </message> <message> - <location/> <source>Move Item Down</source> <translation>Posunout prvek dolů</translation> </message> <message> - <location/> <source>D</source> <translation>D</translation> </message> <message> - <location/> <source>1</source> <translation>1</translation> </message> <message> - <location/> <source>&New</source> <translation>&Nový</translation> </message> <message> - <location/> <source>&Delete</source> <translation>&Smazat</translation> </message> @@ -6912,7 +5766,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::TreeWidgetTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/treewidget_taskmenu.cpp" line="+63"/> <source>Edit Items...</source> <translation>Upravit prvky...</translation> </message> @@ -6920,7 +5773,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::WidgetBox</name> <message> - <location filename="../tools/designer/src/components/widgetbox/widgetbox_dnditem.cpp" line="+115"/> <source>Warning: Widget creation failed in the widget box. This could be caused by invalid custom widget XML.</source> <translation>Upozornění: Vytvoření prvku v krabici s prvky se nezdařilo. Mohlo by to být zapříčiněno chybným XML kódem uživatelsky stanoveného prvku.</translation> </message> @@ -6928,42 +5780,34 @@ Třída: %2</translation> <context> <name>qdesigner_internal::WidgetBoxTreeWidget</name> <message> - <location filename="../tools/designer/src/components/widgetbox/widgetboxtreewidget.cpp" line="-268"/> <source>Scratchpad</source> <translation>Skladování</translation> </message> <message> - <location line="+370"/> <source>Custom Widgets</source> <translation>Uživatelsky stanovené prvky</translation> </message> <message> - <location line="+263"/> <source>Expand all</source> <translation>Rozdělat vše</translation> </message> <message> - <location line="+1"/> <source>Collapse all</source> <translation>Složit vše</translation> </message> <message> - <location line="+3"/> <source>List View</source> <translation>Pohled se seznamem</translation> </message> <message> - <location line="+1"/> <source>Icon View</source> <translation>Pohled s ikonami</translation> </message> <message> - <location line="+15"/> <source>Remove</source> <translation>Odstranit</translation> </message> <message> - <location line="+2"/> <source>Edit name</source> <translation>Upravit název</translation> </message> @@ -6971,7 +5815,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::WidgetDataBase</name> <message> - <location filename="../tools/designer/src/lib/shared/widgetdatabase.cpp" line="-411"/> <source>A custom widget plugin whose class name (%1) matches that of an existing class has been found.</source> <translation>Byl nalezen přídavný modul, který obsahuje uživatelsky stanovený prvek, jehož název pro třídu (%1) odpovídá stávající třídě.</translation> </message> @@ -6979,7 +5822,6 @@ Třída: %2</translation> <context> <name>qdesigner_internal::WidgetEditorTool</name> <message> - <location filename="../tools/designer/src/components/formeditor/tool_widgeteditor.cpp" line="+67"/> <source>Edit Widgets</source> <translation>Upravit prvky</translation> </message> @@ -6987,33 +5829,27 @@ Třída: %2</translation> <context> <name>qdesigner_internal::WidgetFactory</name> <message> - <location filename="../tools/designer/src/lib/shared/widgetfactory.cpp" line="+263"/> <source>The custom widget factory registered for widgets of class %1 returned 0.</source> <translation>Závod pro uživatelsky stanovené prvky třídy %1 vrátil zpět 0.</translation> </message> <message> - <location line="+44"/> <source>A class name mismatch occurred when creating a widget using the custom widget factory registered for widgets of class %1. It returned a widget of class %2.</source> <translation>Při vytváření prvku byly zjištěny odporující si názvy tříd: Závod pro uživatelsky stanovené prvky třídy %1 vrátil zpět prvek třídy %2.</translation> </message> <message> - <location line="+189"/> <source>The current page of the container '%1' (%2) could not be determined while creating a layout.This indicates an inconsistency in the ui-file, probably a layout being constructed on a container widget.</source> <translation>Při vytváření rozvržení se nepodařilo určit nynější stránku kontejneru '%1' (%2). To naznačuje jistou nesrovnalost v souboru s rozhraním; pravděpodobně bylo rozvržení postaveno přímo na prvku kontejneru.</translation> </message> <message> - <location line="+53"/> <source>Attempt to add a layout to a widget '%1' (%2) which already has an unmanaged layout of type %3. This indicates an inconsistency in the ui-file.</source> <translation>Pokus o přidání rozvržení na prvek '%1' (%2), který již má nespravované rozvržení typu %3. To naznačuje jistou nesrovnalost v souboru s rozhraním.</translation> </message> <message> - <location line="+211"/> <source>Cannot create style '%1'.</source> <translation>Nepodařilo se vytvořit styl '%1'.</translation> </message> <message> - <location line="-354"/> <source>%1 Widget</source> <translation>%1 prvek</translation> </message> @@ -7021,12 +5857,10 @@ This indicates an inconsistency in the ui-file.</source> <context> <name>qdesigner_internal::WizardContainerWidgetTaskMenu</name> <message> - <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="-49"/> <source>Next</source> <translation>Další</translation> </message> <message> - <location line="+1"/> <source>Back</source> <translation>Zpět</translation> </message> @@ -7034,7 +5868,6 @@ This indicates an inconsistency in the ui-file.</source> <context> <name>qdesigner_internal::ZoomMenu</name> <message> - <location filename="../tools/designer/src/lib/shared/zoomwidget.cpp" line="+84"/> <source>%1 %</source> <extracomment>Zoom factor</extracomment> <translation>%1 %</translation> @@ -7043,7 +5876,6 @@ This indicates an inconsistency in the ui-file.</source> <context> <name>qdesigner_internal::ZoomablePreviewDeviceSkin</name> <message> - <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="-270"/> <source>&Zoom</source> <translation>&Zvětšit</translation> </message> diff --git a/translations/linguist_cs.ts b/translations/linguist_cs.ts old mode 100644 new mode 100755 index 32905c9..5023355 --- a/translations/linguist_cs.ts +++ b/translations/linguist_cs.ts @@ -4,7 +4,6 @@ <context> <name>AboutDialog</name> <message> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1357"/> <source>Qt Linguist</source> <translation>Qt Linguist</translation> </message> @@ -12,27 +11,22 @@ <context> <name>BatchTranslationDialog</name> <message> - <location filename="../tools/linguist/linguist/batchtranslationdialog.cpp" line="+79"/> <source>Batch Translation of '%1' - Qt Linguist</source> <translation>Automatický překlad '%1' - Qt Linguist</translation> </message> <message> - <location line="+37"/> <source>Searching, please wait...</source> <translation>Hledá se, čekejte, prosím...</translation> </message> <message> - <location line="+0"/> <source>&Cancel</source> <translation>&Zrušit</translation> </message> <message> - <location line="+42"/> <source>Linguist batch translator</source> <translation>Automatický překladatel (Linguist)</translation> </message> <message numerus="yes"> - <location line="+1"/> <source>Batch translated %n entries</source> <translation> <numerusform>1 záznam byl automaticky přeložen</numerusform> @@ -41,62 +35,50 @@ </translation> </message> <message> - <location filename="../tools/linguist/linguist/batchtranslation.ui"/> <source>Qt Linguist - Batch Translation</source> <translation>Qt Linguist - Automatický překlad</translation> </message> <message> - <location/> <source>Options</source> <translation>Volby</translation> </message> <message> - <location/> <source>Set translated entries to finished</source> <translation>Označit přeložené záznamy jako hotové</translation> </message> <message> - <location/> <source>Retranslate entries with existing translation</source> <translation>Znovu přeložit záznamy s již existujícím překladem</translation> </message> <message> - <location/> <source>Translate also finished entries</source> <translation>Přeložit i hotové záznamy</translation> </message> <message> - <location/> <source>Phrase book preference</source> <translation>Slovníky</translation> </message> <message> - <location/> <source>Move up</source> <translation>Posunout nahoru</translation> </message> <message> - <location/> <source>Move down</source> <translation>Posunout dolů</translation> </message> <message> - <location/> <source>&Run</source> <translation>&Provést</translation> </message> <message> - <location/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location/> <source>Note that the modified entries will be reset to unfinished if 'Set translated entries to finished' above is unchecked</source> <translation>Všimněte si, že změněné záznamy budou znovu nastaveny na nevyřízené, pokud není zapnuto nahoře zmíněné nastavení 'Označit přeložené záznamy jako hotové'</translation> </message> <message> - <location/> <source>The batch translator will search through the selected phrase books in the order given above</source> <translation>Automatický překladatel bude prohledávat vybrané slovníky v pořadí uvedeném výše</translation> </message> @@ -104,39 +86,40 @@ <context> <name>DataModel</name> <message> - <location filename="../tools/linguist/linguist/messagemodel.cpp" line="+214"/> + <source>The translation file '%1' will not be loaded because it is empty.</source> + <translation>Soubor s překladem '%1'nebude nahrán, protože je prázdný.</translation> + </message> + <message> <source><qt>Duplicate messages found in '%1':</source> <translation><qt>Vícekrát existující hlášení v '%1':</translation> </message> <message> - <location line="+4"/> <source><p>[more duplicates omitted]</source> <translation><p>[vypuštěny další vícekrát existující zprávy]</translation> </message> <message> - <location line="+3"/> + <source><p>* ID: %1</source> + <translation><p>* ID: %1</translation> + </message> + <message> <source><p>* Context: %1<br>* Source: %2</source> <translation><p>* Souvislosti: %1<br>* Zdroj: %2</translation> </message> <message> - <location line="+3"/> <source><br>* Comment: %3</source> <translation><br>* Poznámka: %3</translation> </message> <message> - <location line="+70"/> <source>Linguist does not know the plural rules for '%1'. Will assume a single universal form.</source> <translation>Pravidla pro tvoření množného čísla (plurálu) jazyka '%1' nejsou v Linguistu stanovena. Pracuje se s jednoduchým všeobecným tvarem.</translation> </message> <message> - <location line="+56"/> <source>Cannot create '%2': %1</source> <translation>'%2' nemůže být vytvořen: %1</translation> </message> <message> - <location line="+56"/> <source>Universal Form</source> <translation>Všeobecný tvar</translation> </message> @@ -144,37 +127,30 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation> <context> <name>ErrorsView</name> <message> - <location filename="../tools/linguist/linguist/errorsview.cpp" line="+76"/> <source>Accelerator possibly superfluous in translation.</source> <translation>V textu překladu je možná přebytečný akcelerátor.</translation> </message> <message> - <location line="+3"/> <source>Accelerator possibly missing in translation.</source> <translation>V textu překladu možná chybí akcelerátor.</translation> </message> <message> - <location line="+3"/> <source>Translation does not end with the same punctuation as the source text.</source> <translation>Interpunkční znaménko na konci textu překladu se liší od interpunkce zdrojového textu.</translation> </message> <message> - <location line="+3"/> <source>A phrase book suggestion for '%1' was ignored.</source> <translation>Na návrh slovníku pro '%1' nebyl brán zřetel.</translation> </message> <message> - <location line="+3"/> <source>Translation does not refer to the same place markers as in the source text.</source> <translation>Držitelé místa v textu překladu a ve zdrojovém textu se liší.</translation> </message> <message> - <location line="+3"/> <source>Translation does not contain the necessary %n place marker.</source> <translation>Potřebný držitel místa (%n) v překladu chybí.</translation> </message> <message> - <location line="+3"/> <source>Unknown error</source> <translation>Neznámá chyba</translation> </message> @@ -182,97 +158,78 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation> <context> <name>FindDialog</name> <message> - <location filename="../tools/linguist/linguist/finddialog.ui"/> <source>This window allows you to search for some text in the translation source file.</source> <translation>Toto okno vám umožňuje hledání textu ve zdrojovém souboru s překladem.</translation> </message> <message> - <location/> <source>Type in the text to search for.</source> <translation>Zadejte text, který se má hledat.</translation> </message> <message> - <location/> <source>Options</source> <translation>Volby</translation> </message> <message> - <location/> <source>Source texts are searched when checked.</source> <translation>Když je zapnuto, hledá se ve zdrojových textech.</translation> </message> <message> - <location/> <source>Translations are searched when checked.</source> <translation>Když je zapnuto, hledá se v překladech.</translation> </message> <message> - <location/> <source>Texts such as 'TeX' and 'tex' are considered as different when checked.</source> <translation>Když je zapnuto, texty jako 'TeX' a 'tex' se považují za rozdílné.</translation> </message> <message> - <location/> <source>Comments and contexts are searched when checked.</source> <translation>Když je zapnuto, prohledávají se poznámky a souvislosti.</translation> </message> <message> - <location/> <source>Find</source> <translation>Hledat</translation> </message> <message> - <location/> <source>&Find what:</source> <translation>&Vzor hledání:</translation> </message> <message> - <location/> <source>&Source texts</source> <translation>&Zdrojové texty</translation> </message> <message> - <location/> <source>&Translations</source> <translation>&Překlady</translation> </message> <message> - <location/> <source>&Match case</source> <translation>&Dbát na psaní velkých a malých písmen</translation> </message> <message> - <location/> <source>&Comments</source> <translation>&Poznámky</translation> </message> <message> - <location/> <source>Ignore &accelerators</source> <translation>Nedbat na &akcelerátory</translation> </message> <message> - <location/> <source>Click here to find the next occurrence of the text you typed in.</source> <translation>Klepněte sem pro skok k dalšímu výskytu hledáného textu.</translation> </message> <message> - <location/> <source>Find Next</source> <translation>Hledat dál</translation> </message> <message> - <location/> <source>Click here to close this window.</source> <translation>Klepněte sem pro zavření tohoto okna.</translation> </message> <message> - <location/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location filename="../tools/linguist/linguist/finddialog.cpp" line="+12"/> <source></source> <comment>Choose Edit|Find from the menu bar or press Ctrl+F to pop up the Find dialog</comment> <translation></translation> @@ -281,38 +238,212 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation> <context> <name>FormMultiWidget</name> <message> - <location filename="../tools/linguist/linguist/messageeditorwidgets.cpp" line="+296"/> <source>Alt+Delete</source> <extracomment>translate, but don't change</extracomment> <translation>Alt+Delete</translation> </message> <message> - <location line="+1"/> <source>Shift+Alt+Insert</source> <extracomment>translate, but don't change</extracomment> <translation>Shift+Alt+Insert</translation> </message> <message> - <location line="+1"/> <source>Alt+Insert</source> <extracomment>translate, but don't change</extracomment> <translation>Alt+Insert</translation> </message> <message> - <location line="+131"/> <source>Confirmation - Qt Linguist</source> <translation>Potvrzení - Qt Linguist</translation> </message> <message> - <location line="+1"/> <source>Delete non-empty length variant?</source> <translation>Smazat vyplněnou obměnu délky?</translation> </message> </context> <context> + <name>LConvert</name> + <message> + <source> +Usage: + lconvert [options] <infile> [<infile>...] + +lconvert is part of Qt's Linguist tool chain. It can be used as a +stand-alone tool to convert and filter translation data files. +The following file formats are supported: + +%1 +If multiple input files are specified, they are merged with +translations from later files taking precedence. + +Options: + -h + --help Display this information and exit. + + -i <infile> + --input-file <infile> + Specify input file. Use if <infile> might start with a dash. + This option can be used several times to merge inputs. + May be '-' (standard input) for use in a pipe. + + -o <outfile> + --output-file <outfile> + Specify output file. Default is '-' (standard output). + + -if <informat> + --input-format <format> + Specify input format for subsequent <infile>s. + The format is auto-detected from the file name and defaults to 'ts'. + + -of <outformat> + --output-format <outformat> + Specify output format. See -if. + + --input-codec <codec> + Specify encoding for QM and PO input files. Default is 'Latin1' + for QM and 'UTF-8' for PO files. UTF-8 is always tried as well for + QM, corresponding to the possible use of the trUtf8() function. + + --output-codec <codec> + Specify encoding for PO output files. Default is 'UTF-8'. + + --drop-tags <regexp> + Drop named extra tags when writing TS or XLIFF files. + May be specified repeatedly. + + --drop-translations + Drop existing translations and reset the status to 'unfinished'. + Note: this implies --no-obsolete. + + --source-language <language>[_<region>] + Specify/override the language of the source strings. Defaults to + POSIX if not specified and the file does not name it yet. + + --target-language <language>[_<region>] + Specify/override the language of the translation. + The target language is guessed from the file name if this option + is not specified and the file contents name no language yet. + + --no-obsolete + Drop obsolete messages. + + --no-finished + Drop finished messages. + + --sort-contexts + Sort contexts in output TS file alphabetically. + + --locations {absolute|relative|none} + Override how source code references are saved in TS files. + Default is absolute. + + --no-ui-lines + Drop line numbers from references to UI files. + + --verbose + be a bit more verbose + +Long options can be specified with only one leading dash, too. + +Return value: + 0 on success + 1 on command line parse failures + 2 on read failures + 3 on write failures +</source> + <translation> +Použití: + lconvert [volby] <infile> [<infile>...] + +lconvert je částí řetězce nástrojů pro Qt Linguist. Lze jej používat jako samostatný +nástroj na převádění a filtrování souborů s daty překladů. +Jsou podporovány následující formáty souborů: + +%1 +Pokud je zadáno více vstupních souborů, jsou sloučeny s překlady +z pozdějších souborů maje přednost. + +Volby: + -h + --help Zobrazit tuto informaci a ukončit. + + -i <infile> + --input-file <infile> + Zadejte vstupní soubor. Použijte, pokud <infile> může začít čárkou. + Tuto volbu lze použít několikrát ke sloučení vstupů. + Může být '-' (běžný vstup) pro použití v rouře. + + -o <outfile> + --output-file <outfile> + Zadejte výstupní soubor. Výchozí je '-' (běžný vstup). + + -if <informat> + --input-format <format> + Zadejte vstupní soubor pro subsequent <infile>s. + Formát je určen automaticky z názvu souboru a je výchozí pro 'ts'. + + -of <outformat> + --output-format <outformat> + Zadejte výstupní soubor. Viz -if. + + --input-codec <codec> + Zadat kódování pro vstupní soubory QM a PO. Výchozí je 'Latin1' + pro QM a 'UTF-8' pro PO files. UTF-8 se vždy zkouší i pro + QM, odpovídá možnému užití funkce trUtf8(). + + --output-codec <codec> + Zadejte kódování pro výstupní soubory PO. Výchozí je 'UTF-8'. + + --drop-tags <regexp> + Smazat pojmenované značky navíc při zápisu souboru TS nebo XLIFF. + Může být zadáno opakovaně. + + --drop-translations + Smazat stávající překlady a stav nastavit na 'unfinished'. + Poznámka: toto znamená --no-obsolete. + + --source-language <language>[_<region>] + Zadat/Přepsat jazyk zdrojových řetězců. Výchozí pro + POSIX pokud není zadán a soubor jej ještě nejmenuje. + + --target-language <language>[_<region>] + Zadat/Přepsat jazyk překladu. + Cílový jazyk je odhadnut z názvu souboru, pokud není tato volba zadána + a soubor ještě neobsahuje název jazyka. + + --no-obsolete + Smazat zastaralé zprávy. + + --no-finished + Smazat dokončené zprávy. + + --sort-contexts + Řadit souvislosti ve výstupním souboru TS abecedně. + + --locations {absolute|relative|none} + {absolutní|relativní|žádné} + Přepsat, jak jsou odkazy na zdrojový kód v souborech TS ukládány. + Výchozí je absolutní. + + --no-ui-lines + Smazat čísla řádků z odkazů do souborů UI. + + --verbose + Být trochu podrobnější + +Dlouhé volby lze také zadat jen s jednou čárkou na začátku. + +Návratová hodnota: + 0 při úspěchu + 1 při chybách ve zpracování v příkazovém řádku + 2 při chybách ve čtení + 3 při chybách v zápisu +</translation> + </message> +</context> +<context> <name>LRelease</name> <message numerus="yes"> - <location filename="../tools/linguist/shared/qm.cpp" line="+748"/> <source>Dropped %n message(s) which had no ID.</source> <translation> <numerusform>Byl smazán záznam bez identifikátoru.</numerusform> @@ -321,7 +452,6 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation> </translation> </message> <message numerus="yes"> - <location line="+4"/> <source>Excess context/disambiguation dropped from %n message(s).</source> <translation> <numerusform>U jednoho záznamu byla odstraněna přebytečná souvislost případně přebytečné zabránění dvojznačnosti (přebytečná informace k rozhodování).</numerusform> @@ -330,10 +460,25 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation> </translation> </message> <message numerus="yes"> - <location line="+8"/> + <source> Generated %n translation(s) (%1 finished and %2 unfinished)</source> + <translation> + <numerusform> Vytvořen jeden překlad (%1 dokončeno a %2 nedokončeno)</numerusform> + <numerusform> Vytvořeny %n překlady (%1 dokončeno a %2 nedokončeno)</numerusform> + <numerusform> Vytvořeno %n překladů (%1 dokončeno a %2 nedokončeno)</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Ignored %n untranslated source text(s)</source> + <translation> + <numerusform> Opomenut jeden nepřeložený zdrojový text</numerusform> + <numerusform> Opomenuty %n nepřeložené zdrojové texty</numerusform> + <numerusform> Opomenuto %n nepřeložených zdrojových textů</numerusform> + </translation> + </message> + <message numerus="yes"> <source> Generated %n translation(s) (%1 finished and %2 unfinished) </source> - <translation> + <translation type="obsolete"> <numerusform> Byl vytvořen jeden překlad (%1 dokončeno %2 nedokončeno) </numerusform> <numerusform> Byly vytvořeny %n překlady (%1 dokončeno %2 nedokončeno) @@ -343,10 +488,9 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation> </translation> </message> <message numerus="yes"> - <location line="+4"/> <source> Ignored %n untranslated source text(s) </source> - <translation> + <translation type="obsolete"> <numerusform> Na jeden nepřeložený text nebyl brán zřetel </numerusform> <numerusform> na %n nepřeložené texty nebyl brán zřetel @@ -355,637 +499,1246 @@ Pracuje se s jednoduchým všeobecným tvarem.</translation> </numerusform> </translation> </message> + <message> + <source>Usage: + lrelease [options] project-file + lrelease [options] ts-files [-qm qm-file] + +lrelease is part of Qt's Linguist tool chain. It can be used as a +stand-alone tool to convert XML-based translations files in the TS +format into the 'compiled' QM format used by QTranslator objects. + +Options: + -help Display this information and exit + -idbased + Use IDs instead of source strings for message keying + -compress + Compress the QM files + -nounfinished + Do not include unfinished translations + -removeidentical + If the translated text is the same as + the source text, do not include the message + -markuntranslated <prefix> + If a message has no real translation, use the source text + prefixed with the given string instead + -silent + Do not explain what is being done + -version + Display the version of lrelease and exit +</source> + <translation>Použití: + lrelease [volby] projektový-soubor + lrelease [volby] ts-soubory [-qm qm-soubor] + +lrelease je částí řetězce nástrojů pro Qt Linguist. Lze jej používat jako samostatný +nástroj na převádění na XML založených překladových souborů ve formátu TS +do 'sestaveného' formátu QM používaného objekty QTranslator. + +Volby: + -help Zobrazit tuto informaci a ukončit + -idbased + Použít ID namísto zdrojových řetězců pro klíčování zpráv + -compress + Zkomprimovat soubory QM + -nounfinished + Nezahrnovat nedokončené překlady + -removeidentical + Pokud je přeložený text stejný jako zdrojový text, + zprávu nezahrnovat + -markuntranslated <prefix> + Pokud překlad nemá skutečný překlad, použít namísto něj + zdrojový text předeslaný zadaným řetězcem + -silent + Nevysvětlovat, co se dělá + -version + Zobrazit verzi lrelease a ukončit +</translation> + </message> + <message> + <source>lrelease error: %1</source> + <translation>Chyba při lrelease: %1</translation> + </message> + <message> + <source>Updating '%1'... +</source> + <translation>Obnovuje se '%1'... +</translation> + </message> + <message> + <source>Removing translations equal to source text in '%1'... +</source> + <translation>Odstraňují se překlady totožné se zdrojovým textem v '%1'...</translation> + </message> + <message> + <source>lrelease error: cannot create '%1': %2 +</source> + <translation>Chyba při lrelease: nelze vytvořit '%1': %2 +</translation> + </message> + <message> + <source>lrelease error: cannot save '%1': %2</source> + <translation>Chyba při lrelease: nelze uložit '%1': %2 +</translation> + </message> + <message> + <source>lrelease version %1 +</source> + <translation>Verze lrelease %1 +</translation> + </message> + <message> + <source>lrelease error: cannot read project file '%1'. +</source> + <translation>Chyba při lrelease: nelze přečíst soubor s projektem '%1'. +</translation> + </message> + <message> + <source>lrelease error: cannot process project file '%1'. +</source> + <translation>Chyba při lrelease: nelze zpracovat soubor s projektem '%1'. +</translation> + </message> + <message> + <source>lrelease warning: Met no 'TRANSLATIONS' entry in project file '%1' +</source> + <translation>Varování lrelease: V souboru s projektem '%1' nebyly nalezeny žádné záznamy s 'PŘEKLADY' +</translation> + </message> +</context> +<context> + <name>LUpdate</name> + <message> + <source>Parenthesis/bracket/brace mismatch between #if and #else branches; using #if branch +</source> + <translation>Neshoda v závorkách/kulatých závorkách/složených závorkách mezi větvemi #if a #else; používá se větev #if</translation> + </message> + <message> + <source>Parenthesis/brace mismatch between #if and #else branches; using #if branch +</source> + <translation>Neshoda v závorkách/složených závorkách mezi větvemi #if a #else; používá se větev #if</translation> + </message> + <message> + <source>Unterminated C++ comment +</source> + <translation>Neskončená poznámka C++ +</translation> + </message> + <message> + <source>Unterminated C++ string +</source> + <translation>Neskončený řetězec C++ +</translation> + </message> + <message> + <source>Excess closing brace in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>Příliš mnoho zavírajících složených závorek v kódu C++ (nebo nesprávné použití preprocesoru C++) +</translation> + </message> + <message> + <source>Excess closing parenthesis in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>Příliš mnoho zavírajících závorek v kódu C++ (nebo nesprávné použití preprocesoru C++) +</translation> + </message> + <message> + <source>Excess closing bracket in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>Příliš mnoho zavírajících kulatých závorek v kódu C++ (nebo nesprávné použití preprocesoru C++) +</translation> + </message> + <message> + <source>circular inclusion of %1 +</source> + <translation>Kruhové zařazení %1 +</translation> + </message> + <message> + <source>Cannot open %1: %2 +</source> + <translation>Nelze otevřít %1: %2 +</translation> + </message> + <message> + <source>//% cannot be used with tr() / QT_TR_NOOP(). Ignoring +</source> + <translation>//% nelze použít s tr() / QT_TR_NOOP(). Přehlíží se +</translation> + </message> + <message> + <source>Qualifying with unknown namespace/class %1::%2 +</source> + <translation>Blíže se vymezuje s neznámým jmenným prostorem/třídou %1::%2 +</translation> + </message> + <message> + <source>tr() cannot be called without context +</source> + <translation>tr() nelze volat bez souvislosti +</translation> + </message> + <message> + <source>Class '%1' lacks Q_OBJECT macro +</source> + <translation>Třída '%1' postrádá makro Q_OBJECT +</translation> + </message> + <message> + <source>It is not recommended to call tr() from within a constructor '%1::%2' +</source> + <translation>Nedoporučuje se volat tr() zevnitř stavitele '%1::%2' +</translation> + </message> + <message> + <source>//% cannot be used with translate() / QT_TRANSLATE_NOOP(). Ignoring +</source> + <translation>//% nelze použít s translate() / QT_TRANSLATE_NOOP(). Přehlíží se +</translation> + </message> + <message> + <source>//= cannot be used with qtTrId() / QT_TRID_NOOP(). Ignoring +</source> + <translation>//= nelze použít s qtTrId() / QT_TRID_NOOP(). Přehlíží se +</translation> + </message> + <message> + <source>Unexpected character in meta string +</source> + <translation>Neočekávaný znak v meta řetězci +</translation> + </message> + <message> + <source>Unterminated meta string +</source> + <translation>Neskončený meta řetězec +</translation> + </message> + <message> + <source>Cannot invoke tr() like this +</source> + <translation>Nelze uplatnit tr() jako je tento +</translation> + </message> + <message> + <source>Discarding unconsumed meta data +</source> + <translation>Vyřazují se nestrávená metadata +</translation> + </message> + <message> + <source>Unbalanced opening brace in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>Nevyvážené otevírající složené závorky v kódu C++ (nebo nesprávné použití preprocesoru C++) +</translation> + </message> + <message> + <source>Unbalanced opening parenthesis in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>Nevyvážené otevírající závorky v kódu C++ (nebo nesprávné použití preprocesoru C++) +</translation> + </message> + <message> + <source>Unbalanced opening bracket in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>Nevyvážené otevírající kulaté závorky v kódu C++ (nebo nesprávné použití preprocesoru C++) +</translation> + </message> + <message> + <source>Cannot open %1: %2</source> + <translation>Nelze otevřít %1: %2</translation> + </message> + <message> + <source>Unterminated Java comment. +</source> + <translation>Neskončená poznámka Java. +</translation> + </message> + <message> + <source>Invalid Unicode value. +</source> + <translation>Neplatná hodnota Unicode. +</translation> + </message> + <message> + <source>Unterminated string. +</source> + <translation>Neskončený řetězec. +</translation> + </message> + <message> + <source>String used in translation can contain only literals concatenated with other literals, not expressions or numbers. +</source> + <translation>Řetězec používaný v překladu může obsahovat pouze písmenka zřetězená jinými písmeny, nikoli výrazy nebo čísla. +</translation> + </message> + <message> + <source>'class' must be followed by a class name. +</source> + <translation>'class' musí být následována názvem třídy. +</translation> + </message> + <message> + <source>Excess closing brace. +</source> + <translation>Příliš mnoho zavírajících složených závorek. +</translation> + </message> + <message> + <source>'package' must be followed by package name. +</source> + <translation>'package' musí být následován názvem balíčku. +</translation> + </message> + <message> + <source>Unbalanced opening brace. +</source> + <translation>Nevyvážené otevírající složené závorky. +</translation> + </message> + <message> + <source>Unbalanced opening parenthesis. +</source> + <translation>Nevyvážené otevírající závorky. +</translation> + </message> + <message> + <source>Usage: + lupdate [options] [project-file]... + lupdate [options] [source-file|path|@lst-file]... -ts ts-files|@lst-file + +lupdate is part of Qt's Linguist tool chain. It extracts translatable +messages from Qt UI files, C++, Java and JavaScript/QtScript source code. +Extracted messages are stored in textual translation source files (typically +Qt TS XML). New and modified messages can be merged into existing TS files. + +Options: + -help Display this information and exit. + -no-obsolete + Drop all obsolete strings. + -extensions <ext>[,<ext>]... + Process files with the given extensions only. + The extension list must be separated with commas, not with whitespace. + Default: '%1'. + -pluralonly + Only include plural form messages. + -silent + Do not explain what is being done. + -no-sort + Do not sort contexts in TS files. + -no-recursive + Do not recursively scan the following directories. + -recursive + Recursively scan the following directories (default). + -I <includepath> or -I<includepath> + Additional location to look for include files. + May be specified multiple times. + -locations {absolute|relative|none} + Specify/override how source code references are saved in TS files. + Default is absolute. + -no-ui-lines + Do not record line numbers in references to UI files. + -disable-heuristic {sametext|similartext|number} + Disable the named merge heuristic. Can be specified multiple times. + -pro <filename> + Name of a .pro file. Useful for files with .pro file syntax but + different file suffix. Projects are recursed into and merged. + -source-language <language>[_<region>] + Specify the language of the source strings for new files. + Defaults to POSIX if not specified. + -target-language <language>[_<region>] + Specify the language of the translations for new files. + Guessed from the file name if not specified. + -ts <ts-file>... + Specify the output file(s). This will override the TRANSLATIONS + and nullify the CODECFORTR from possibly specified project files. + -codecfortr <codec> + Specify the codec assumed for tr() calls. Effective only with -ts. + -version + Display the version of lupdate and exit. + @lst-file + Read additional file names (one per line) from lst-file. +</source> + <translation type="unfinished">Použití: + lupdate [volby] [projektový-soubor]... + lupdate [volby] [zdrojový-soubor|cesta|@lst-soubor]... -ts ts-soubory|@lst-soubor + +lupdate je částí řetězce nástrojů pro Qt Linguist. Vytahuje překládatelné zprávy +ze souborů pro uživatelské rozhraní (UI) Qt UI, C++, Java a JavaScript/QtScript zdrojového kódu. +Vytažené zprávy jsou ukládány do textových překladových zdrojových souborů (typicky +Qt TS XML). Nové a změněné zprávy lze sloučit se stávajícími soubory TS. + +Volby: + -help Display this information and exit. + -no-obsolete + Drop all obsolete strings. + -extensions <ext>[,<ext>]... + Process files with the given extensions only. + The extension list must be separated with commas, not with whitespace. + Default: '%1'. + -pluralonly + Only include plural form messages. + -silent + Do not explain what is being done. + -no-sort + Do not sort contexts in TS files. + -no-recursive + Do not recursively scan the following directories. + -recursive + Recursively scan the following directories (default). + -I <includepath> or -I<includepath> + Additional location to look for include files. + May be specified multiple times. + -locations {absolute|relative|none} + Specify/override how source code references are saved in TS files. + Default is absolute. + -no-ui-lines + Do not record line numbers in references to UI files. + -disable-heuristic {sametext|similartext|number} + Disable the named merge heuristic. Can be specified multiple times. + -pro <filename> + Name of a .pro file. Useful for files with .pro file syntax but + different file suffix. Projects are recursed into and merged. + -source-language <language>[_<region>] + Specify the language of the source strings for new files. + Defaults to POSIX if not specified. + -target-language <language>[_<region>] + Specify the language of the translations for new files. + Guessed from the file name if not specified. + -ts <ts-file>... + Specify the output file(s). This will override the TRANSLATIONS + and nullify the CODECFORTR from possibly specified project files. + -codecfortr <codec> + Specify the codec assumed for tr() calls. Effective only with -ts. + -version + Display the version of lupdate and exit. + @lst-file + Read additional file names (one per line) from lst-file. +</translation> + </message> + <message> + <source>lupdate warning: Codec for tr() '%1' disagrees with existing file's codec '%2'. Expect trouble. +</source> + <translation>Varování lupdate: Kodek pro tr() '%1' nesouhlasí se stávajícím kodekem souboru '%2'. Dají se očekávat potíže. +</translation> + </message> + <message> + <source>lupdate warning: Specified target language '%1' disagrees with existing file's language '%2'. Ignoring. +</source> + <translation>Varování lupdate: Zadaný cílový jazyk '%1' nesouhlasí se stávajícím jazykem souboru '%2'. Přehlíží se. +</translation> + </message> + <message> + <source>lupdate warning: Specified source language '%1' disagrees with existing file's language '%2'. Ignoring. +</source> + <translation>Varování lupdate: Zadaný zdrojový jazyk '%1' nesouhlasí se stávajícím jazykem souboru '%2'. Přehlíží se. +</translation> + </message> + <message> + <source>Updating '%1'... +</source> + <translation>Obnovuje se '%1'... +</translation> + </message> + <message> + <source>Stripping non plural forms in '%1'... +</source> + <translation>Odkrývají se tvary, které nejsou množným číslem v '%1'... +</translation> + </message> + <message> + <source>lupdate warning: Codec for source '%1' is invalid. Falling back to codec for tr(). +</source> + <translation>Varování lupdate: Kodek pro zdroj '%1' je neplatný. Ustupuje se ke kodeku pro tr(). +</translation> + </message> + <message> + <source>lupdate warning: TS files from command line will override TRANSLATIONS in %1. +</source> + <translation>Varování lupdate: Soubory TS z příkazového řádku dostanou přednost před PŘEKLADY v %1. +</translation> + </message> + <message> + <source>lupdate warning: TS files from command line prevent recursing into %1. +</source> + <translation>Varování lupdate: Soubory TS z příkazového řádku zabrání uchýlení se k %1. +</translation> + </message> + <message> + <source>lupdate warning: no TS files specified. Only diagnostics will be produced for '%1'. +</source> + <translation>Varování lupdate: Nezadány žádné soubory TS. Pro '%1' bude vytvořena pouze diagnostika. +</translation> + </message> + <message> + <source>The option -target-language requires a parameter. +</source> + <translation>Volba -target-language vyžaduje parametr. +</translation> + </message> + <message> + <source>The option -source-language requires a parameter. +</source> + <translation>Volba -source-language vyžaduje parametr. +</translation> + </message> + <message> + <source>The option -disable-heuristic requires a parameter. +</source> + <translation>Volba -disable-heuristic vyžaduje parametr. +</translation> + </message> + <message> + <source>Invalid heuristic name passed to -disable-heuristic. +</source> + <translation>Volbě -disable-heuristic podán neplatný heuristický název. +</translation> + </message> + <message> + <source>The option -locations requires a parameter. +</source> + <translation>Volba -locations vyžaduje parametr. +</translation> + </message> + <message> + <source>Invalid parameter passed to -locations. +</source> + <translation>Volbě -locations podán neplatný parametr. +</translation> + </message> + <message> + <source>The -codecfortr option should be followed by a codec name. +</source> + <translation>Volba -codecfortr by měla být následována názvem kodeku. +</translation> + </message> + <message> + <source>The -extensions option should be followed by an extension list. +</source> + <translation>Volba -extensions by měla být následována seznamem přípon. +</translation> + </message> + <message> + <source>The -pro option should be followed by a filename of .pro file. +</source> + <translation>Volba -pro by měla být následována souborovým názvem souboru .pro. +</translation> + </message> + <message> + <source>The -I option should be followed by a path. +</source> + <translation>Volba -l by měla být následována cestou. +</translation> + </message> + <message> + <source>Unrecognized option '%1'. +</source> + <translation>Nerozpoznaná volba '%1'. +</translation> + </message> + <message> + <source>lupdate error: List file '%1' is not readable. +</source> + <translation>Chyba při lupdate: Soubor seznamu '%1' není čitelný. +</translation> + </message> + <message> + <source>lupdate warning: For some reason, '%1' is not writable. +</source> + <translation>Varování lupdate: Z nějakého důvodu není '%1' zapisovatelný. +</translation> + </message> + <message> + <source>lupdate error: File '%1' has no recognized extension. +</source> + <translation>Chyba při lupdate: Soubor '%1' nemá žádnou rozpoznanou příponu. +</translation> + </message> + <message> + <source>lupdate error: File '%1' does not exist. +</source> + <translation>Chyba při lupdate: Soubor '%1' není. +</translation> + </message> + <message> + <source>Scanning directory '%1'... +</source> + <translation>Prohledává se adresář '%1'... +</translation> + </message> + <message> + <source>lupdate warning: -target-language usually only makes sense with exactly one TS file. +</source> + <translation>Varování lupdate: Volba -target-language obvykle dává smysl jen s přesně jedním souborem TS. +</translation> + </message> + <message> + <source>lupdate warning: -codecfortr has no effect without -ts. +</source> + <translation>Varování lupdate: Volba -codecfortr nemá bez -ts žádný účinek. +</translation> + </message> + <message> + <source>lupdate warning: no TS files specified. Only diagnostics will be produced. +</source> + <translation>Varování lupdate: Nezadán žádný soubor TS. Bude vytvořena pouze diagnostika. +</translation> + </message> + <message> + <source>lupdate error: Both project and source files / include paths specified. +</source> + <translation>Chyba při lupdate: Zadány jak projektový tak zdrojový soubor/zahrnout cesty. +</translation> + </message> + <message numerus="yes"> + <source> Found %n source text(s) (%1 new and %2 already existing) +</source> + <translation> + <numerusform> Nalezen jeden zdrojový text (%1 nový a %2 již existující) +</numerusform> + <numerusform> Nalezeny %n zdrojové texty (%1 nové a %2 již existující) +</numerusform> + <numerusform> Nalezeno %n zdrojových textů (%1 nových a %2 již existujících) +</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Removed %n obsolete entries +</source> + <translation> + <numerusform> Odstraněn jeden zastaralý záznam +</numerusform> + <numerusform> Odstraněny %n zastaralé záznamy +</numerusform> + <numerusform> Odstraněno %n zastaralých záznamů +</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Kept %n obsolete entries +</source> + <translation> + <numerusform> Zachován jeden zastaralý záznam +</numerusform> + <numerusform> Zachovány %n zastaralé záznamy</numerusform> + <numerusform> Zachováno %n zastaralých záznamů</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Number heuristic provided %n translation(s) +</source> + <translation> + <numerusform> Číselná heuristika poskytla jeden překlad +</numerusform> + <numerusform> Číselná heuristika poskytla %n překlady +</numerusform> + <numerusform> Číselná heuristika poskytla %n překladů +</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Same-text heuristic provided %n translation(s) +</source> + <translation> + <numerusform> Heuristika se shodnými texty poskytla jeden překlad</numerusform> + <numerusform> Heuristika se shodnými texty poskytla %n překlady</numerusform> + <numerusform> Heuristika se shodnými texty poskytla %n překladů</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Similar-text heuristic provided %n translation(s) +</source> + <translation> + <numerusform> Heuristika s podobnými texty poskytla jeden překlad</numerusform> + <numerusform> Heuristika s podobnými texty poskytla %n překlady</numerusform> + <numerusform> Heuristika s podobnými texty poskytla %n překladů</numerusform> + </translation> + </message> + <message> + <source>Illegal character</source> + <translation>Neplatný znak</translation> + </message> + <message> + <source>Unclosed string at end of line</source> + <translation>Neuzavřený řetězec na konci řádku</translation> + </message> + <message> + <source>Illegal escape squence</source> + <translation>Neplatná úniková posloupnost</translation> + </message> + <message> + <source>Illegal unicode escape sequence</source> + <translation>Neplatná úniková posloupnost unicode</translation> + </message> + <message> + <source>Unclosed comment at end of file</source> + <translation>Neuzavřená poznámka na konci souboru</translation> + </message> + <message> + <source>Illegal syntax for exponential number</source> + <translation>Neplatná skladba exponenciálního čísla</translation> + </message> + <message> + <source>Identifier cannot start with numeric literal</source> + <translation>Identifikátor nemůže začínat s číselným písmenem</translation> + </message> + <message> + <source>Unterminated regular expression literal</source> + <translation>Neskončený regulární výraz</translation> + </message> + <message> + <source>//% cannot be used with %1(). Ignoring +</source> + <translation>//% nelze použít s %1(). Přehlíží se +</translation> + </message> + <message> + <source>%1() requires at least two arguments. +</source> + <translation>%1() vyžaduje alespoň dva argumenty. +</translation> + </message> + <message> + <source>%1(): both arguments must be literal strings. +</source> + <translation>%1(): oba argumenty musí být písmennými řetězci. +</translation> + </message> + <message> + <source>%1() requires at least one argument. +</source> + <translation>%1() vyžaduje alespoň jeden argument. +</translation> + </message> + <message> + <source>%1(): text to translate must be a literal string. +</source> + <translation>%1(): text k překladu musí být písmenný řetězec. +</translation> + </message> + <message> + <source>//= cannot be used with %1(). Ignoring +</source> + <translation>//= nelze použít s %1(). Přehlíží se +</translation> + </message> + <message> + <source>%1(): identifier must be a literal string. +</source> + <translation>%1(): identifikátor musí být písmenný řetězec. +</translation> + </message> + <message> + <source>Expected </source> + <extracomment>Beginning of the string that contains comma-separated list of expected tokens</extracomment> + <translation>Očekáváno </translation> + </message> + <message> + <source>XML error: Parse error at line %1, column %2 (%3).</source> + <translation>Chyba v XML: Chyba při zpracování na řádku %1, ve sloupci %2 (%3).</translation> + </message> + <message> + <source>Parse error in UI file</source> + <translation>Chyba při zpracování v souboru UI</translation> + </message> </context> <context> <name>MainWindow</name> <message> - <location filename="../tools/linguist/linguist/mainwindow.ui"/> <source>MainWindow</source> <translation>Hlavní okno</translation> </message> <message> - <location/> <source>&Phrases</source> <translation>&Slovníky</translation> </message> <message> - <location/> <source>&Close Phrase Book</source> <translation>&Zavřít slovník</translation> </message> <message> - <location/> <source>&Edit Phrase Book</source> <translation>&Upravit slovník</translation> </message> <message> - <location/> <source>&Print Phrase Book</source> <translation>&Vytisknout slovník</translation> </message> <message> - <location/> <source>V&alidation</source> <translation>&Schválení</translation> </message> <message> - <location/> <source>&View</source> <translation>&Pohled</translation> </message> <message> - <location/> <source>Vie&ws</source> <translation>Po&hledy</translation> </message> <message> - <location/> <source>&Toolbars</source> <translation>&Nástrojové lišty</translation> </message> <message> - <location/> <source>&Help</source> <translation>&Nápověda</translation> </message> <message> - <location/> <source>&Translation</source> <translation>&Překlad</translation> </message> <message> - <location/> <source>&File</source> <translation>&Soubor</translation> </message> <message> - <location/> <source>&Edit</source> <translation>Ú&pravy</translation> </message> <message> - <location/> <source>&Open...</source> <translation>&Otevřít...</translation> </message> <message> - <location/> <source>Open a Qt translation source file (TS file) for editing</source> <translation>Otevřít Qt zdrojový soubor s překladem (soubor TS) pro úpravy</translation> </message> <message> - <location/> <source>Ctrl+O</source> <translation>Ctrl+O</translation> </message> <message> - <location/> <source>E&xit</source> <translation>&Ukončit</translation> </message> <message> - <location/> <source>Close this window and exit.</source> <translation>Toto okno zavřít a ukončit.</translation> </message> <message> - <location/> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+646"/> - <location line="+15"/> <source>&Save</source> <translation>&Uložit</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.ui"/> <source>Save changes made to this Qt translation source file</source> <translation>Uložit změny provedené v tomto Qt zdrojovém souboru s překladem</translation> </message> <message> - <location/> <source>Move to the previous unfinished item.</source> <translation>Jít na předchozí nevyřízený záznam.</translation> </message> <message> - <location/> <source>Move to the next unfinished item.</source> <translation>Jít na další nevyřízený záznam.</translation> </message> <message> - <location/> <source>Move to the previous item.</source> <translation>Jít na předchozí záznam.</translation> </message> <message> - <location/> <source>Move to the next item.</source> <translation>Jít na další záznam.</translation> </message> <message> - <location/> <source>Mark this item as done and move to the next unfinished item.</source> <translation>Označit tento záznam jako hotový a jít na další nevyřízený záznam.</translation> </message> <message> - <location/> <source>Copy from source text</source> <translation>Převzít zdrojový text</translation> </message> <message> - <location/> <source>Toggle the validity check of accelerators, i.e. whether the number of ampersands in the source and translation text is the same. If the check fails, a message is shown in the warnings window.</source> <translation>Zapnout/Vypnout ověření akcelerátorů, to znamená, zda se shoduje počet znaků obchodnického -A (&) ve zdrojovém textu a v textu překladu. V případě neúspěchu se v okně s upozorněními ukáže zpráva s varováním.</translation> </message> <message> - <location/> <source>Toggle the validity check of ending punctuation. If the check fails, a message is shown in the warnings window.</source> <translation>Zapnout/Vypnout ověření znaku na konci věty na konci textu. V případě neúspěchu se v okně s upozorněními ukáže zpráva s varováním.</translation> </message> <message> - <location/> <source>Toggle checking that phrase suggestions are used. If the check fails, a message is shown in the warnings window.</source> <translation>Zapnout/Vypnout ověření použití návrhů slovníku. V případě neúspěchu se v okně s upozorněními ukáže zpráva s varováním.</translation> </message> <message> - <location/> <source>Toggle the validity check of place markers, i.e. whether %1, %2, ... are used consistently in the source text and translation text. If the check fails, a message is shown in the warnings window.</source> <translation>Zapnout/Vypnout ověření držitelů místa, to znamená, zda se shoduje používání %1, %2,... ve zdrojovém textu a v textu překladu. V případě neúspěchu se v okně s upozorněními ukáže zpráva s varováním.</translation> </message> <message> - <location/> <source>Open Read-O&nly...</source> <translation>Otevřít pouze &pro čtení...</translation> </message> <message> - <location/> <source>&Save All</source> <translation>&Uložit vše</translation> </message> <message> - <location/> <source>Ctrl+S</source> <translation>Ctrl+S</translation> </message> <message> - <location/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-14"/> - <location line="+11"/> <source>Save &As...</source> <translation>Uložit &jako...</translation> </message> <message> - <location/> <source>Save As...</source> <translation>Uložit jako...</translation> </message> <message> - <location/> <source>Save changes made to this Qt translation source file into a new file.</source> <translation>Uložit změny provedené v tomto Qt zdrojovém souboru s překladem do nového souboru.</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+4"/> <source>&Release</source> <translation>&Vydat</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.ui"/> <source>Create a Qt message file suitable for released applications from the current message file.</source> <translation>Vytvořit Qt soubor se zprávami vhodný pro vydané aplikace (soubor QM) ze současného souboru s překladem.</translation> </message> <message> - <location/> <source>&Print...</source> <translation>&Tisk...</translation> </message> <message> - <location/> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> - <location/> <source>&Undo</source> <translation>&Zpět</translation> </message> <message> - <location/> <source>Recently Opened &Files</source> <translation>Naposledy upravované sou&bory</translation> </message> <message> - <location/> <source>Save</source> <translation>Uložit</translation> </message> <message> - <location/> <source>Print a list of all the translation units in the current translation source file.</source> <translation>Vytisknout seznam se všemi překladovými jednotkami v současném zdrojovém souboru s překladem.</translation> </message> <message> - <location/> <source>Undo the last editing operation performed on the current translation.</source> <translation>Poslední změnu provedenou v současném překladu vrátit zpět.</translation> </message> <message> - <location/> <source>Ctrl+Z</source> <translation>Ctrl+Z</translation> </message> <message> - <location/> <source>&Redo</source> <translation>&Znovu</translation> </message> <message> - <location/> <source>Redo an undone editing operation performed on the translation.</source> <translation>Poslední zpět vrácenou změnu v překladu provést znovu.</translation> </message> <message> - <location/> <source>Ctrl+Y</source> <translation>Ctrl+Y</translation> </message> <message> - <location/> <source>Cu&t</source> <translation>&Vyjmout</translation> </message> <message> - <location/> <source>Copy the selected translation text to the clipboard and deletes it.</source> <translation>Zkopírovat vybraný text s překladem do schránky a smazat jej.</translation> </message> <message> - <location/> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> - <location/> <source>&Copy</source> <translation>&Kopírovat</translation> </message> <message> - <location/> <source>Copy the selected translation text to the clipboard.</source> <translation>Zkopírovat vybraný text s překladem do schránky.</translation> </message> <message> - <location/> <source>Ctrl+C</source> <translation>Ctrl+C</translation> </message> <message> - <location/> <source>&Paste</source> <translation>&Vložit</translation> </message> <message> - <location/> <source>Paste the clipboard text into the translation.</source> <translation>Vložit text ze schránky do překladu.</translation> </message> <message> - <location/> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> - <location/> <source>Select &All</source> <translation>Vybrat &vše</translation> </message> <message> - <location/> <source>Select the whole translation text.</source> <translation>Vybrat celý text s překladem.</translation> </message> <message> - <location/> <source>Ctrl+A</source> <translation>Ctrl+A</translation> </message> <message> - <location/> <source>&Find...</source> <translation>&Hledat...</translation> </message> <message> - <location/> <source>Search for some text in the translation source file.</source> <translation>Hledat text v souboru s překladem.</translation> </message> <message> - <location/> <source>Ctrl+F</source> <translation>Ctrl+F</translation> </message> <message> - <location/> <source>Find &Next</source> <translation>Hledat &dál</translation> </message> <message> - <location/> <source>Continue the search where it was left.</source> <translation>Pokračovat v hledání.</translation> </message> <message> - <location/> <source>F3</source> <translation>F3</translation> </message> <message> - <location/> <source>&Prev Unfinished</source> <translation>&Předchozí nevyřízený</translation> </message> <message> - <location/> <source>Close</source> <translation>Zavřít</translation> </message> <message> - <location/> <source>&Close All</source> <translation>&Zavřít vše</translation> </message> <message> - <location/> <source>Ctrl+W</source> <translation>Ctrl+W</translation> </message> <message> - <location/> <source>Ctrl+K</source> <translation>Ctrl+K</translation> </message> <message> - <location/> <source>&Next Unfinished</source> <translation>&Další nevyřízený</translation> </message> <message> - <location/> <source>P&rev</source> <translation>Před&chozí</translation> </message> <message> - <location/> <source>Ctrl+Shift+K</source> <translation>Ctrl+Shift+K</translation> </message> <message> - <location/> <source>Ne&xt</source> <translation>Da&lší</translation> </message> <message> - <location/> <source>&Done and Next</source> <translation>&Hotovo a další</translation> </message> <message> - <location/> <source>Copies the source text into the translation field.</source> <translation>Kopíruje zdrojový text do pole s překladem.</translation> </message> <message> - <location/> <source>Ctrl+B</source> <translation>Ctrl+B</translation> </message> <message> - <location/> <source>&Accelerators</source> <translation>&Akcelerátory</translation> </message> <message> - <location/> <source>&Ending Punctuation</source> <translation>&Interpunkce na konci</translation> </message> <message> - <location/> <source>&Phrase matches</source> <translation>&Slovník</translation> </message> <message> - <location/> <source>Place &Marker Matches</source> <translation>Držitel &místa</translation> </message> <message> - <location/> <source>&New Phrase Book...</source> <translation>&Nový slovník...</translation> </message> <message> - <location/> <source>Create a new phrase book.</source> <translation>Vytvořit nový slovník.</translation> </message> <message> - <location/> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> - <location/> <source>&Open Phrase Book...</source> <translation>&Otevřít slovník...</translation> </message> <message> - <location/> <source>Open a phrase book to assist translation.</source> <translation>Otevřít slovník kvůli podpoře při překladu.</translation> </message> <message> - <location/> <source>Ctrl+H</source> <translation>Ctrl+H</translation> </message> <message> - <location/> <source>&Reset Sorting</source> <translation>Řazení &vrátit zpět</translation> </message> <message> - <location/> <source>Sort the items back in the same order as in the message file.</source> <translation>Seřadit záznamy ve stejném pořadí jako v původním souboru s překladem.</translation> </message> <message> - <location/> <source>&Display guesses</source> <translation>Ukázat &návrhy</translation> </message> <message> - <location/> <source>Set whether or not to display translation guesses.</source> <translation>Zapnout/Vypnout zobrazení návrhů k překladu.</translation> </message> <message> - <location/> <source>&Statistics</source> <translation>S&tatistika</translation> </message> <message> - <location/> <source>Display translation statistics.</source> <translation>Ukázat statistiku k překladu.</translation> </message> <message> - <location/> <source>&Manual</source> <translation>&Příručka</translation> </message> <message> - <location/> <source>F1</source> <translation>F1</translation> </message> <message> - <location/> <source>About Qt Linguist</source> <translation>O Qt Linguistu</translation> </message> <message> - <location/> <source>About Qt</source> <translation>O Qt</translation> </message> <message> - <location/> <source>Display information about the Qt toolkit by Trolltech.</source> - <translation>Zobrazit informace o sadě nástrojů Qt od Trolltechu.</translation> + <translation type="obsolete">Zobrazit informace o sadě nástrojů Qt od Trolltechu.</translation> </message> <message> - <location/> <source>&What's This?</source> <translation>&Copak je asi toto?</translation> </message> <message> - <location/> <source>What's This?</source> <translation>Copak je asi toto?</translation> </message> <message> - <location/> <source>Enter What's This? mode.</source> <translation>Zapnout režim "Copak je asi toto?".</translation> </message> <message> - <location/> <source>Shift+F1</source> <translation>Shift+F1</translation> </message> <message> - <location/> <source>&Search And Translate...</source> <translation>Hledat a &překládat...</translation> </message> <message> - <location/> <source>Replace the translation on all entries that matches the search source text.</source> <translation>Nahradit překlad u všech záznamů, které odpovídají hledanému textu.</translation> </message> <message> - <location/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+21"/> <source>&Batch Translation...</source> <translation>&Automatický překlad...</translation> </message> <message> - <location/> <source>Batch translate all entries using the information in the phrase books.</source> <translation>Automaticky přeložit všechny záznamy s pomocí slovníků.</translation> </message> <message> - <location/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-34"/> - <location line="+10"/> <source>Release As...</source> <translation>Vydat jako...</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-2004"/> <source></source> <comment>This is the application's main window.</comment> <translation></translation> </message> <message> - <location line="+188"/> <source>Source text</source> <translation>Zdrojový text</translation> </message> <message> - <location line="+1"/> - <location line="+25"/> <source>Index</source> <translation>Rejstřík</translation> </message> <message> - <location line="-2"/> - <location line="+62"/> <source>Context</source> <translation>Souvislosti</translation> </message> <message> - <location line="-61"/> <source>Items</source> <translation>Záznamy</translation> </message> <message> - <location line="+78"/> <source>This panel lists the source contexts.</source> <translation>V tomto panelu jsou ukazovány souvislosti.</translation> </message> <message> - <location line="+15"/> <source>Strings</source> <translation>Řetězce</translation> </message> <message> - <location line="+39"/> <source>Phrases and guesses</source> <translation>Slovník a návrhy</translation> </message> <message> - <location line="+10"/> <source>Sources and Forms</source> <translation>Zdrojové soubory a formuláře</translation> </message> <message> - <location line="+15"/> <source>Warnings</source> <translation>Upozornění</translation> </message> <message> - <location line="+59"/> <source> MOD </source> <comment>status bar: file(s) modified</comment> <translation>Změněno</translation> </message> <message> - <location line="+130"/> <source>Loading...</source> <translation>Nahrává se...</translation> </message> <message> - <location line="+32"/> - <location line="+22"/> <source>Loading File - Qt Linguist</source> <translation>Nahrává se soubor - Qt Linguist</translation> </message> <message> - <location line="-21"/> <source>The file '%1' does not seem to be related to the currently open file(s) '%2'. Close the open file(s) first?</source> @@ -994,7 +1747,6 @@ Close the open file(s) first?</source> Zavřít nejprve již otevřený soubor(y)?</translation> </message> <message> - <location line="+22"/> <source>The file '%1' does not seem to be related to the file '%2' which is being loaded as well. Skip loading the first named file?</source> @@ -1003,7 +1755,6 @@ Skip loading the first named file?</source> Přeskočit nahrávání prve jmenovaného souboru?</translation> </message> <message numerus="yes"> - <location line="+61"/> <source>%n translation unit(s) loaded.</source> <translation> <numerusform>Nahrána jedna překladová jednotka.</numerusform> @@ -1012,124 +1763,84 @@ Přeskočit nahrávání prve jmenovaného souboru?</translation> </translation> </message> <message> - <location line="+93"/> <source>Related files (%1);;</source> <translation>Příbuzné soubory (%1);;</translation> </message> <message> - <location line="+4"/> <source>Open Translation Files</source> <translation>Otevřít soubory s překlady</translation> </message> <message> - <location line="+10"/> - <location line="+31"/> <source>File saved.</source> <translation>Soubor uložen.</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.ui"/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+15"/> - <location line="+1165"/> <source>Release</source> <translation>Vydat</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1164"/> <source>Qt message files for released applications (*.qm) All files (*)</source> <translation>Qt soubory se zprávami pro vydané aplikace (*.qm) Všechny soubory (*)</translation> </message> <message> - <location line="+3"/> - <location line="+12"/> <source>File created.</source> <translation>Soubor vytvořen.</translation> </message> <message> - <location line="+34"/> - <location line="+355"/> <source>Printing...</source> <translation>Tisk...</translation> </message> <message> - <location line="-347"/> <source>Context: %1</source> <translation>Souvislosti: %1</translation> </message> <message> - <location line="+32"/> <source>finished</source> <translation>vyřízeno</translation> </message> <message> - <location line="+3"/> <source>unresolved</source> <translation>nevyřešeno</translation> </message> <message> - <location line="+3"/> <source>obsolete</source> <translation>zastaralé</translation> </message> <message> - <location line="+15"/> - <location line="+307"/> <source>Printing... (page %1)</source> <translation>Tisk... (strana %1)</translation> </message> <message> - <location line="-300"/> - <location line="+307"/> <source>Printing completed</source> <translation>Tisk dokončen</translation> </message> <message> - <location line="-305"/> - <location line="+307"/> <source>Printing aborted</source> <translation>Tisk zrušen</translation> </message> <message> - <location line="-232"/> <source>Search wrapped.</source> <translation>Hledání začíná odshora.</translation> </message> <message> - <location line="+17"/> - <location line="+278"/> - <location line="+34"/> - <location line="+24"/> - <location line="+22"/> - <location line="+516"/> - <location line="+1"/> - <location line="+274"/> - <location line="+40"/> - <location line="+10"/> <source>Qt Linguist</source> <translation>Qt Linguist</translation> </message> <message> - <location line="-1198"/> - <location line="+102"/> <source>Cannot find the string '%1'.</source> <translation>Nelze najít řetězec '%1'.</translation> </message> <message> - <location line="-82"/> <source>Search And Translate in '%1' - Qt Linguist</source> <translation>Hledat a překládat v '%1' - Qt Linguist</translation> </message> <message> - <location line="+34"/> - <location line="+23"/> - <location line="+24"/> <source>Translate - Qt Linguist</source> <translation>Překlad - Qt Linguist</translation> </message> <message numerus="yes"> - <location line="-46"/> <source>Translated %n entry(s)</source> <translation> <numerusform>Přeložen jeden záznam</numerusform> @@ -1138,39 +1849,32 @@ Všechny soubory (*)</translation> </translation> </message> <message> - <location line="+23"/> <source>No more occurrences of '%1'. Start over?</source> <translation>Žádné další výskyty '%1'. Začít znovu?</translation> </message> <message> - <location line="+30"/> <source>Create New Phrase Book</source> <translation>Vytvořit nový slovník</translation> </message> <message> - <location line="+1"/> <source>Qt phrase books (*.qph) All files (*)</source> <translation>Slovníky Qt (*.qph) Všechny soubory (*)</translation> </message> <message> - <location line="+11"/> <source>Phrase book created.</source> <translation>Slovník vytvořen.</translation> </message> <message> - <location line="+17"/> <source>Open Phrase Book</source> <translation>Otevřít slovník</translation> </message> <message> - <location line="+1"/> <source>Qt phrase books (*.qph);;All files (*)</source> <translation>Slovníky Qt (*.qph);;Všechny soubory (*)</translation> </message> <message numerus="yes"> - <location line="+7"/> <source>%n phrase(s) loaded.</source> <translation> <numerusform>Nahrán jeden záznam ve slovníku.</numerusform> @@ -1179,427 +1883,342 @@ Všechny soubory (*)</translation> </translation> </message> <message> - <location line="+93"/> - <location line="+3"/> - <location line="+7"/> <source>Add to phrase book</source> <translation>Přidat do slovníku</translation> </message> <message> - <location line="-9"/> <source>No appropriate phrasebook found.</source> <translation>Nelze nalézt žádný příslušný slovník.</translation> </message> <message> - <location line="+3"/> <source>Adding entry to phrasebook %1</source> <translation>Přidává se záznam do slovníku %1</translation> </message> <message> - <location line="+7"/> <source>Select phrase book to add to</source> <translation>Do kterého slovníku se má záznam přidat</translation> </message> <message> - <location line="+29"/> <source>Unable to launch Qt Assistant (%1)</source> <translation>Qt Assistant nelze spustit (%1)</translation> </message> <message> - <location line="+17"/> <source>Version %1</source> <translation>Verze %1</translation> </message> <message> - <location line="+3"/> + <source><center><img src=":/images/splash.png"/></img><p>%1</p></center><p>Qt Linguist is a tool for adding translations to Qt applications.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</source> + <translation><center><img src=":/images/splash.png"/></img><p>%1</p></center><p>Qt Linguist je nástrojem pro přidávání překladů do programů Qt.</p><p>Copyright (C) 2010 Nokia Corporation a/nebo její dceřinná společnost(i).</translation> + </message> + <message> <source><center><img src=":/images/splash.png"/></img><p>%1</p></center><p>Qt Linguist is a tool for adding translations to Qt applications.</p><p>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source> - <translation><center><img src=":/images/splash.png"/></img><p>%1</p></center><p>Qt Linguist je nástrojem pro přidávání překladů do aplikací Qt.</p><p>Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</translation> + <translation type="obsolete"><center><img src=":/images/splash.png"/></img><p>%1</p></center><p>Qt Linguist je nástrojem pro přidávání překladů do aplikací Qt.</p><p>Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná společnost(i).</translation> </message> <message> - <location line="+38"/> <source>Do you want to save the modified files?</source> <translation>Chcete uložit změněné soubory?</translation> </message> <message> - <location line="+22"/> <source>Do you want to save '%1'?</source> <translation>Chcete uložit '%1'?</translation> </message> <message> - <location line="+43"/> <source>Qt Linguist[*]</source> <translation>Qt Linguist[*]</translation> </message> <message> - <location line="+2"/> <source>%1[*] - Qt Linguist</source> <translation>%1[*] - Qt Linguist</translation> </message> <message> - <location line="+267"/> - <location line="+12"/> <source>No untranslated translation units left.</source> <translation>Nezbyly žádné nepřeložené překladové jednotky.</translation> </message> <message> - <location line="+176"/> <source>&Window</source> <translation>&Okno</translation> </message> <message> - <location line="+2"/> <source>Minimize</source> <translation>Zmenšit</translation> </message> <message> - <location line="+1"/> <source>Ctrl+M</source> <translation>Ctrl+M</translation> </message> <message> - <location line="+12"/> <source>Display the manual for %1.</source> <translation>Zobrazit příručku k %1.</translation> </message> <message> - <location line="+1"/> <source>Display information about %1.</source> <translation>Zobrazit údaje o %1.</translation> </message> <message> - <location line="+70"/> <source>&Save '%1'</source> <translation>&Uložit '%1'</translation> </message> <message> - <location line="+1"/> <source>Save '%1' &As...</source> <translation>'%1' uložit &jako...</translation> </message> <message> - <location line="+1"/> <source>Release '%1'</source> <translation>Vydat '%1'</translation> </message> <message> - <location line="+1"/> <source>Release '%1' As...</source> <translation>'%1' vydat jako...</translation> </message> <message> - <location line="+1"/> <source>&Close '%1'</source> <translation>&Zavřít '%1'</translation> </message> <message> - <location line="+6"/> - <location line="+13"/> <source>&Close</source> <translation>&Zavřít</translation> </message> <message> - <location line="-10"/> <source>Save All</source> <translation>Uložit vše</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.ui"/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/> <source>&Release All</source> <translation>&Vydat vše</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/> <source>Close All</source> <translation>Zavřít vše</translation> </message> <message> - <location line="+23"/> <source>Translation File &Settings for '%1'...</source> <translation>Nastavení &souboru s překladem pro '%1' ...</translation> </message> <message> - <location line="+1"/> <source>&Batch Translation of '%1'...</source> <translation>&Automatický překlad '%1' ...</translation> </message> <message> - <location line="+1"/> <source>Search And &Translate in '%1'...</source> <translation>Hledat a &překládat v '%1' ...</translation> </message> <message> - <location line="+4"/> <source>Search And &Translate...</source> <translation>Hledat a &překládat...</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.ui"/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+51"/> <source>File</source> <translation>Soubor</translation> </message> <message> - <location/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+7"/> <source>Edit</source> <translation>Úpravy</translation> </message> <message> - <location/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+6"/> <source>Translation</source> <translation>Překlad</translation> </message> <message> - <location/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+6"/> <source>Validation</source> <translation>Schválení</translation> </message> <message> - <location/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+7"/> <source>Help</source> <translation>Nápověda</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+84"/> <source>Cannot read from phrase book '%1'.</source> <translation>Nelze číst ze slovníku '%1'.</translation> </message> <message> - <location line="+15"/> <source>Close this phrase book.</source> <translation>Tento slovník zavřít.</translation> </message> <message> - <location line="+4"/> <source>Enables you to add, modify, or delete entries in this phrase book.</source> <translation>Umožní vložit, měnit nebo odstranit záznamy z tohoto slovníku.</translation> </message> <message> - <location line="+5"/> <source>Print the entries in this phrase book.</source> <translation>Vytisknout záznamy z tohoto slovníku.</translation> </message> <message> - <location line="+16"/> <source>Cannot create phrase book '%1'.</source> <translation>Nelze vytvořit slovník '%1'.</translation> </message> <message> - <location line="+10"/> <source>Do you want to save phrase book '%1'?</source> <translation>Chcete uložit slovník '%1'?</translation> </message> <message> - <location line="+323"/> <source>All</source> <translation>Vše</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.ui"/> <source>Open/Refresh Form &Preview</source> <translation>Otevřít/Obnovit &náhled na formulář</translation> </message> <message> - <location/> <source>Form Preview Tool</source> <translation>Nástroj pro náhled na formulář</translation> </message> <message> - <location/> <source>F5</source> <translation>F5</translation> </message> <message> - <location/> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-536"/> <source>Translation File &Settings...</source> <translation>&Nastavení souboru s překladem...</translation> </message> <message> - <location/> <source>&Add to Phrase Book</source> <translation>&Přidat do slovníku</translation> </message> <message> - <location/> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> - <location/> <source>Ctrl+J</source> <translation>Ctrl+J</translation> </message> <message> - <location/> <source>Ctrl+Shift+J</source> <translation>Ctrl+Shift+J</translation> </message> <message> - <location/> <source>Previous unfinished item</source> <translation>Předchozí nevyřízený záznam</translation> </message> <message> - <location/> <source>Next unfinished item</source> <translation>Další nevyřízený záznam</translation> </message> <message> - <location/> <source>Move to previous item</source> <translation>Jít na předchozí záznam</translation> </message> <message> - <location/> <source>Next item</source> <translation>Další záznam</translation> </message> <message> - <location/> <source>Mark item as done and move to the next unfinished item</source> <translation>Označit záznam jako vyřízený a jít na další nevyřízený záznam</translation> </message> <message> - <location/> <source>Copies the source text into the translation field</source> <translation>Kopíruje zdrojový text do pole s překladem</translation> </message> <message> - <location/> <source>Toggle the validity check of accelerators</source> <translation>Zapnout/Vypnout ověření akcelerátorů</translation> </message> <message> - <location/> <source>Toggle the validity check of ending punctuation</source> <translation>Zapnout/Vypnout ověření znaku na konci věty na konci textu</translation> </message> <message> - <location/> <source>Toggle checking that phrase suggestions are used</source> <translation>Zapnout/Vypnout ověření použití záznamů ze slovníku</translation> </message> <message> - <location/> <source>Toggle the validity check of place markers</source> <translation>Zapnout/Vypnout ověření držitelů místa</translation> </message> <message> - <location/> <source>Create a Qt message file suitable for released applications from the current message file. The filename will automatically be determined from the name of the TS file.</source> <translation>Vytvořit z nynějšího překladového souboru soubor s hlášeními Qt vhodný pro vydané aplikace. Název souboru bude automaticky odvozen z názvu souboru TS.</translation> </message> <message> - <location/> <source>Length Variants</source> <translation>Varianty délky</translation> </message> + <message> + <source>Display information about the Qt toolkit by Nokia.</source> + <translation>Zobrazit informace o sadě nástrojů Qt od Nokie.</translation> + </message> </context> <context> <name>MessageEditor</name> <message> - <location filename="../tools/linguist/linguist/messageeditor.cpp" line="+42"/> <source></source> <comment>This is the right panel of the main window.</comment> <translation></translation> </message> <message> - <location line="+30"/> <source>Russian</source> <translation>Ruský</translation> </message> <message> - <location line="+1"/> <source>German</source> <translation>Německý</translation> </message> <message> - <location line="+1"/> <source>Japanese</source> <translation>Japonský</translation> </message> <message> - <location line="+1"/> <source>French</source> <translation>Francouzský</translation> </message> <message> - <location line="+1"/> <source>Polish</source> <translation>Polský</translation> </message> <message> - <location line="+1"/> <source>Chinese</source> <translation>Čínský</translation> </message> <message> - <location line="+53"/> <source>This whole panel allows you to view and edit the translation of some source text.</source> <translation>Celý tento panel umožňuje zobrazení a úpravy překladu zdrojového textu.</translation> </message> <message> - <location line="+18"/> <source>Source text</source> <translation>Zdrojový text</translation> </message> <message> - <location line="+2"/> <source>This area shows the source text.</source> <translation>Tato oblast ukazuje zdrojový text.</translation> </message> <message> - <location line="+4"/> <source>Source text (Plural)</source> <translation>Zdrojový text (Plural)</translation> </message> <message> - <location line="+2"/> <source>This area shows the plural form of the source text.</source> <translation>Tato oblast ukazuje množné číslo zdrojového textu.</translation> </message> <message> - <location line="+4"/> <source>Developer comments</source> <translation>Vývojářovy poznámky</translation> </message> <message> - <location line="+3"/> <source>This area shows a comment that may guide you, and the context in which the text occurs.</source> <translation>Tato oblast ukazuje případn poznámky, jež vás mohou vést, a souvislosti, v nichž se text vyskytuje.</translation> </message> <message> - <location line="+59"/> <source>Here you can enter comments for your own use. They have no effect on the translated applications.</source> <translation>Sem můžete vepsat poznámky určené pro vaše vlastní použití. Na překlad nemají žádný vliv.</translation> </message> <message> - <location line="+232"/> <source>%1 translation (%2)</source> <translation>Překlad %1 (%2)</translation> </message> <message> - <location line="+9"/> <source>This is where you can enter or modify the translation of the above source text.</source> <translation>Tady můžete zadávat nebo měnit překlad zdrojového textu.</translation> </message> <message> - <location line="+5"/> <source>%1 translation</source> <translation>Překlad %1</translation> </message> <message> - <location line="+1"/> <source>%1 translator comments</source> <translation>%1 překladatelovy poznámky</translation> </message> <message> - <location line="+157"/> <source>'%1' Line: %2</source> <translation>'%1' @@ -1609,22 +2228,18 @@ Line: %2</source> <context> <name>MessageModel</name> <message> - <location filename="../tools/linguist/linguist/messagemodel.cpp" line="+832"/> <source>Completion status for %1</source> <translation>Stav zpracování %1</translation> </message> <message> - <location line="+15"/> <source><file header></source> <translation><hlavička souboru></translation> </message> <message> - <location line="+2"/> <source><context comment></source> <translation><související poznámka></translation> </message> <message> - <location line="+71"/> <source><unnamed context></source> <translation><nepojmenovaná souvislost></translation> </message> @@ -1632,122 +2247,106 @@ Line: %2</source> <context> <name>MsgEdit</name> <message> - <location filename="../tools/linguist/linguist/messageeditor.cpp" line="-614"/> <source></source> <comment>This is the right panel of the main window.</comment> <translation></translation> </message> </context> <context> + <name>PhraseBook</name> + <message> + <source>Parse error at line %1, column %2 (%3).</source> + <translation>Chyba při zpracování na řádku %1, ve sloupci %2 (%3).</translation> + </message> +</context> +<context> <name>PhraseBookBox</name> <message> - <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="+12"/> <source></source> <comment>Go to Phrase > Edit Phrase Book... The dialog that pops up is a PhraseBookBox.</comment> <translation></translation> </message> <message> - <location line="+54"/> <source>(New Entry)</source> <translation>(Nový záznam)</translation> </message> <message> - <location line="+3"/> <source>%1[*] - Qt Linguist</source> <translation>%1[*] - Qt Linguist</translation> </message> <message> - <location line="+90"/> <source>Qt Linguist</source> <translation>Qt Linguist</translation> </message> <message> - <location line="+1"/> <source>Cannot save phrase book '%1'.</source> <translation>Nelze uložit slovník '%1'.</translation> </message> <message> - <location filename="../tools/linguist/linguist/phrasebookbox.ui"/> <source>Edit Phrase Book</source> <translation>Upravit slovník</translation> </message> <message> - <location/> <source>This window allows you to add, modify, or delete entries in a phrase book.</source> <translation>Toto okno vám umožní vložit, měnit nebo odstranit záznamy z tohoto slovníku.</translation> </message> <message> - <location/> <source>&Translation:</source> <translation>&Překlad:</translation> </message> <message> - <location/> <source>This is the phrase in the target language corresponding to the source phrase.</source> <translation>Toto je text, který v cílovém jazyce odpovídá zdrojovému textu.</translation> </message> <message> - <location/> <source>S&ource phrase:</source> <translation>&Zdrojový text:</translation> </message> <message> - <location/> <source>This is a definition for the source phrase.</source> <translation>Toto je vymezení zdrojového textu.</translation> </message> <message> - <location/> <source>This is the phrase in the source language.</source> <translation>Toto je text ve zdrojovém jazyce.</translation> </message> <message> - <location/> <source>&Definition:</source> <translation>&Vymezení:</translation> </message> <message> - <location/> <source>Click here to add the phrase to the phrase book.</source> <translation>Sem klepněte kvůli vložení nového záznamu do slovníku.</translation> </message> <message> - <location/> <source>&New Entry</source> <translation>&Nový záznam</translation> </message> <message> - <location/> <source>Click here to remove the entry from the phrase book.</source> <translation>Sem klepněte kvůli odstranění nového záznamu ze slovníku.</translation> </message> <message> - <location/> <source>&Remove Entry</source> <translation>&Odstranit záznam</translation> </message> <message> - <location/> <source>Settin&gs...</source> <translation>&Nastavení...</translation> </message> <message> - <location/> <source>Click here to save the changes made.</source> <translation>Sem klepněte kvůli uložení provedených změn.</translation> </message> <message> - <location/> <source>&Save</source> <translation>&Uložit</translation> </message> <message> - <location/> <source>Click here to close this window.</source> <translation>Sem klepněte kvůli zavření tohoto okna.</translation> </message> <message> - <location/> <source>Close</source> <translation>Zavřít</translation> </message> @@ -1755,17 +2354,14 @@ Line: %2</source> <context> <name>PhraseModel</name> <message> - <location filename="../tools/linguist/linguist/phrasemodel.cpp" line="+117"/> <source>Source phrase</source> <translation>Zdrojový text</translation> </message> <message> - <location line="+2"/> <source>Translation</source> <translation>Překlad</translation> </message> <message> - <location line="+2"/> <source>Definition</source> <translation>Vymezení</translation> </message> @@ -1773,22 +2369,18 @@ Line: %2</source> <context> <name>PhraseView</name> <message> - <location filename="../tools/linguist/linguist/phraseview.cpp" line="+122"/> <source>Insert</source> <translation>Vložit</translation> </message> <message> - <location line="+3"/> <source>Edit</source> <translation>Upravit</translation> </message> <message> - <location line="+113"/> <source>Guess (%1)</source> <translation>Návrh (%1)</translation> </message> <message> - <location line="+2"/> <source>Guess</source> <translation>Návrh</translation> </message> @@ -1796,76 +2388,67 @@ Line: %2</source> <context> <name>QObject</name> <message> - <location filename="../tools/linguist/shared/qm.cpp" line="+12"/> <source>Compiled Qt translations</source> <translation>Sestavené překlady Qt</translation> </message> <message> - <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1280"/> <source>Translation files (%1);;</source> <translation>Překladové soubory (%1);;</translation> </message> <message> - <location line="+5"/> <source>All files (*)</source> <translation>Všechny soubory (*)</translation> </message> <message> - <location filename="../tools/linguist/linguist/messagemodel.cpp" line="-1118"/> - <location line="+18"/> - <location line="+67"/> - <location line="+39"/> - <location line="+17"/> - <location line="+15"/> - <location filename="../tools/linguist/linguist/phrase.cpp" line="+196"/> <source>Qt Linguist</source> <translation>Qt Linguist</translation> </message> <message> - <location filename="../tools/linguist/shared/po.cpp" line="+658"/> <source>GNU Gettext localization files</source> <translation>Překladové soubory GNU Gettext</translation> </message> <message> - <location filename="../tools/linguist/shared/ts.cpp" line="+752"/> + <source>GNU Gettext localization template files</source> + <translation>Soubory s předlohami pro překlad GNU Gettext</translation> + </message> + <message> <source>Qt translation sources (format 1.1)</source> <translation>Překladové soubory Qt (verze formátu 1.1)</translation> </message> <message> - <location line="+8"/> <source>Qt translation sources (format 2.0)</source> <translation>Překladové soubory Qt (verze formátu 2.0)</translation> </message> <message> - <location line="+9"/> <source>Qt translation sources (latest format)</source> <translation>Překladové soubory Qt (nejnovější formát)</translation> </message> <message> - <location filename="../tools/linguist/shared/xliff.cpp" line="+827"/> <source>XLIFF localization files</source> <translation>Překladové soubory XLIFF</translation> </message> <message> - <location filename="../tools/linguist/shared/qph.cpp" line="+183"/> <source>Qt Linguist 'Phrase Book'</source> <translation>Slovník Qt Linguist</translation> </message> + <message> + <source>lupdate version %1 +</source> + <translation>Verze lupdate %1 +</translation> + </message> </context> <context> <name>SourceCodeView</name> <message> - <location filename="../tools/linguist/linguist/sourcecodeview.cpp" line="+70"/> <source><i>Source code not available</i></source> <translation><i>Zdrojový text není dostupný</i></translation> </message> <message> - <location line="+33"/> <source><i>File %1 not available</i></source> <translation><i>Soubor %1 není dostupný</i></translation> </message> <message> - <location line="+5"/> <source><i>File %1 not readable</i></source> <translation><i>Soubor %1 není čitelný</i></translation> </message> @@ -1873,42 +2456,34 @@ Line: %2</source> <context> <name>Statistics</name> <message> - <location filename="../tools/linguist/linguist/statistics.ui"/> <source>Statistics</source> <translation>Statistiky</translation> </message> <message> - <location/> <source>Translation</source> <translation>Překlad</translation> </message> <message> - <location/> <source>Source</source> <translation>Zdroj</translation> </message> <message> - <location/> <source>0</source> <translation>0</translation> </message> <message> - <location/> <source>Words:</source> <translation>Slov:</translation> </message> <message> - <location/> <source>Characters:</source> <translation>Znaků:</translation> </message> <message> - <location/> <source>Characters (with spaces):</source> <translation>Znaků (s mezerami):</translation> </message> <message> - <location/> <source>Close</source> <translation>Zavřít</translation> </message> @@ -1916,72 +2491,58 @@ Line: %2</source> <context> <name>TranslateDialog</name> <message> - <location filename="../tools/linguist/linguist/translatedialog.ui"/> <source>This window allows you to search for some text in the translation source file.</source> <translation>Toto okno vám umožňuje hledání textu ve zdrojovém souboru s překladem.</translation> </message> <message> - <location/> <source>Type in the text to search for.</source> <translation>Zadejte text, který se má hledat.</translation> </message> <message> - <location/> <source>Find &source text:</source> <translation>Hledat &zdrojový text:</translation> </message> <message> - <location/> <source>&Translate to:</source> <translation>&Překlad:</translation> </message> <message> - <location/> <source>Search options</source> <translation>Nastavení hledání</translation> </message> <message> - <location/> <source>Texts such as 'TeX' and 'tex' are considered as different when checked.</source> <translation>Když je zapnuto, texty jako 'TeX' a 'tex' se považují za rozdílné.</translation> </message> <message> - <location/> <source>Match &case</source> <translation>Dbát na &psaní velkých a malých písmen</translation> </message> <message> - <location/> <source>Mark new translation as &finished</source> <translation>Nový překlad označit jako &vyřízený</translation> </message> <message> - <location/> <source>Click here to find the next occurrence of the text you typed in.</source> <translation>Klepněte sem pro skok k dalšímu výskytu hledáného textu.</translation> </message> <message> - <location/> <source>Find Next</source> <translation>Hledat dál</translation> </message> <message> - <location/> <source>Translate</source> <translation>Přeložit</translation> </message> <message> - <location/> <source>Translate All</source> <translation>Přeložit vše</translation> </message> <message> - <location/> <source>Click here to close this window.</source> <translation>Klepněte sem pro zavření tohoto okna.</translation> </message> <message> - <location/> <source>Cancel</source> <translation>Zrušit</translation> </message> @@ -1989,33 +2550,26 @@ Line: %2</source> <context> <name>TranslationSettingsDialog</name> <message> - <location filename="../tools/linguist/linguist/translationsettingsdialog.cpp" line="+68"/> <source>Any Country</source> <translation>Země</translation> </message> <message> - <location line="+11"/> - <location line="+8"/> <source>Settings for '%1' - Qt Linguist</source> <translation>Nastavení pro '%1' - Qt Linguist</translation> </message> <message> - <location filename="../tools/linguist/linguist/translationsettings.ui"/> <source>Source language</source> <translation>Zdrojový jazyk</translation> </message> <message> - <location/> <source>Language</source> <translation>Jazyk</translation> </message> <message> - <location/> <source>Country/Region</source> <translation>Země/Oblast</translation> </message> <message> - <location/> <source>Target language</source> <translation>Cílový jazyk</translation> </message> diff --git a/translations/qt_cs.ts b/translations/qt_cs.ts old mode 100644 new mode 100755 index e184f64..3e72f01 --- a/translations/qt_cs.ts +++ b/translations/qt_cs.ts @@ -26,7 +26,6 @@ <context> <name>CloseButton</name> <message> - <location filename="../src/gui/widgets/qtabbar.cpp" line="+2245"/> <source>Close Tab</source> <translation>Zavřít kartu</translation> </message> @@ -34,45 +33,68 @@ <context> <name>FakeReply</name> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp" line="+2193"/> <source>Fake error !</source> <translation>Napodobená chyba!</translation> </message> <message> - <location line="+3"/> <source>Invalid URL</source> <translation>Neplátné URL</translation> </message> </context> <context> + <name>MAC_APPLICATION_MENU</name> + <message> + <source>Services</source> + <translation>Služby</translation> + </message> + <message> + <source>Hide %1</source> + <translation>Skrýt %1</translation> + </message> + <message> + <source>Hide Others</source> + <translation>Skrýt ostatní</translation> + </message> + <message> + <source>Show All</source> + <translation>Ukázat vše</translation> + </message> + <message> + <source>Preferences...</source> + <translation>Nastavení...</translation> + </message> + <message> + <source>Quit %1</source> + <translation>Ukončit %1</translation> + </message> + <message> + <source>About %1</source> + <translation>O %1</translation> + </message> +</context> +<context> <name>Phonon::</name> <message> - <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+63"/> <source>Games</source> <translation>Hry</translation> </message> <message> - <location line="-6"/> <source>Music</source> <translation>Hudba</translation> </message> <message> - <location line="+2"/> <source>Video</source> <translation>Video</translation> </message> <message> - <location line="+2"/> <source>Communication</source> <translation>Spojení</translation> </message> <message> - <location line="+4"/> <source>Accessibility</source> <translation>Dostupnost</translation> </message> <message> - <location line="-10"/> <source>Notifications</source> <translation>Oznámení</translation> </message> @@ -80,32 +102,31 @@ <context> <name>Phonon::AudioOutput</name> <message> - <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+377"/> <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source> <translation><html>Zařízení pro přehrávání zvuku <b>%1</b> nepracuje.<br/>Místo něj <b>%2</b> se používá.</html></translation> </message> <message> - <location line="+13"/> <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source> <translation><html>Zařízení pro přehrávání zvuku <b>%1</b> bylo spuštěno,<br/>protože je právě dostupné a má větší přednost.</html></translation> </message> <message> - <location line="+3"/> <source>Revert back to device '%1'</source> <translation>Přepnout zpět na zařízení '%1'</translation> </message> + <message> + <source><html>Switching to the audio playback device <b>%1</b><br/>which has higher preference or is specifically configured for this stream.</html></source> + <translation><html>Přepíná se na zvukové přehrávací zařízení <b>%1</b><br/>, které má větší přednost, nebo bylo zvláště nastaveno pro tento proud.</html></translation> + </message> </context> <context> <name>Phonon::Gstreamer::Backend</name> <message> - <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+176"/> <source>Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled</source> <translation>Upozornění: Zdá se, že zákládní přídavné moduly pro GStreamer nejsou nainstalovány. Podpora audia a videa byla vypnuta</translation> </message> <message> - <location line="-5"/> <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled.</source> <translation>Varování: Balíček gstreamer0.10-plugins-good není nainstalován. @@ -115,50 +136,54 @@ Některé vlastnosti videa nejsou dostupné.</translation> <context> <name>Phonon::Gstreamer::MediaObject</name> <message> - <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+884"/> - <location line="+8"/> - <location line="+15"/> - <location line="+22"/> - <location line="+6"/> - <location line="+19"/> - <location line="+339"/> - <location line="+24"/> <source>Could not open media source.</source> <translation>Zdroj s médii se nepodařilo otevřít.</translation> </message> <message> - <location line="-3"/> <source>Could not decode media source.</source> <translation>Zdroj s médii se nepodařilo rozluštit.</translation> </message> <message> - <location line="-417"/> <source>Invalid source type.</source> <translation>Neplatný typ zdroje s médii.</translation> </message> <message> - <location line="-807"/> <source>Cannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed.</source> - <translation>Přehrávání nelze spustit. + <translation type="obsolete">Přehrávání nelze spustit. Ověřte, prosím, instalaci Gstreamer a ujistěte se, že je nainstalován balíček libgstreamer-plugins-base.</translation> </message> <message> - <location line="+1211"/> <source>Could not open audio device. The device is already in use.</source> <translation>Zvukové zařízení se nepodařilo otevřít, protože se již používá.</translation> </message> <message> - <location line="-1098"/> <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> <translation>Všechny vyžadované kodeky nejsou nainstalovány. Kvůli přehrání tohoto obsahu je potřeba nainstalovat následující kodek(y): %0</translation> </message> <message> - <location line="+1088"/> + <source>Cannot start playback. + +Check your GStreamer installation and make sure you +have libgstreamer-plugins-base installed.</source> + <translation>Přehrávání nelze spustit. + +Ověřte, prosím, instalaci Gstreamer a ujistěte se, +že je nainstalován balíček libgstreamer-plugins-base.</translation> + </message> + <message> + <source>Missing codec helper script assistant.</source> + <translation>Chybí skriptový pomocník pro nápovědu ke kodeku.</translation> + </message> + <message> + <source>Plugin codec installation failed for codec: %0</source> + <translation>Instalace přídavného modulu kodeku se nezdařila pro kodek: %0</translation> + </message> + <message> <source>Could not locate media source.</source> <translation>Zdroj s médii se nepodařilo nalézt.</translation> </message> @@ -166,95 +191,360 @@ Ověřte, prosím, instalaci Gstreamer a ujistěte se, <context> <name>Phonon::MMF</name> <message> - <location filename="../src/3rdparty/phonon/mmf/audiooutput.cpp" line="+108"/> <source>Audio Output</source> <translation>Výstup zvuku</translation> </message> <message> - <location line="+1"/> <source>The audio output device</source> <translation>Zařízení pro výstup zvuku</translation> </message> + <message> + <source>No error</source> + <translation>Žádná chyba</translation> + </message> + <message> + <source>Not found</source> + <translation>Nenalezeno</translation> + </message> + <message> + <source>Out of memory</source> + <translation>Není dostupná žádná další paměť</translation> + </message> + <message> + <source>Not supported</source> + <translation>Nepodporováno</translation> + </message> + <message> + <source>Overflow</source> + <translation>Přetečení</translation> + </message> + <message> + <source>Underflow</source> + <translation>Podtečení</translation> + </message> + <message> + <source>Already exists</source> + <translation>Již existuje</translation> + </message> + <message> + <source>Path not found</source> + <translation>Cesta nenalezena</translation> + </message> + <message> + <source>In use</source> + <translation>Již se používá</translation> + </message> + <message> + <source>Not ready</source> + <translation>Nepřipraven</translation> + </message> + <message> + <source>Access denied</source> + <translation>Přístup odepřen</translation> + </message> + <message> + <source>Could not connect</source> + <translation>Nepodařilo se vytvořit žádné spojení</translation> + </message> + <message> + <source>Disconnected</source> + <translation>Odpojeno</translation> + </message> + <message> + <source>Permission denied</source> + <translation>Přístup odepřen</translation> + </message> + <message> + <source>Insufficient bandwidth</source> + <translation>Nedostatečná šířka pásma</translation> + </message> + <message> + <source>Network unavailable</source> + <translation>Síť není dostupná</translation> + </message> + <message> + <source>Network communication error</source> + <translation>Chyba při spojení přes síť</translation> + </message> + <message> + <source>Streaming not supported</source> + <translation>Proudění nepodporováno</translation> + </message> + <message> + <source>Server alert</source> + <translation>Stav pohotovosti serveru</translation> + </message> + <message> + <source>Invalid protocol</source> + <translation>Neplatný protokol</translation> + </message> + <message> + <source>Invalid URL</source> + <translation>Neplátné URL</translation> + </message> + <message> + <source>Multicast error</source> + <translation>Chyba ve vícepočítání (multicast)</translation> + </message> + <message> + <source>Proxy server error</source> + <translation>Chyba při spojení u zprostředkujícího serveru (proxy)</translation> + </message> + <message> + <source>Proxy server not supported</source> + <translation>Zprostředkující server nepodporován</translation> + </message> + <message> + <source>Audio output error</source> + <translation>Chyba při výstupu zvuku</translation> + </message> + <message> + <source>Video output error</source> + <translation>Chyba při výstupu obrazu</translation> + </message> + <message> + <source>Decoder error</source> + <translation>Chyba v dekodéru</translation> + </message> + <message> + <source>Audio or video components could not be played</source> + <translation>Zvukové nebo obrazové složky se nepodařilo přehrát</translation> + </message> + <message> + <source>DRM error</source> + <translation>Chyba DRM</translation> + </message> + <message> + <source>Unknown error (%1)</source> + <translation>Neznámá chyba (%1)</translation> + </message> +</context> +<context> + <name>Phonon::MMF::AbstractMediaPlayer</name> + <message> + <source>Not ready to play</source> + <translation>Nepřipraven k přehrávání</translation> + </message> + <message> + <source>Error opening file</source> + <translation>Soubor se nepodařilo otevřít</translation> + </message> + <message> + <source>Error opening URL</source> + <translation>Adresu se nepodařilo otevřít</translation> + </message> + <message> + <source>Error opening resource</source> + <translation>Nepodařilo se otevřít prostředky</translation> + </message> + <message> + <source>Error opening source: resource not opened</source> + <translation>Zdroj se nepodařilo otevřít: prostředek není otevřen</translation> + </message> + <message> + <source>Setting volume failed</source> + <translation>Hlasitost se nepodařilo nastavit</translation> + </message> + <message> + <source>Loading clip failed</source> + <translation>Ukázku se nepodařilo nahrát</translation> + </message> + <message> + <source>Playback complete</source> + <translation>Přehrávání dokončeno</translation> + </message> + <message> + <source>Download error</source> + <translation>Chyba při stahování</translation> + </message> +</context> +<context> + <name>Phonon::MMF::AbstractVideoPlayer</name> + <message> + <source>Pause failed</source> + <translation>Pozastavení se nepodařilo provést</translation> + </message> + <message> + <source>Seek failed</source> + <translation>Hledání se nepodařilo provést</translation> + </message> + <message> + <source>Getting position failed</source> + <translation>Polohu se nepodařilo určit</translation> + </message> + <message> + <source>Opening clip failed</source> + <translation>Ukázku se nepodařilo otevřít</translation> + </message> </context> <context> <name>Phonon::MMF::AudioEqualizer</name> <message> - <location filename="../src/3rdparty/phonon/mmf/audioequalizer.cpp" line="+75"/> <source>Frequency band, %1 Hz</source> - <translation>Kmitočtové pásmo, %1 Hz</translation> + <translation type="obsolete">Kmitočtové pásmo, %1 Hz</translation> + </message> + <message> + <source>%1 Hz</source> + <translation>%1 Hz</translation> + </message> +</context> +<context> + <name>Phonon::MMF::AudioPlayer</name> + <message> + <source>Getting position failed</source> + <translation>Polohu se nepodařilo určit</translation> + </message> +</context> +<context> + <name>Phonon::MMF::DsaVideoPlayer</name> + <message> + <source>Video display error</source> + <translation>Chyba při zobrazení videa</translation> </message> </context> <context> <name>Phonon::MMF::EffectFactory</name> <message> - <location filename="../src/3rdparty/phonon/mmf/effectfactory.cpp" line="+65"/> <source>audio equalizer</source> - <translation>zvukový ekvalizér</translation> + <translation type="obsolete">zvukový ekvalizér</translation> </message> <message> - <location line="+2"/> <source>Bass boost</source> - <translation>Zdůraznění basů</translation> + <translation type="obsolete">Zdůraznění basů</translation> </message> <message> - <location line="+2"/> <source>Distance Attenuation</source> - <translation>Zeslabení v závislosti na vzdálenosti</translation> + <translation type="obsolete">Zeslabení v závislosti na vzdálenosti</translation> </message> <message> - <location line="+2"/> - <location line="+2"/> <source>Environmental Reverb</source> - <translation>Vnější ozvěna</translation> + <translation type="obsolete">Vnější ozvěna</translation> </message> <message> - <location line="+2"/> <source>Loudness</source> - <translation>Hlasitost</translation> + <translation type="obsolete">Hlasitost</translation> </message> <message> - <location line="+2"/> <source>Source Orientation</source> - <translation>Zaměření zdroje</translation> + <translation type="obsolete">Zaměření zdroje</translation> </message> <message> - <location line="+2"/> <source>Stereo Widening</source> - <translation>Rozšíření sterea</translation> + <translation type="obsolete">Rozšíření sterea</translation> + </message> + <message> + <source>Enabled</source> + <translation>Povoleno</translation> + </message> +</context> +<context> + <name>Phonon::MMF::EnvironmentalReverb</name> + <message> + <source>Decay HF ratio (%)</source> + <extracomment>DecayHFRatio: Ratio of high-frequency decay time to the value specified by DecayTime.</extracomment> + <translation>Poměr dozvuku u vysokých kmitočtů (%)</translation> + </message> + <message> + <source>Decay time (ms)</source> + <extracomment>DecayTime: Time over which reverberation is diminished.</extracomment> + <translation>Čas dozvuku (ms)</translation> + </message> + <message> + <source>Density (%)</source> + <extracomment>Density Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Diffusion value.</extracomment> + <translation>Hustota (%)</translation> + </message> + <message> + <source>Diffusion (%)</source> + <extracomment>Diffusion: Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Density value.</extracomment> + <translation>Rozptyl (%)</translation> + </message> + <message> + <source>Reflections delay (ms)</source> + <extracomment>ReflectionsDelay: Amount of delay between the arrival the direct path from the source and the arrival of the first reflection.</extracomment> + <translation>Zpoždění odrazu (ms)</translation> + </message> + <message> + <source>Reflections level (mB)</source> + <extracomment>ReflectionsLevel: Amplitude of reflections. This value is corrected by the RoomLevel to give the final reflection amplitude.</extracomment> + <translation>Síla odrazu (mB)</translation> + </message> + <message> + <source>Reverb delay (ms)</source> + <extracomment>ReverbDelay: Amount of time between arrival of the first reflection and start of the late reverberation.</extracomment> + <translation>Zpoždění ozvěny (ms)</translation> + </message> + <message> + <source>Reverb level (mB)</source> + <extracomment>ReverbLevel Amplitude of reverberations. This value is corrected by the RoomLevel to give the final reverberation amplitude.</extracomment> + <translation>Síla ozvěny (mB)</translation> + </message> + <message> + <source>Room HF level</source> + <extracomment>RoomHFLevel: Amplitude of low-pass filter used to attenuate the high frequency component of reflected sound.</extracomment> + <translation>Hladina vysokého kmitočtu v prostoru</translation> + </message> + <message> + <source>Room level (mB)</source> + <extracomment>RoomLevel: Master volume control for all reflected sound.</extracomment> + <translation>Hladina prostoru (mB)</translation> + </message> +</context> +<context> + <name>Phonon::MMF::MediaObject</name> + <message> + <source>Error opening source: type not supported</source> + <translation>Zdroj se nepodařilo otevřít: tento typ není podporován</translation> + </message> + <message> + <source>Error opening source: resource is compressed</source> + <translation>Zdroj se nepodařilo otevřít: prostředek je zkomprimován</translation> + </message> + <message> + <source>Error opening source: resource not valid</source> + <translation>Zdroj se nepodařilo otevřít: prostředek není platný</translation> + </message> + <message> + <source>Error opening source: media type could not be determined</source> + <translation>Zdroj se nepodařilo otevřít: nepodařilo se určit typ média</translation> + </message> +</context> +<context> + <name>Phonon::MMF::StereoWidening</name> + <message> + <source>Level (%)</source> + <translation>Síla (%)</translation> + </message> +</context> +<context> + <name>Phonon::MMF::SurfaceVideoPlayer</name> + <message> + <source>Video display error</source> + <translation>Chyba při zobrazení videa</translation> </message> </context> <context> <name>Phonon::VolumeSlider</name> <message> - <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/> - <location line="+18"/> - <location line="+129"/> - <location line="+15"/> <source>Volume: %1%</source> <translation>Hlasitost: %1%</translation> </message> <message> - <location line="-159"/> - <location line="+18"/> - <location line="+54"/> <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source> <translation>Posuvník se používá k nastavení hlasitosti. Poloha nejvíce vlevo odpovídá 0%; poloha nejvíce vpravo odpovídá %1%</translation> </message> <message> - <location line="+67"/> <source>Muted</source> - <translation>Ztlumení</translation> + <translation>Ztlumeno</translation> </message> </context> <context> <name>Q3Accel</name> <message> - <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/> <source>%1, %2 not defined</source> <translation>%1, %2 nejsou stanoveny</translation> </message> <message> - <location line="+36"/> <source>Ambiguous %1 not handled</source> <translation>Nejednoznačné %1 nemohou být zpracovány</translation> </message> @@ -262,27 +552,22 @@ Ověřte, prosím, instalaci Gstreamer a ujistěte se, <context> <name>Q3DataTable</name> <message> - <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/> <source>True</source> <translation>Pravdivý</translation> </message> <message> - <location line="+1"/> <source>False</source> - <translation>Nesprávný</translation> + <translation>Nepravdivý</translation> </message> <message> - <location line="+507"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="-2"/> <source>Insert</source> <translation>Vložit</translation> </message> <message> - <location line="+1"/> <source>Update</source> <translation>Obnovit</translation> </message> @@ -290,224 +575,170 @@ Ověřte, prosím, instalaci Gstreamer a ujistěte se, <context> <name>Q3FileDialog</name> <message> - <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+2426"/> - <location line="+2027"/> <source>&OK</source> <translation>&OK</translation> </message> <message> - <location line="-254"/> <source>&No</source> <translation>&Ne</translation> </message> <message> - <location line="-1557"/> <source>Dir</source> <translation>Adresář</translation> </message> <message> - <location line="+1557"/> <source>&Yes</source> <translation>&Ano</translation> </message> <message> - <location line="-1724"/> <source>Back</source> <translation>Zpět</translation> </message> <message> - <location line="-85"/> <source>Date</source> <translation>Datum</translation> </message> <message> - <location line="+251"/> <source>File</source> <translation>Soubor</translation> </message> <message> - <location line="-255"/> <source>Name</source> <translation>Název</translation> </message> <message> - <location line="+961"/> - <location line="+1999"/> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+209"/> <source>Open</source> <translation>Otevřít</translation> </message> <message> - <location line="-2959"/> <source>Size</source> <translation>Velikost</translation> </message> <message> - <location line="+1767"/> <source>Sort</source> <translation>Roztřídit</translation> </message> <message> - <location line="-1765"/> <source>Type</source> <translation>Typ</translation> </message> <message> - <location line="+1710"/> - <location line="+5"/> - <location line="+355"/> <source>&Open</source> <translation>&Otevřít</translation> </message> <message> - <location line="-357"/> - <location line="+341"/> <source>&Save</source> <translation>&Uložit</translation> </message> <message> - <location line="+51"/> - <location line="+1009"/> <source>Error</source> <translation>Chyba</translation> </message> <message> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+144"/> <source>Open </source> <translation>Otevřít</translation> </message> <message> - <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="-4660"/> - <location line="+30"/> <source>Write: %1</source> <translation>Zapsat: %1</translation> </message> <message> - <location line="+3263"/> <source>Sort by &Size</source> <translation>Roztřídit podle &velikosti</translation> </message> <message> - <location line="+1"/> <source>Sort by &Date</source> <translation>Roztřídit podle &data</translation> </message> <message> - <location line="-3"/> <source>Sort by &Name</source> <translation>Roztřídit podle &názvu</translation> </message> <message> - <location line="+101"/> <source>New Folder 1</source> <translation>Nová složka 1</translation> </message> <message> - <location line="-44"/> <source>the directory</source> <translation>Adresář</translation> </message> <message> - <location line="-1723"/> <source>File &type:</source> <translation>Typ &souboru:</translation> </message> <message> - <location line="-1"/> - <location line="+1977"/> - <location line="+16"/> <source>File &name:</source> <translation>Název &souboru:</translation> </message> <message> - <location line="-264"/> <source>Delete %1</source> <translation>Smazat %1</translation> </message> <message> - <location line="-3345"/> - <location line="+1579"/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location line="+1700"/> <source>R&eload</source> <translation>Nahrát &znovu</translation> </message> <message> - <location line="+110"/> <source>New Folder</source> <translation>Nová složka</translation> </message> <message> - <location line="-101"/> <source>&Unsorted</source> <translation>&Neroztříděné</translation> </message> <message> - <location line="-1673"/> <source>Look &in:</source> <translation>Hle&dat v:</translation> </message> <message> - <location line="+79"/> <source>Preview File Contents</source> <translation>Náhled obsahu souboru</translation> </message> <message> - <location line="+1700"/> <source>New Folder %1</source> <translation>Nová složka %1</translation> </message> <message> - <location line="-1612"/> <source>Read-write</source> <translation>Číst/Zapisovat</translation> </message> <message> - <location line="+1"/> <source>Read-only</source> <translation>Pouze číst</translation> </message> <message> - <location line="-1805"/> <source>Copy or Move a File</source> <translation>Soubor kopírovat nebo posunout</translation> </message> <message> - <location line="+3368"/> <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> <translation><qt>Jste si jistý, že chcete smazat %1 "%2"?</qt></translation> </message> <message> - <location line="+146"/> <source>Find Directory</source> <translation>Najít adresář</translation> </message> <message> - <location line="-1952"/> <source>Attributes</source> <translation>Vlastnosti</translation> </message> <message> - <location line="+1767"/> <source>Show &hidden files</source> <translation>&Ukázat skryté soubory</translation> </message> <message> - <location line="-701"/> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-73"/> <source>Save As</source> <translation>Uložit jako</translation> </message> <message> - <location line="-821"/> <source>Inaccessible</source> <translation>Nepřístupné</translation> </message> <message> - <location line="+1859"/> <source>%1 File not found. Check path and filename.</source> @@ -516,106 +747,82 @@ Soubor se nepodařilo nalézt. Ověřte cestu a název souboru.</translation> </message> <message> - <location line="-1986"/> <source>List View</source> <translation>Pohled se seznamem</translation> </message> <message> - <location line="+134"/> <source>Special</source> <translation>Zvláštní vlastnost</translation> </message> <message> - <location line="-8"/> <source>Write-only</source> <translation>Pouze zápis</translation> </message> <message> - <location line="+1558"/> <source>the symlink</source> <translation>Symbolický odkaz</translation> </message> <message> - <location line="-83"/> <source>&Delete</source> <translation>&Smazat</translation> </message> <message> - <location line="-1837"/> - <location line="+49"/> - <location line="+2149"/> - <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+112"/> <source>All Files (*)</source> <translation>Všechny soubory (*)</translation> </message> <message> - <location line="-123"/> - <location line="+108"/> <source>Directories</source> <translation>Adresáře</translation> </message> <message> - <location line="-1816"/> <source>Symlink to Special</source> <translation>Symbolický odkaz k zvláštnímu souboru</translation> </message> <message> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+180"/> <source>Select a Directory</source> <translation>Vyberte adresář</translation> </message> <message> - <location line="-371"/> <source>All Files (*.*)</source> <translation>Všechny soubory (*.*)</translation> </message> <message> - <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="-1803"/> <source>Read: %1</source> <translation>Číst: %1</translation> </message> <message> - <location line="+3272"/> <source>&Rename</source> <translation>&Přejmenovat</translation> </message> <message> - <location line="+345"/> <source>Directory:</source> <translation>Adresář:</translation> </message> <message> - <location line="-1972"/> <source>One directory up</source> <translation>O jeden adresář nahoru</translation> </message> <message> - <location line="+44"/> <source>Preview File Info</source> <translation>Náhled informace o souboru</translation> </message> <message> - <location line="+1663"/> <source>the file</source> <translation>Soubor</translation> </message> <message> - <location line="-1698"/> <source>Create New Folder</source> <translation>Vytvořit novou složku</translation> </message> <message> - <location line="+147"/> <source>Symlink to File</source> <translation>Symbolický odkaz k souboru</translation> </message> <message> - <location line="+1"/> <source>Symlink to Directory</source> <translation>Symbolický odkaz k adresáři</translation> </message> <message> - <location line="-122"/> <source>Detail View</source> <translation>Podrobný pohled</translation> </message> @@ -623,36 +830,30 @@ Ověřte cestu a název souboru.</translation> <context> <name>Q3LocalFs</name> <message> - <location filename="../src/qt3support/network/q3localfs.cpp" line="+271"/> <source>Could not open %1</source> <translation>Nepodařilo se otevřít: %1</translation> </message> <message> - <location line="-52"/> <source>Could not remove file or directory %1</source> <translation>Nepodařilo se odstranit soubor nebo adresář %1</translation> </message> <message> - <location line="-34"/> <source>Could not create directory %1</source> <translation>Nepodařilo se vytvořit adresář %1</translation> </message> <message> - <location line="-55"/> - <location line="+10"/> <source>Could not read directory %1</source> <translation>Nepodařilo se přečíst adresář %1</translation> </message> <message> - <location line="+106"/> <source>Could not rename %1 to @@ -663,7 +864,6 @@ na %2</translation> </message> <message> - <location line="+93"/> <source>Could not write %1</source> <translation>Nepodařilo se zapsat: @@ -673,12 +873,10 @@ na <context> <name>Q3MainWindow</name> <message> - <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/> <source>Line up</source> <translation>Uspořádat</translation> </message> <message> - <location line="+2"/> <source>Customize...</source> <translation>Přizpůsobit...</translation> </message> @@ -686,7 +884,6 @@ na <context> <name>Q3NetworkProtocol</name> <message> - <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/> <source>Operation stopped by the user</source> <translation>Operace byla zastavena uživatelem</translation> </message> @@ -694,8 +891,6 @@ na <context> <name>Q3ProgressDialog</name> <message> - <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/> - <location line="+61"/> <source>Cancel</source> <translation>Zrušit</translation> </message> @@ -703,28 +898,22 @@ na <context> <name>Q3TabDialog</name> <message> - <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+190"/> - <location line="+824"/> <source>OK</source> <translation>OK</translation> </message> <message> - <location line="-323"/> <source>Help</source> <translation>Nápověda</translation> </message> <message> - <location line="-43"/> <source>Apply</source> <translation>Použít</translation> </message> <message> - <location line="+138"/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location line="-50"/> <source>Defaults</source> <translation>Výchozí</translation> </message> @@ -732,38 +921,30 @@ na <context> <name>Q3TextEdit</name> <message> - <location filename="../src/qt3support/text/q3textedit.cpp" line="+5435"/> <source>Cu&t</source> <translation>Vyj&mout</translation> </message> <message> - <location line="+1"/> <source>&Copy</source> <translation>&Kopírovat</translation> </message> <message> - <location line="-6"/> <source>&Redo</source> <translation>&Znovu</translation> </message> <message> - <location line="-1"/> <source>&Undo</source> <translation>&Zpět</translation> </message> <message> - <location line="+12"/> <source>Clear</source> <translation>Smazat</translation> </message> <message> - <location line="-3"/> <source>&Paste</source> <translation>&Vložit</translation> </message> <message> - <location line="+7"/> - <location line="+2"/> <source>Select All</source> <translation>Vybrat vše</translation> </message> @@ -771,12 +952,10 @@ na <context> <name>Q3TitleBar</name> <message> - <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+256"/> <source>Close</source> <translation>Zavřít</translation> </message> <message> - <location line="-6"/> <source>Minimize</source> <translation>Zmenšit</translation> </message> @@ -785,57 +964,46 @@ na <translation type="obsolete">Dá velikost zmenšeného okna zpátky do obvyklého stavu</translation> </message> <message> - <location line="+36"/> <source>Displays the name of the window and contains controls to manipulate it</source> <translation>Zobrazí název okna a obsahuje příkazy pro zacházení s ním</translation> </message> <message> - <location line="-4"/> <source>Makes the window full screen</source> <translation>Dá okno na celou obrazovku</translation> </message> <message> - <location line="-36"/> <source>System</source> <translation>Systém</translation> </message> <message> - <location line="+8"/> <source>Maximize</source> <translation>Zvětšit</translation> </message> <message> - <location line="+20"/> <source>Contains commands to manipulate the window</source> <translation>Obsahuje příkazy pro zacházení s velikostí okna</translation> </message> <message> - <location line="-25"/> <source>Restore up</source> <translation>Obnovit</translation> </message> <message> - <location line="+28"/> <source>Puts a minimized window back to normal</source> <translation>Dá velikost zmenšeného okna zpátky do obvyklého stavu</translation> </message> <message> - <location line="+7"/> <source>Closes the window</source> <translation>Zavře okno</translation> </message> <message> - <location line="-3"/> <source>Puts a maximized window back to normal</source> <translation>Dá velikost zvětšeného okna zpátky do obvyklého stavu</translation> </message> <message> - <location line="-3"/> <source>Moves the window out of the way</source> <translation>Zmenší okno</translation> </message> <message> - <location line="-25"/> <source>Restore down</source> <translation>Obnovit</translation> </message> @@ -843,7 +1011,6 @@ na <context> <name>Q3ToolBar</name> <message> - <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/> <source>More...</source> <translation>Více...</translation> </message> @@ -851,51 +1018,38 @@ na <context> <name>Q3UrlOperator</name> <message> - <location filename="../src/qt3support/network/q3urloperator.cpp" line="+402"/> <source>The protocol `%1' does not support getting files</source> <translation>Protokol `%1' nepodporuje nahrávání souborů</translation> </message> <message> - <location line="-3"/> <source>The protocol `%1' does not support renaming files or directories</source> <translation>Protokol `%1' nepodporuje přejmenovávání souborů nebo adresářů</translation> </message> <message> - <location line="-9"/> <source>The protocol `%1' does not support listing directories</source> <translation>Protokol `%1' nepodporuje sestavování seznamu adresářů</translation> </message> <message> - <location line="+499"/> - <location line="+1"/> <source>(unknown)</source> <translation>(neznámý)</translation> </message> <message> - <location line="-494"/> <source>The protocol `%1' does not support removing files or directories</source> <translation>Protokol `%1' nepodporuje odstraňování souborů nebo adresářů</translation> </message> <message> - <location line="+9"/> <source>The protocol `%1' does not support putting files</source> <translation>Protokol `%1' nepodporuje ukládání souborů</translation> </message> <message> - <location line="-19"/> - <location line="+260"/> - <location line="+4"/> <source>The protocol `%1' is not supported</source> <translation>Protokol `%1' není podporován</translation> </message> <message> - <location line="-2"/> - <location line="+4"/> <source>The protocol `%1' does not support copying or moving files or directories</source> <translation>Protokol `%1' nepodporuje kopírování či přesun souborů nebo adresářů</translation> </message> <message> - <location line="-259"/> <source>The protocol `%1' does not support creating new directories</source> <translation>Protokol `%1' nepodporuje vytváření nových adresářů</translation> </message> @@ -903,27 +1057,22 @@ na <context> <name>Q3Wizard</name> <message> - <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+181"/> <source>&Help</source> <translation>&Nápověda</translation> </message> <message> - <location line="-4"/> <source>&Cancel</source> <translation>&Zrušit</translation> </message> <message> - <location line="+3"/> <source>&Finish</source> <translation>Do&končit</translation> </message> <message> - <location line="-1"/> <source>&Next ></source> <translation>&Další ></translation> </message> <message> - <location line="-1"/> <source>< &Back</source> <translation>< &Zpět</translation> </message> @@ -931,44 +1080,30 @@ na <context> <name>QAbstractSocket</name> <message> - <location filename="../src/network/socket/qabstractsocket.cpp" line="+890"/> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+633"/> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+661"/> - <location line="+26"/> <source>Host not found</source> <translation>Nepodařilo se najít počítač</translation> </message> <message> - <location line="+50"/> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/> <source>Connection refused</source> <translation>Spojení bylo odmítnuto</translation> </message> <message> - <location line="+142"/> <source>Connection timed out</source> <translation>Časový limit pro spojení byl překročen</translation> </message> <message> - <location line="+1029"/> <source>Socket is not connected</source> <translation>Zásuvka (socket) není spojena</translation> </message> <message> - <location line="-380"/> <source>Socket operation timed out</source> <translation>Časový limit pro zásuvkovou (socket) operaci byl překročen</translation> </message> <message> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/> <source>Network unreachable</source> <translation>Síť není dosažitelná</translation> </message> <message> - <location filename="../src/network/socket/qabstractsocket.cpp" line="-1197"/> - <location line="+789"/> - <location line="+208"/> <source>Operation on socket is not supported</source> <translation>Tato zásuvková (socket) operace není podporována</translation> </message> @@ -976,17 +1111,14 @@ na <context> <name>QAbstractSpinBox</name> <message> - <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1219"/> <source>Step &down</source> <translation>Krok &dolů</translation> </message> <message> - <location line="-2"/> <source>&Step up</source> <translation>&Krok nahoru</translation> </message> <message> - <location line="-6"/> <source>&Select All</source> <translation>&Vybrat vše</translation> </message> @@ -994,7 +1126,6 @@ na <context> <name>QAccessibleButton</name> <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+250"/> <source>Press</source> <translation>Stisknout</translation> </message> @@ -1002,7 +1133,6 @@ na <context> <name>QApplication</name> <message> - <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+378"/> <source>Activates the program's main window</source> <translation>Spustí hlavní okno programu</translation> </message> @@ -1011,22 +1141,18 @@ na <translation type="obsolete">LTR</translation> </message> <message> - <location line="-2"/> <source>Activate</source> <translation>Spustit</translation> </message> <message> - <location filename="../src/gui/dialogs/qmessagebox.h" line="+354"/> <source>Executable '%1' requires Qt %2, found Qt %3.</source> <translation>Použití '%1' vyžaduje Qt %2; bylo ale nalezeno Qt %3.</translation> </message> <message> - <location line="+2"/> <source>Incompatible Qt Library Error</source> <translation>Qt není slučitelná</translation> </message> <message> - <location filename="../src/gui/kernel/qapplication.cpp" line="+2290"/> <source>QT_LAYOUT_DIRECTION</source> <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> <translation>LTR</translation> @@ -1035,22 +1161,18 @@ na <context> <name>QAxSelect</name> <message> - <location filename="../src/activeqt/container/qaxselect.ui"/> <source>OK</source> <translation>OK</translation> </message> <message> - <location/> <source>COM &Object:</source> <translation>COM-&Objekt:</translation> </message> <message> - <location/> <source>&Cancel</source> <translation>&Zrušit</translation> </message> <message> - <location/> <source>Select ActiveX Control</source> <translation>Vybrat prvek ActiveX</translation> </message> @@ -1058,17 +1180,14 @@ na <context> <name>QCheckBox</name> <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-133"/> <source>Check</source> <translation>Označit křížkem</translation> </message> <message> - <location line="+1"/> <source>Toggle</source> <translation>Přepnout</translation> </message> <message> - <location line="-4"/> <source>Uncheck</source> <translation>Zrušit označení křížkem</translation> </message> @@ -1076,57 +1195,46 @@ na <context> <name>QColorDialog</name> <message> - <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1352"/> <source>&Red:</source> <translation>&Červená:</translation> </message> <message> - <location line="-2"/> <source>&Sat:</source> <translation>&Sytost:</translation> </message> <message> - <location line="+1"/> <source>&Val:</source> <translation>&Jasnost:</translation> </message> <message> - <location line="-2"/> <source>Hu&e:</source> <translation>Barevný &odstín:</translation> </message> <message> - <location line="+107"/> <source>Select Color</source> <translation>Vybrat barvu</translation> </message> <message> - <location line="+182"/> <source>&Add to Custom Colors</source> <translation>&Přidat k uživatelem stanoveným barvám</translation> </message> <message> - <location line="-284"/> <source>Bl&ue:</source> <translation>&Modrá:</translation> </message> <message> - <location line="-1"/> <source>&Green:</source> <translation>&Zelená:</translation> </message> <message> - <location line="+283"/> <source>&Basic colors</source> <translation>Základní &barvy</translation> </message> <message> - <location line="+1"/> <source>&Custom colors</source> <translation>&Uživatelem stanovené barvy</translation> </message> <message> - <location line="-282"/> <source>A&lpha channel:</source> <translation>A&lfa kanál:</translation> </message> @@ -1134,23 +1242,18 @@ na <context> <name>QComboBox</name> <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/> - <location line="+65"/> <source>Open</source> <translation>Otevřít</translation> </message> <message> - <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+557"/> <source>True</source> <translation>Pravdivý</translation> </message> <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/> <source>Close</source> <translation>Zavřít</translation> </message> <message> - <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="-1"/> <source>False</source> <translation>Nesprávný</translation> </message> @@ -1158,19 +1261,16 @@ na <context> <name>QCoreApplication</name> <message> - <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/> <source>%1: key is empty</source> <comment>QSystemSemaphore</comment> <translation>%1: Neplatný údaj u klíče (prázdný)</translation> </message> <message> - <location line="+12"/> <source>%1: unable to make key</source> <comment>QSystemSemaphore</comment> <translation>%1: Nepodařilo se vytvořit klíč</translation> </message> <message> - <location line="+9"/> <source>%1: ftok failed</source> <comment>QSystemSemaphore</comment> <translation>%1: Vyvolání ftok se nezdařilo</translation> @@ -1188,25 +1288,21 @@ na <translation type="obsolete">%1: Vyvolání ftok se nezdařilo</translation> </message> <message> - <location filename="../src/corelib/kernel/qsystemsemaphore_symbian.cpp" line="+65"/> <source>%1: already exists</source> <comment>QSystemSemaphore</comment> <translation>%1: Již existuje</translation> </message> <message> - <location line="+4"/> <source>%1: does not exist</source> <comment>QSystemSemaphore</comment> <translation>%1: Neexistuje</translation> </message> <message> - <location line="+5"/> <source>%1: out of resources</source> <comment>QSystemSemaphore</comment> <translation>%1: Nejsou již použitelné zdroje</translation> </message> <message> - <location line="+4"/> <source>%1: unknown error %2</source> <comment>QSystemSemaphore</comment> <translation>%1: Neznámá chyba %2</translation> @@ -1215,22 +1311,18 @@ na <context> <name>QDB2Driver</name> <message> - <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1552"/> <source>Unable to commit transaction</source> <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> </message> <message> - <location line="+32"/> <source>Unable to set autocommit</source> <translation>'autocommit' se nepodařilo nastavit</translation> </message> <message> - <location line="-330"/> <source>Unable to connect</source> <translation>Nepodařilo se navázat spojení</translation> </message> <message> - <location line="+315"/> <source>Unable to rollback transaction</source> <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> </message> @@ -1238,33 +1330,26 @@ na <context> <name>QDB2Result</name> <message> - <location line="-786"/> <source>Unable to bind variable</source> <translation>Proměnnou se nepodařilo provést</translation> </message> <message> - <location line="-230"/> - <location line="+240"/> <source>Unable to execute statement</source> <translation>Příkaz se nepodařilo provést</translation> </message> <message> - <location line="+98"/> <source>Unable to fetch next</source> <translation>Další datový záznam se nepodařilo natáhnout</translation> </message> <message> - <location line="-301"/> <source>Unable to prepare statement</source> <translation>Příkaz se nepodařilo připravit</translation> </message> <message> - <location line="+282"/> <source>Unable to fetch record %1</source> <translation>Datový záznam %1 se nepodařilo natáhnout</translation> </message> <message> - <location line="+40"/> <source>Unable to fetch first</source> <translation>První datový záznam se nepodařilo natáhnout</translation> </message> @@ -1272,4572 +1357,5143 @@ na <context> <name>QDateTimeEdit</name> <message> - <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2287"/> <source>AM</source> <translation>AM</translation> </message> <message> - <location line="+2"/> <source>PM</source> <translation>PM</translation> </message> <message> - <location line="-2"/> <source>am</source> <translation>am</translation> </message> <message> - <location line="+2"/> <source>pm</source> <translation>pm</translation> </message> </context> <context> - <name>QDial</name> + <name>QDeclarativeAbstractAnimation</name> <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/> - <source>QDial</source> - <translation>QDial</translation> + <source>Cannot animate non-existent property "%1"</source> + <translation>Vlastnost '%1" neexistuje a nelze ji proto animovat</translation> </message> <message> - <location line="+4"/> - <source>SliderHandle</source> - <translation>Posuvník</translation> + <source>Cannot animate read-only property "%1"</source> + <translation>Vlastnost '%1" je pouze pro čtení a nelze ji proto animovat</translation> </message> <message> - <location line="-2"/> - <source>SpeedoMeter</source> - <translation>Rychloměr</translation> + <source>Animation is an abstract class</source> + <translation>Animace je abstraktní třída</translation> </message> </context> <context> - <name>QDialog</name> - <message> - <location filename="../src/gui/dialogs/qdialog.cpp" line="+501"/> - <source>Done</source> - <translation>Hotovo</translation> - </message> + <name>QDeclarativeAnchorAnimation</name> <message> - <location line="+135"/> - <source>What's This?</source> - <translation>Co je toto?</translation> + <source>Cannot set a duration of < 0</source> + <translation>Nelze nastavit dobu trvání < 0</translation> </message> </context> <context> - <name>QDialogButtonBox</name> + <name>QDeclarativeAnchors</name> <message> - <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1872"/> - <location line="+464"/> - <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+606"/> - <source>OK</source> - <translation>OK</translation> + <source>Possible anchor loop detected on fill.</source> + <translation>Při operaci naplnění byla zjištěna případná nekonečná smyčka kotvy.</translation> </message> <message> - <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+0"/> - <source>&OK</source> - <translation>&OK</translation> + <source>Possible anchor loop detected on centerIn.</source> + <translation>Při operaci 'centerIn' byla zjištěna případná nekonečná smyčka kotvy.</translation> </message> <message> - <location line="+38"/> - <source>&No</source> - <translation>&Ne</translation> + <source>Cannot anchor to an item that isn't a parent or sibling.</source> + <translation>Cílem kotvy musí být rodičovský prvek nebo prvek na stejné úrovni.</translation> </message> <message> - <location line="-6"/> - <source>&Yes</source> - <translation>&Ano</translation> + <source>Possible anchor loop detected on vertical anchor.</source> + <translation>Při svislé kotvě byla zjištěna případná nekonečná smyčka kotvy.</translation> </message> <message> - <location line="-11"/> - <source>Help</source> - <translation>Nápověda</translation> + <source>Possible anchor loop detected on horizontal anchor.</source> + <translation>Při vodorovné kotvě byla zjištěna případná nekonečná smyčka kotvy.</translation> </message> <message> - <location line="-15"/> - <source>Open</source> - <translation>Otevřít</translation> + <source>Cannot specify left, right, and hcenter anchors.</source> + <translation>Nelze zadat kotevní údaje pro vlevo, vpravo a umístěno vodorovně do středu. Nesmí se vyskytovat společně.</translation> </message> <message> - <location line="-3"/> - <source>Save</source> - <translation>Uložit</translation> + <source>Cannot anchor to a null item.</source> + <translation>Nelze dát kotvu k nulovému prvku.</translation> </message> <message> - <location line="+0"/> - <source>&Save</source> - <translation>&Uložit</translation> + <source>Cannot anchor a horizontal edge to a vertical edge.</source> + <translation>Nelze ukotvit vodorovný okraj ke svislému.</translation> </message> <message> - <location line="+44"/> - <source>Abort</source> - <translation>Zrušit</translation> + <source>Cannot anchor item to self.</source> + <translation>Prvek nemůže mít kotvu k sobě samému.</translation> </message> <message> - <location line="-32"/> - <source>Apply</source> - <translation>Použít</translation> + <source>Cannot specify top, bottom, and vcenter anchors.</source> + <translation>Nelze zadat kotevní údaje pro nahoře, dole a umístěno svisle do středu. Nesmí se vyskytovat společně.</translation> </message> <message> - <location line="-3"/> - <source>Close</source> - <translation>Zavřít</translation> + <source>Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.</source> + <translation>Kotva pro výchozí bod se nesmí používat společně s dalšími kotevními údaji pro nahoře, dole a umístěno svisle do středu.</translation> </message> <message> - <location line="+6"/> - <source>Reset</source> - <translation>Vrátit</translation> + <source>Cannot anchor a vertical edge to a horizontal edge.</source> + <translation>Nelze ukotvit svislý okraj k vodorovnému.</translation> </message> +</context> +<context> + <name>QDeclarativeAnimatedImage</name> <message> - <location line="+32"/> - <source>Retry</source> - <translation>Opakovat</translation> + <source>Qt was built without support for QMovie</source> + <translation>Qt bylo sestaveno bez podpory pro QMovie</translation> </message> +</context> +<context> + <name>QDeclarativeBehavior</name> <message> - <location line="+6"/> - <source>Restore Defaults</source> - <translation>Obnovit výchozí</translation> + <source>Cannot change the animation assigned to a Behavior.</source> + <translation>Animaci patřící k prvku Behavior nelze změnit.</translation> </message> +</context> +<context> + <name>QDeclarativeBinding</name> <message> - <location line="-44"/> - <source>&Close</source> - <translation>&Zavřít</translation> + <source>Binding loop detected for property "%1"</source> + <translation>U pro vlastnost "%1" zadané vazby byla zjištěna nekonečná smyčka</translation> </message> +</context> +<context> + <name>QDeclarativeCompiledBindings</name> <message> - <location line="-3"/> - <source>Cancel</source> - <translation>Zrušit</translation> + <source>Binding loop detected for property "%1"</source> + <translation>U pro vlastnost "%1" zadané vazby byla zjištěna nekonečná smyčka</translation> </message> +</context> +<context> + <name>QDeclarativeCompiler</name> <message> - <location line="+44"/> - <source>Ignore</source> - <translation>Přehlížet</translation> + <source>Invalid property assignment: "%1" is a read-only property</source> + <translation>Neplatné přiřazení vlastnosti: "%1" je vlastnost pouze pro čtení</translation> </message> <message> - <location line="-26"/> - <source>Close without Saving</source> - <translation>Zavřít bez uložení</translation> + <source>Invalid property assignment: unknown enumeration</source> + <translation>Neplatné přiřazení vlastnosti: neplatná výčtová hodnota</translation> </message> <message> - <location line="+14"/> - <source>N&o to All</source> - <translation>N&e, žádné</translation> + <source>Invalid property assignment: string expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván řetězec</translation> </message> <message> - <location line="+3"/> - <source>Save All</source> - <translation>Uložit vše</translation> + <source>Invalid property assignment: url expected</source> + <translation>Neplatné přiřazení vlastnosti: očekávána adresa (URL)</translation> </message> <message> - <location line="-35"/> - <source>&Cancel</source> - <translation>&Zrušit</translation> + <source>Invalid property assignment: unsigned int expected</source> + <translation>Neplatné přiřazení vlastnosti: očekávána celočíselná hodnota bez znaménka</translation> </message> <message> - <location line="+20"/> - <source>Discard</source> - <translation>Odmítnout</translation> + <source>Invalid property assignment: int expected</source> + <translation>Neplatné přiřazení vlastnosti: očekávána celočíselná hodnota</translation> </message> <message> - <location line="+6"/> - <source>Yes to &All</source> - <translation>Ano, &vše</translation> + <source>Invalid property assignment: number expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáváno číslo</translation> </message> <message> - <location line="-10"/> - <source>Don't Save</source> - <translation>Neukládat</translation> + <source>Invalid property assignment: color expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáváno vymezení barvy</translation> </message> -</context> -<context> - <name>QDirModel</name> <message> - <source>Kind</source> - <translation type="obsolete">Druh</translation> + <source>Invalid property assignment: date expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván údaj s datem</translation> </message> <message> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+457"/> - <source>Name</source> - <translation>Název</translation> + <source>Invalid property assignment: time expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván časový údaj</translation> </message> <message> - <location line="+1"/> - <source>Size</source> - <translation>Velikost</translation> + <source>Invalid property assignment: datetime expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván údaj s datem</translation> </message> <message> - <location line="+3"/> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation>Druh</translation> + <source>Invalid property assignment: point expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván souřadnicový údaj pro jeden bod</translation> </message> <message> - <location line="+2"/> - <source>Type</source> - <comment>All other platforms</comment> - <translation>Typ</translation> + <source>Invalid property assignment: size expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván údaj s velikostí</translation> </message> <message> - <source>Type</source> - <translation type="obsolete">Typ</translation> + <source>Invalid property assignment: rect expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván parametr pro pravoúhelník</translation> </message> <message> - <location line="+6"/> - <source>Date Modified</source> - <translation>Datum změny</translation> + <source>Invalid property assignment: boolean expected</source> + <translation>Neplatné přiřazení vlastnosti: očekávána booleánská hodnota</translation> </message> -</context> -<context> - <name>QDockWidget</name> <message> - <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1241"/> - <source>Dock</source> - <translation>Vplout do panelu</translation> + <source>Invalid property assignment: 3D vector expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván třírozměrný vektor</translation> </message> <message> - <location line="-2"/> - <source>Close</source> - <translation>Zavřít</translation> + <source>Invalid property assignment: unsupported type "%1"</source> + <translation>Neplatné přiřazení vlastnosti: Typ "%1" není podporován</translation> </message> <message> - <location line="+3"/> - <source>Float</source> - <translation>Plout</translation> + <source>Element is not creatable.</source> + <translation>Příkaz nelze vytvořit.</translation> </message> -</context> -<context> - <name>QDoubleSpinBox</name> <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-533"/> - <source>Less</source> - <translation>Méně</translation> + <source>Component elements may not contain properties other than id</source> + <translation>Prvky součástek nesmí kromě ID obsahovat další vlastnosti</translation> </message> <message> - <location line="-2"/> - <source>More</source> - <translation>Více</translation> + <source>Invalid component id specification</source> + <translation>Neplatné vymezení součástky</translation> </message> -</context> -<context> - <name>QErrorMessage</name> <message> - <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+415"/> - <source>&OK</source> - <translation>&OK</translation> + <source>id is not unique</source> + <translation>Hodnota ID není jednoznačná</translation> </message> <message> - <location line="-201"/> - <source>Fatal Error:</source> - <translation>Osudová chyba:</translation> + <source>Invalid component body specification</source> + <translation>Neplatné vymezení obsahu součástky</translation> </message> <message> - <location line="+200"/> - <source>&Show this message again</source> - <translation>Toto hlášení &ukázat ještě jednou</translation> + <source>Component objects cannot declare new properties.</source> + <translation>Předměty součástek nemohou prohlásit nové vlastnosti.</translation> </message> <message> - <location line="-206"/> - <source>Debug Message:</source> - <translation>Hlášení o odladění:</translation> + <source>Component objects cannot declare new signals.</source> + <translation>Předměty součástek nemohou prohlásit nové signály.</translation> </message> <message> - <location line="+3"/> - <source>Warning:</source> - <translation>Varování:</translation> + <source>Component objects cannot declare new functions.</source> + <translation>Předměty součástek nemohou prohlásit nové funkce.</translation> </message> -</context> -<context> - <name>QFile</name> <message> - <location filename="../src/corelib/io/qfile.cpp" line="+905"/> - <source>Cannot create %1 for output</source> - <translation>%1 se nepodařilo zřídit pro výstup</translation> + <source>Cannot create empty component specification</source> + <translation>Nelze vytvořit prázdné vymezení součástky</translation> </message> <message> - <location line="-13"/> - <source>Failure to write block</source> - <translation>Datový blok se nepodařilo zapsat</translation> + <source>Incorrectly specified signal assignment</source> + <translation>Nesprávně vymezené přiřazení signálu</translation> </message> <message> - <location line="-180"/> - <source>Will not rename sequential file using block copy</source> - <translation>Nepřejmenuje posloupný soubor pomocí kopie bloku</translation> + <source>Cannot assign a value to a signal (expecting a script to be run)</source> + <translation>K signálu nelze přiřadit hodnotu (očekává se spuštění skriptu)</translation> </message> <message> - <location line="+23"/> - <source>Cannot remove source file</source> - <translation>Nelze odstranit zdrojový soubor</translation> + <source>Empty signal assignment</source> + <translation>Prázdné přiřazení signálu</translation> </message> <message> - <location line="+130"/> - <source>Cannot open %1 for input</source> - <translation>%1 se nepodařilo otevřít pro čtení</translation> + <source>Empty property assignment</source> + <translation>Prázdné přiřazení vlastnosti</translation> </message> <message> - <location line="-168"/> - <location line="+155"/> - <source>Destination file exists</source> - <translation>Cílový soubor již existuje</translation> + <source>Attached properties cannot be used here</source> + <translation>Na tomto místě nemohou být připojené vlastnosti (typu 'attached') používány</translation> </message> <message> - <location line="+30"/> - <source>Cannot open for output</source> - <translation>Nepodařilo se otevřít pro zápis</translation> + <source>Non-existent attached object</source> + <translation>Pro vlastnost neexistuje žádný připojený předmět</translation> </message> -</context> -<context> - <name>QFileDialog</name> <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/> - <source>Back</source> - <translation>Zpět</translation> + <source>Invalid attached object assignment</source> + <translation>Neplatné přiřazení připojeného předmětu</translation> </message> <message> - <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+464"/> - <location line="+1"/> - <source>File</source> - <translation>Soubor</translation> + <source>Cannot assign to non-existent default property</source> + <translation>Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost</translation> </message> <message> - <location line="+5"/> - <source>File Folder</source> - <comment>Match Windows Explorer</comment> - <translation>Souborová složka</translation> + <source>Cannot assign to non-existent property "%1"</source> + <translation>Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako "%1"</translation> </message> <message> - <location line="+2"/> - <source>Folder</source> - <comment>All other platforms</comment> - <translation>Složka</translation> + <source>Invalid use of namespace</source> + <translation>Neplatné použití jmenného prostoru</translation> </message> <message> - <location line="+9"/> - <source>Alias</source> - <comment>Mac OS X Finder</comment> - <translation>Přezdívka</translation> + <source>Not an attached property name</source> + <translation>Neplatný název pro připojenou vlastnost (typu 'attached')</translation> </message> <message> - <location line="+2"/> - <source>Shortcut</source> - <comment>All other platforms</comment> - <translation>Zkratka</translation> + <source>Invalid use of id property</source> + <translation>Neplatné použití vlastnosti typu 'id'</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+541"/> - <source>Open</source> - <translation>Otevřít</translation> + <source>Property has already been assigned a value</source> + <translation>Vlastnosti již byla přiřazena hodnota</translation> </message> <message> - <location line="+691"/> - <location line="+50"/> - <location line="+1528"/> - <source>&Open</source> - <translation>&Otevřít</translation> + <source>Invalid grouped property access</source> + <translation>Nesprávné seskupení při přístupu k vlastnosti</translation> </message> <message> - <location line="-1578"/> - <location line="+50"/> - <source>&Save</source> - <translation>&Uložit</translation> + <source>Cannot assign a value directly to a grouped property</source> + <translation>U vlastnosti, která je částí seskupení, není žádné přímé přiřazení hodnoty přípustné</translation> </message> <message> - <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="-22"/> - <source>Drive</source> - <translation>Disková jednotka</translation> + <source>Invalid property use</source> + <translation>Neplatné použití vlastnosti</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-714"/> - <source>Show </source> - <translation>Ukázat </translation> + <source>Property assignment expected</source> + <translation>Očekáváno přiřazení vlastnosti</translation> </message> <message> - <location line="+2091"/> - <source>'%1' is write protected. -Do you want to delete it anyway?</source> - <translation>'%1' je chráněn proti zápisu. -Přesto chcete soubor smazat?</translation> + <source>Single property assignment expected</source> + <translation>Očekáváno jednotlivé přiřazení vlastnosti</translation> </message> <message> - <location line="-2077"/> - <location line="+663"/> - <source>File &name:</source> - <translation>Název &souboru:</translation> + <source>Unexpected object assignment</source> + <translation>Nepřípustné přiřazení předmětu</translation> </message> <message> - <location line="+1286"/> - <source>New Folder</source> - <translation>Nová složka</translation> + <source>Cannot assign object to list</source> + <translation>Přiřazení předmětu k seznamům není přípustné</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/> - <source>Parent Directory</source> - <translation>Nadřazený adresář</translation> + <source>Can only assign one binding to lists</source> + <translation>K seznamům lze přiřadit pouze jednu jedinou vazbu</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1956"/> - <source>&New Folder</source> - <translation>&Nová složka</translation> + <source>Cannot assign primitives to lists</source> + <translation>Přiřazení jednoduché hodnoty (primitivy) k seznamům není přípustné</translation> </message> <message> - <location filename="../src/gui/dialogs/qsidebar.cpp" line="+442"/> - <source>Remove</source> - <translation>Odstranit</translation> + <source>Cannot assign multiple values to a script property</source> + <translation>Přiřazení více hodnot k vlastnosti skriptu není přípustné</translation> </message> <message> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/> - <source>My Computer</source> - <translation>Můj počítač</translation> + <source>Invalid property assignment: script expected</source> + <translation>Neplatné přiřazení vlastnosti: očekáván skript</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/> - <source>Look in:</source> - <translation>Hledat v:</translation> + <source>Cannot assign multiple values to a singular property</source> + <translation>Přiřazení více hodnot k jedné vlastnosti není přípustné</translation> </message> <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/> - <source>Files of type:</source> - <translation>Soubory typu:</translation> + <source>Cannot assign object to property</source> + <translation>Přiřazení předmětu k vlastnosti není přípustné</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-36"/> - <source>Find Directory</source> - <translation>Najít adresář</translation> + <source>"%1" cannot operate on "%2"</source> + <translation>"%1" nelze použít na "%2"</translation> </message> <message> - <location line="+35"/> - <source>Show &hidden files</source> - <translation>&Ukázat skryté soubory</translation> + <source>Duplicate default property</source> + <translation>Zdvojená výchozí vlastnost</translation> </message> <message> - <location line="+2090"/> - <source>Are sure you want to delete '%1'?</source> - <translation>Jste si jistý, že %1 chcete smazat?</translation> + <source>Duplicate property name</source> + <translation>Zdvojený název vlastnosti</translation> </message> <message> - <location line="-2121"/> - <source>Save As</source> - <translation>Uložit jako</translation> + <source>Property names cannot begin with an upper case letter</source> + <translation>Názvy vlastností nesmí začínat velkým písmenem</translation> </message> <message> - <location line="+1472"/> - <location line="+862"/> - <source>%1 -Directory not found. -Please verify the correct directory name was given.</source> - <translation>%1 -Adresář se nepodařilo nalézt. -Ověřte, prosím, že byl zadán správný název adresáře.</translation> + <source>Illegal property name</source> + <translation>Neplatný název vlastnosti</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/> - <source>List View</source> - <translation>Pohled se seznamem</translation> + <source>Duplicate signal name</source> + <translation>Zdvojený název signálu</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1635"/> - <location line="+38"/> - <source>&Choose</source> - <translation>&Vybrat</translation> + <source>Signal names cannot begin with an upper case letter</source> + <translation>Názvy signálů nesmí začínat velkým písmenem</translation> </message> <message> - <location line="-707"/> - <source>&Delete</source> - <translation>&Smazat</translation> + <source>Illegal signal name</source> + <translation>Neplatný název signálu</translation> </message> <message> - <location line="-15"/> - <location line="+450"/> - <source>All Files (*)</source> - <translation>Všechny soubory (*)</translation> + <source>Duplicate method name</source> + <translation>Zdvojený název metody</translation> </message> <message> - <location line="+227"/> - <source>Directories</source> - <translation>Adresáře</translation> + <source>Method names cannot begin with an upper case letter</source> + <translation>Názvy metod nesmí začínat velkým písmenem</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+174"/> - <source>All Files (*.*)</source> - <translation>Všechny soubory (*.*)</translation> + <source>Illegal method name</source> + <translation>Neplatný název metody</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-663"/> - <source>&Rename</source> - <translation>&Přejmenovat</translation> + <source>Property value set multiple times</source> + <translation>Vícenásobné přiřazení hodnoty k vlastnosti</translation> </message> <message> - <location line="+2107"/> - <source>Could not delete directory.</source> - <translation>Adresář se nepodařilo smazat.</translation> + <source>Invalid property nesting</source> + <translation>Neplatné vkládání vlastností</translation> </message> <message> - <location line="-2099"/> - <location line="+659"/> - <source>Directory:</source> - <translation>Adresář:</translation> + <source>Cannot override FINAL property</source> + <translation>Nelze přepsat vlastnost prohlašovanou jako 'FINAL'</translation> </message> <message> - <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+29"/> - <source>Unknown</source> - <translation>Neznámý</translation> + <source>Invalid property type</source> + <translation>Neplatný typ vlastnosti</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+810"/> - <source>%1 already exists. -Do you want to replace it?</source> - <translation>Soubor %1 již existuje. -Chcete jej nahradit?</translation> + <source>Invalid empty ID</source> + <translation>Neplatná, protože prázdná, hodnota ID</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/> - <source>Forward</source> - <translation>Dopředu</translation> + <source>IDs cannot start with an uppercase letter</source> + <translation>Hodnoty ID nesmí začínat velkým písmenem</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1040"/> - <source>Recent Places</source> - <translation>Naposledy navštívené</translation> + <source>IDs must start with a letter or underscore</source> + <translation>Hodnoty ID musí začínat písmenem nebo znakem _podtržítka</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/> - <source>Create New Folder</source> - <translation>Vytvořit novou složku</translation> + <source>IDs must contain only letters, numbers, and underscores</source> + <translation>Hodnoty ID musí obsahovat pouze písmena, číslice nebo znaky _podtržítka</translation> </message> <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/> - <source>Detail View</source> - <translation>Podrobný pohled</translation> + <source>ID illegally masks global JavaScript property</source> + <translation>Hodnota ID nedovoleně zakrývá celkovou vlastnost z JavaScriptu</translation> </message> <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1020"/> - <source>%1 -File not found. -Please verify the correct file name was given.</source> - <translation>%1 -Soubor se nepodařilo nalézt. -Ověřte, prosím, že byl zadán správný název souboru.</translation> + <source>No property alias location</source> + <translation>Vlastnost alias bez umístění</translation> </message> -</context> -<context> - <name>QFileSystemModel</name> <message> - <source>Kind</source> - <translation type="obsolete">Druh</translation> + <source>Invalid alias location</source> + <translation>Neplatné umístění alias</translation> </message> <message> - <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+893"/> - <source>Name</source> - <translation>Název</translation> + <source>Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property></source> + <translation>Neplatné odkazování na vlastnost alias. Odkazování na vlastnost alias musí být určeno jako <id>, <id>.<vlastnost> nebo <id>.<vlastnost hodnoty>.<vlastnost></translation> </message> <message> - <location line="+2"/> - <source>Size</source> - <translation>Velikost</translation> + <source>Invalid alias reference. Unable to find id "%1"</source> + <translation>Neplatné odkazování na vlastnost alias. Nelze najít ID "%1"</translation> </message> <message> - <source>Type</source> - <translation type="obsolete">Typ</translation> + <source>Alias property exceeds alias bounds</source> + <translation>Vlastnost alias překračuje vazby alias</translation> </message> +</context> +<context> + <name>QDeclarativeComponent</name> <message> - <location line="-149"/> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+478"/> - <source>%1 GB</source> - <translation>%1 GB</translation> + <source>Invalid empty URL</source> + <translation>Neplátná prázdná adresa (URL)</translation> </message> +</context> +<context> + <name>QDeclarativeConnections</name> <message> - <location line="+4"/> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+4"/> - <source>%1 KB</source> - <translation>%1 KB</translation> + <source>Cannot assign to non-existent property "%1"</source> + <translation>Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako "%1"</translation> </message> <message> - <location line="-2"/> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="-2"/> - <source>%1 MB</source> - <translation>%1 MB</translation> + <source>Connections: nested objects not allowed</source> + <translation>Spojení: vkládané předměty nejsou povoleny</translation> </message> <message> - <location line="-4"/> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="-4"/> - <source>%1 TB</source> - <translation>%1 TB</translation> + <source>Connections: syntax error</source> + <translation>Spojení: chyba ve skladbě</translation> </message> <message> - <location line="+85"/> - <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> - <translation><b>Název "%1" nelze použít.</b><p>Zkuste použít jiný název, s menším počtem znaků nebo bez zvláštních znaků.</translation> + <source>Connections: script expected</source> + <translation>Spojení: očekáván skript</translation> </message> +</context> +<context> + <name>QDeclarativeEngine</name> <message> - <location line="-78"/> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+7"/> - <source>%1 bytes</source> - <translation>%1 bytů</translation> + <source>executeSql called outside transaction()</source> + <translation>'executeSql' byl vyvolán mimo 'transaction()'</translation> </message> <message> - <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+258"/> - <source>My Computer</source> - <translation>Můj počítač</translation> + <source>Read-only Transaction</source> + <translation>Transakce pouze pro čtení</translation> </message> <message> - <location line="+2"/> - <source>Computer</source> - <translation>Počítač</translation> + <source>Version mismatch: expected %1, found %2</source> + <translation>Verzi %2 nelze používat; je třeba %1</translation> </message> <message> - <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+77"/> - <source>Invalid filename</source> - <translation>Neplatný název souboru</translation> + <source>SQL transaction failed</source> + <translation>Transakce SQL se nezdařila</translation> </message> <message> - <location line="+71"/> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation>Druh</translation> + <source>transaction: missing callback</source> + <translation>Transakce: chybí callback (zavolat znovu)</translation> </message> <message> - <location line="+2"/> - <source>Type</source> - <comment>All other platforms</comment> - <translation>Typ</translation> + <source>SQL: database version mismatch</source> + <translation>SQL: Verze databáze neodpovídá očekávané verzi</translation> </message> +</context> +<context> + <name>QDeclarativeFlipable</name> <message> - <location line="+7"/> - <source>Date Modified</source> - <translation>Datum změny</translation> + <source>front is a write-once property</source> + <translation>'front' lze přidělit pouze jednou</translation> + </message> + <message> + <source>back is a write-once property</source> + <translation>'back' lze přidělit pouze jednou</translation> </message> </context> <context> - <name>QFontDatabase</name> + <name>QDeclarativeImportDatabase</name> <message> - <location filename="../src/gui/text/qfontdatabase.cpp" line="+2137"/> - <source>Any</source> - <translation>Všechna</translation> + <source>cannot load module "%1": File name case mismatch for "%2"</source> + <translation>Nelze nahrát modul "%1": Velikost písmen v názvu souboru neodpovídá pro %2</translation> </message> <message> - <location line="+60"/> - <source>Lao</source> - <translation>Laoské</translation> + <source>module "%1" definition "%2" not readable</source> + <translation>Modul "%1" vymezení "%2" nečitelné</translation> </message> <message> - <location line="-2092"/> - <location line="+12"/> - <location line="+1308"/> - <source>Bold</source> - <translation>Tučné</translation> + <source>plugin cannot be loaded for module "%1": %2</source> + <translation>Nelze nahrát přídavný modul pro modul "%1": %2</translation> </message> <message> - <location line="-1306"/> - <source>Demi</source> - <translation>Polotučné</translation> + <source>module "%1" plugin "%2" not found</source> + <translation>Modul "%1" přídavný modul "%2" nenalezen</translation> </message> <message> - <location line="+2075"/> - <source>Thai</source> - <translation>Thajské</translation> + <source>module "%1" version %2.%3 is not installed</source> + <translation>Modul "%1" verze %2.%3 není nainstalován</translation> </message> <message> - <location line="-2083"/> - <location line="+18"/> - <location line="+1294"/> - <source>Black</source> - <translation>Černé</translation> + <source>module "%1" is not installed</source> + <translation>Modul "%1" není nainstalován</translation> </message> <message> - <location line="+720"/> - <source>Greek</source> - <translation>Řecké</translation> + <source>"%1": no such directory</source> + <translation>"%1": žádný takový adresář není</translation> </message> <message> - <location line="+66"/> - <source>Khmer</source> - <translation>Khmerské</translation> + <source>import "%1" has no qmldir and no namespace</source> + <translation>Zavedení "%1" nemá žádný qmldir a nemá žádný jmenný prostor</translation> </message> <message> - <location line="-69"/> - <source>Latin</source> - <translation>Latinské</translation> + <source>- %1 is not a namespace</source> + <translation>- %1 jmenným prostorem</translation> </message> <message> - <location line="-2015"/> - <location line="+1304"/> - <source>Light</source> - <translation>Lehké</translation> + <source>- nested namespaces not allowed</source> + <translation>- vkládané jmenné prostory nejsou povoleny</translation> </message> <message> - <location line="+801"/> - <source>Ogham</source> - <translation>Ogamské</translation> + <source>local directory</source> + <translation>Místní adresář</translation> </message> <message> - <location line="-54"/> - <source>Oriya</source> - <translation>Oriya</translation> + <source>is ambiguous. Found in %1 and in %2</source> + <translation>je dvojznačný. Nalezen v %1 a v %2</translation> </message> <message> - <location line="+57"/> - <source>Runic</source> - <translation>Runové</translation> + <source>is ambiguous. Found in %1 in version %2.%3 and %4.%5</source> + <translation>je dvojznačný. Nalezen v %1 ve verzi %2.%3 a %4.%5</translation> </message> <message> - <location line="-54"/> - <source>Tamil</source> - <translation>Tamilské</translation> + <source>is instantiated recursively</source> + <translation>je doložen příkladem rekurzivně</translation> </message> <message> - <location line="-33"/> - <source>Cyrillic</source> - <translation>Cyrilské</translation> + <source>is not a type</source> + <translation>není typ</translation> </message> <message> - <location line="+39"/> - <source>Kannada</source> - <translation>Kannada</translation> + <source>File name case mismatch for "%2"</source> + <translation>Velikost písmen v názvu souboru neodpovídá pro %2</translation> </message> +</context> +<context> + <name>QDeclarativeKeyNavigationAttached</name> <message> - <location line="+3"/> - <source>Malayalam</source> - <translation>Malayalam</translation> + <source>KeyNavigation is only available via attached properties</source> + <translation>Klávesové navádění (KeyNavigation) je dostupné pouze pomocí připojených vlastností</translation> </message> +</context> +<context> + <name>QDeclarativeKeysAttached</name> <message> - <location line="+24"/> - <source>Simplified Chinese</source> - <translation>Zjednodušená čínština</translation> + <source>Keys is only available via attached properties</source> + <translation>Keys je dostupné pouze pomocí připojených vlastností</translation> </message> +</context> +<context> + <name>QDeclarativeListModel</name> <message> - <location line="-2104"/> - <location line="+1319"/> - <source>Demi Bold</source> - <translation>Polotučné</translation> + <source>remove: index %1 out of range</source> + <translation>odstranit (remove): Index %1 je mimo platnou oblast</translation> </message> <message> - <location line="+728"/> - <source>Arabic</source> - <translation>Arabské</translation> + <source>insert: value is not an object</source> + <translation>vložit (insert): Hodnota není předmětem</translation> </message> <message> - <location line="-3"/> - <source>Hebrew</source> - <translation>Hebrejské</translation> + <source>insert: index %1 out of range</source> + <translation>vložit (insert): Index %1 je mimo platnou oblast</translation> </message> <message> - <location line="+51"/> - <source>Myanmar</source> - <translation>Myanmar</translation> + <source>move: out of range</source> + <translation>přesunout (move): je mimo platnou oblast</translation> </message> <message> - <location line="-1932"/> - <location line="+1161"/> - <source>Italic</source> - <translation>Itala</translation> + <source>append: value is not an object</source> + <translation>připojit (append): Hodnota není předmětem</translation> </message> <message> - <location line="+789"/> - <source>Korean</source> - <translation>Korejské</translation> + <source>set: value is not an object</source> + <translation>nastavit (set): Hodnota není předmětem</translation> </message> <message> - <location line="-2119"/> - <location line="+1335"/> - <source>Normal</source> - <translation>Obvyklé</translation> + <source>set: index %1 out of range</source> + <translation>nastavit (set): Index %1 je mimo platnou oblast</translation> </message> <message> - <location line="-1163"/> - <location line="+1160"/> - <source>Oblique</source> - <translation>Nakloněné</translation> + <source>ListElement: cannot contain nested elements</source> + <translation>ListElement: nelze obsahovat vkládané prvky</translation> </message> <message> - <location line="+748"/> - <source>Telugu</source> - <translation>Telugu</translation> + <source>ListElement: cannot use reserved "id" property</source> + <translation>ListElement: nelze používat vlastnost "ID"</translation> </message> <message> - <location line="-21"/> - <source>Thaana</source> - <translation>Thaana</translation> + <source>ListElement: cannot use script for property value</source> + <translation>ListElement: nelze používat skript pro hodnotu vlastnosti</translation> </message> <message> - <location line="+66"/> - <source>Symbol</source> - <translation>Symbol</translation> + <source>ListModel: undefined property '%1'</source> + <translation>ListModel: Vlastnost '%1' není vymezena</translation> </message> +</context> +<context> + <name>QDeclarativeLoader</name> <message> - <location line="-69"/> - <source>Syriac</source> - <translation>Syrské</translation> + <source>Loader does not support loading non-visual elements.</source> + <translation>Nahrávání neviditelných prvků není podporováno.</translation> </message> +</context> +<context> + <name>QDeclarativeParentAnimation</name> <message> - <location line="+6"/> - <source>Devanagari</source> - <translation>Devanagari</translation> + <source>Unable to preserve appearance under complex transform</source> + <translation>Při složité proměně nelze zachovat vzhled</translation> </message> <message> - <location line="+54"/> - <source>Japanese</source> - <translation>Japonské</translation> + <source>Unable to preserve appearance under non-uniform scale</source> + <translation>Při nejednotné změně velikosti nelze zachovat vzhled</translation> </message> <message> - <location line="-51"/> - <source>Bengali</source> - <translation>Bengálské</translation> + <source>Unable to preserve appearance under scale of 0</source> + <translation>Při změně velikosti s 0 nelze zachovat vzhled</translation> </message> +</context> +<context> + <name>QDeclarativeParentChange</name> <message> - <location line="-18"/> - <source>Armenian</source> - <translation>Arménské</translation> + <source>Unable to preserve appearance under complex transform</source> + <translation>Při složité proměně nelze zachovat vzhled</translation> </message> <message> - <location line="+42"/> - <source>Sinhala</source> - <translation>Sinhálské</translation> + <source>Unable to preserve appearance under non-uniform scale</source> + <translation>Při nejednotné změně velikosti nelze zachovat vzhled</translation> </message> <message> - <location line="+9"/> - <source>Tibetan</source> - <translation>Tibetské</translation> + <source>Unable to preserve appearance under scale of 0</source> + <translation>Při změně velikosti s 0 nelze zachovat vzhled</translation> </message> +</context> +<context> + <name>QDeclarativeParser</name> <message> - <location line="+24"/> - <source>Vietnamese</source> - <translation>Větnamské</translation> + <source>Illegal unicode escape sequence</source> + <translation>Neplatná úniková posloupnost unicode</translation> </message> <message> - <location line="-51"/> - <source>Gujarati</source> - <translation>Gujarati</translation> + <source>Illegal character</source> + <translation>Neplatný znak</translation> </message> <message> - <location line="+42"/> - <source>Traditional Chinese</source> - <translation>Tradiční čínština</translation> + <source>Unclosed string at end of line</source> + <translation>Neuzavřený řetězec na konci řádku</translation> </message> <message> - <location line="-9"/> - <source>Georgian</source> - <translation>Gruzínské</translation> + <source>Illegal escape squence</source> + <translation>Neplatná úniková posloupnost</translation> </message> <message> - <location line="-36"/> - <source>Gurmukhi</source> - <translation>Gurmukhi</translation> + <source>Unclosed comment at end of file</source> + <translation>Neuzavřená poznámka na konci souboru</translation> </message> -</context> -<context> - <name>QFontDialog</name> <message> - <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+776"/> - <source>&Font</source> - <translation>&Písmo</translation> + <source>Illegal syntax for exponential number</source> + <translation>Neplatná skladba exponenciálního čísla</translation> </message> <message> - <location line="+2"/> - <source>&Size</source> - <translation>&Velikost</translation> + <source>Identifier cannot start with numeric literal</source> + <translation>Identifikátor nemůže začínat s číselným překlepem</translation> </message> <message> - <location line="+8"/> - <source>Sample</source> - <translation>Vzorek</translation> + <source>Unterminated regular expression literal</source> + <translation>Neuzavřený regulární výraz</translation> </message> <message> - <location line="-9"/> - <source>Font st&yle</source> - <translation>Druh pís&ma</translation> + <source>Invalid regular expression flag '%0'</source> + <translation>Neplatný příznak '%0' u regulárního výrazu</translation> </message> <message> - <location line="+10"/> - <source>Wr&iting System</source> - <translation>Způsob &psaní</translation> + <source>Unterminated regular expression backslash sequence</source> + <translation>Neuzavřená posloupnost se zpětným lomítkem u regulárního výrazu</translation> </message> <message> - <location line="-609"/> - <location line="+257"/> - <source>Select Font</source> - <translation>Vybrat písmo</translation> + <source>Unterminated regular expression class</source> + <translation>Neuzavřená třída u neuzavřeného regulárního výrazu</translation> </message> <message> - <location line="+350"/> - <source>&Underline</source> - <translation>&Podtrhnout</translation> + <source>Syntax error</source> + <translation>Chyba ve skladbě</translation> </message> <message> - <location line="-3"/> - <source>Effects</source> - <translation>Efekty</translation> + <source>Unexpected token `%1'</source> + <translation>Neočekávaný symbol `%1'</translation> </message> <message> - <location line="+2"/> - <source>Stri&keout</source> - <translation>Pře&škrtnout</translation> + <source>Expected token `%1'</source> + <translation>Očekávaný symbol `%1'</translation> </message> -</context> -<context> - <name>QFtp</name> <message> - <location filename="../src/network/access/qftp.cpp" line="+2333"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+2021"/> - <source>Listing directory failed: -%1</source> - <translation>Obsah adresářů nelze ukázat: -%1</translation> + <source>Property value set multiple times</source> + <translation>Vícenásobné přiřazení hodnoty k vlastnosti</translation> </message> <message> - <location line="+20"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+15"/> - <source>Creating directory failed: -%1</source> - <translation>Vytvoření adresářů se nezdařilo: -%1</translation> + <source>Expected type name</source> + <translation>Očekávaný název typu</translation> </message> <message> - <location line="-1525"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1353"/> - <source>Not connected</source> - <translation>Žádné spojení</translation> + <source>Invalid import qualifier ID</source> + <translation>Neplatný údaj o ID při zavádění</translation> </message> <message> - <location line="+399"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+332"/> - <source>Connection refused for data connection</source> - <translation>Odmítnuto spojení spojení pro data</translation> + <source>Reserved name "Qt" cannot be used as an qualifier</source> + <translation>Zamluvený název "Qt" nemůže být použit jako kvalifikant</translation> </message> <message> - <location line="+1102"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+1003"/> - <source>Login failed: -%1</source> - <translation>Přihlášení se nezdařilo: -%1</translation> + <source>Script import qualifiers must be unique.</source> + <translation>Kvalifikanty zadané pro zavedení skriptu musí být jednoznačné.</translation> </message> <message> - <location line="+12"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+9"/> - <source>Downloading file failed: -%1</source> - <translation>Stažení souboru se nezdařilo: -%1</translation> + <source>Script import requires a qualifier</source> + <translation>Zavedení skriptu vyžaduje údaj o kvalifikantu</translation> </message> <message> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+285"/> - <source>Connected to host</source> - <translation>Spojení s počítačem navázáno</translation> + <source>Library import requires a version</source> + <translation>Zavedení knihovny vyžaduje údaj o verzi</translation> </message> <message> - <location filename="../src/network/access/qftp.cpp" line="-1437"/> - <source>Connection timed out to host %1</source> - <translation>Časový limit pro spojení s počítačem '%1' byl překročen</translation> + <source>Expected parameter type</source> + <translation>Očekáván typ parametru</translation> </message> <message> - <location line="+104"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1458"/> - <location line="+1451"/> - <source>Connected to host %1</source> - <translation>Spojeno s počítačem %1</translation> + <source>Invalid property type modifier</source> + <translation>Neplatný modifikátor pro typ vlastnosti</translation> </message> <message> - <location line="+1317"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-290"/> - <source>Connecting to host failed: -%1</source> - <translation>Spojení s počítačem se nezdařilo: -%1</translation> + <source>Unexpected property type modifier</source> + <translation>Neočekávaný modifikátor pro typ vlastnosti</translation> </message> <message> - <location line="-1429"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1267"/> - <source>Host %1 not found</source> - <translation>Počítač %1 se nepodařilo nalézt</translation> + <source>Expected property type</source> + <translation>Očekáván typ vlastnosti</translation> </message> <message> - <location line="+1449"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+1282"/> - <source>Uploading file failed: -%1</source> - <translation>Nahrání souboru se nezdařilo: -%1</translation> + <source>Readonly not yet supported</source> + <translation>"Pouze pro čtení" není na tomto místě ještě nepodporováno</translation> </message> <message> - <location line="-8"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-6"/> - <source>Changing directory failed: -%1</source> - <translation>Změna adresáře se nezdařila: -%1</translation> + <source>JavaScript declaration outside Script element</source> + <translation>Prohlášení JavaScriptu není mimo prvek skriptu přípustné</translation> </message> +</context> +<context> + <name>QDeclarativePauseAnimation</name> <message> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+286"/> - <source>Host found</source> - <translation>Počítač byl nalezen</translation> + <source>Cannot set a duration of < 0</source> + <translation>Nelze nastavit dobu trvání < 0</translation> </message> +</context> +<context> + <name>QDeclarativePixmap</name> <message> - <location filename="../src/network/access/qftp.cpp" line="+20"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-271"/> - <source>Removing directory failed: -%1</source> - <translation>Odstranění adresáře se nezdařilo: -%1</translation> + <source>Error decoding: %1: %2</source> + <translation>Chba při dekódování: %1: %2</translation> </message> <message> - <location line="-1457"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1287"/> - <source>Connection refused to host %1</source> - <translation>Spojení s počítačem %1 odmítnuto</translation> + <source>Failed to get image from provider: %1</source> + <translation>Obrazová data se od poskytovatele nepodařilo získat: %1</translation> </message> <message> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+1555"/> - <source>Connection to %1 closed</source> - <translation>Spojení s %1 ukončeno</translation> + <source>Cannot open: %1</source> + <translation>Nelze otevřít: %1</translation> </message> +</context> +<context> + <name>QDeclarativePropertyAnimation</name> <message> - <location filename="../src/network/access/qftp.cpp" line="+1449"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-274"/> - <source>Removing file failed: -%1</source> - <translation>Odstranění souboru se nezdařilo: -%1</translation> + <source>Cannot set a duration of < 0</source> + <translation>Nelze nastavit dobu trvání < 0</translation> </message> +</context> +<context> + <name>QDeclarativePropertyChanges</name> <message> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+270"/> - <source>Host %1 found</source> - <translation>Počítač %1 byl nalezen</translation> + <source>PropertyChanges does not support creating state-specific objects.</source> + <translation>PropertyChanges nepodporuje vytváření předmětů, které jsou přiřazeny jednomu stavu.</translation> </message> <message> - <location filename="../src/network/access/qftp.cpp" line="-944"/> - <location line="+29"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1093"/> - <location line="+728"/> - <source>Unknown error</source> - <translation>Neznámá chyba</translation> + <source>Cannot assign to non-existent property "%1"</source> + <translation>Nelze provést žádné přiřazení, neboť neexistuje výchozí vlastnost pojmenovaná jako "%1"</translation> </message> <message> - <location line="+951"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+126"/> - <location line="+250"/> - <source>Connection closed</source> - <translation>Spojení ukončeno</translation> + <source>Cannot assign to read-only property "%1"</source> + <translation>Vlastnost '%1" je pouze pro čtení a nelze ji proto přiřadit</translation> </message> </context> <context> - <name>QHostInfo</name> + <name>QDeclarativeTextInput</name> <message> - <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/> - <source>Unknown error</source> - <translation>Neznámá chyba</translation> + <source>Could not load cursor delegate</source> + <translation>Nepodařilo se nahrát zástupce kurzoru</translation> </message> -</context> -<context> - <name>QHostInfoAgent</name> <message> - <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+257"/> - <location line="+32"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+220"/> - <location line="+27"/> - <source>Host not found</source> - <translation>Nepodařilo se najít počítač</translation> + <source>Could not instantiate cursor delegate</source> + <translation>Zástupce kurzoru se nepodařilo doložit příkladem</translation> </message> +</context> +<context> + <name>QDeclarativeTypeLoader</name> <message> - <location line="-45"/> - <location line="+39"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/> - <location line="+29"/> - <source>Unknown address type</source> - <translation>Neznámý typ adresy</translation> + <source>Script %1 unavailable</source> + <translation>Skript %1 nedostupný</translation> </message> <message> - <location line="+10"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/> - <location line="+27"/> - <source>Unknown error</source> - <translation>Neznámá chyba</translation> + <source>Type %1 unavailable</source> + <translation>Typ %1 nedostupný</translation> </message> <message> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-67"/> - <source>No host name given</source> - <translation>Nebyl zadán název pro hostitelský počítač</translation> + <source>Namespace %1 cannot be used as a type</source> + <translation>Jmenný prostor %1 nelze použít jako typ</translation> </message> <message> - <location line="+0"/> - <source>Invalid hostname</source> - <translation>Neplatný název pro hostitelský počítač</translation> + <source>%1 %2</source> + <translation>%1 %2</translation> </message> </context> <context> - <name>QHttp</name> + <name>QDeclarativeVME</name> <message> - <location filename="../src/network/access/qhttp.cpp" line="+2636"/> - <source>Connection refused (or timed out)</source> - <translation>Spojení bylo odmítnuto (nebo byl překročen časový limit)</translation> + <source>Unable to create object of type %1</source> + <translation>Nepodařilo se vytvořit žádný předmět typu %1</translation> </message> <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+584"/> - <source>Data corrupted</source> - <translation>Data jsou poškozena</translation> + <source>Cannot assign value %1 to property %2</source> + <translation>Hodnotu '%1' nelze přiřadit vlastnosti %2</translation> </message> <message> - <location filename="../src/qt3support/network/q3http.cpp" line="+2308"/> - <source>Connected to host</source> - <translation>Spojení s počítačem navázáno</translation> + <source>Cannot assign object type %1 with no default method</source> + <translation>Typ předmětu %1 nelze přiřadit, protože neexistuje žádná výchozí metoda</translation> </message> <message> - <location line="-14"/> - <source>Connected to host %1</source> - <translation>Spojeno s počítačem %1</translation> + <source>Cannot connect mismatched signal/slot %1 %vs. %2</source> + <translation>Nelze vytvořit žádné spojení mezi signálem %1 a otvorem %2, protože se k sobě nehodí</translation> </message> <message> - <location filename="../src/network/access/qhttp.cpp" line="+3"/> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-19"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-456"/> - <source>Host %1 not found</source> - <translation>Počítač %1 se nepodařilo nalézt</translation> + <source>Cannot assign an object to signal property %1</source> + <translation>Vlastnosti signálu %1 nelze přiřadit žádný předmět</translation> </message> <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+16"/> - <source>Host requires authentication</source> - <translation>Hostitelský počítač požaduje autentizaci</translation> + <source>Cannot assign object to list</source> + <translation>Přiřazení předmětu k seznamům není přípustné</translation> </message> <message> - <location filename="../src/network/access/qhttp.cpp" line="+325"/> - <source>Error writing response to device</source> - <translation>Při psaní odpovědi výstupnímu zařízení se vyskytla chyba</translation> + <source>Cannot assign object to interface property</source> + <translation>Vlastnosti rozhraní nelze přiřadit žádný předmět</translation> </message> <message> - <location line="-2594"/> - <source>HTTPS connection requested but SSL support not compiled in</source> - <translation>Požadované HTTPS spojení nelze vytvořit, protože neexistuje žádná SSL podpora</translation> + <source>Unable to create attached object</source> + <translation>Nepodařilo se vytvořit žádný připojený předmět (typu 'attached')</translation> </message> <message> - <location filename="../src/qt3support/network/q3http.cpp" line="+467"/> - <source>Host found</source> - <translation>Počítač byl nalezen</translation> + <source>Cannot set properties on %1 as it is null</source> + <translation>Vlastnosti nelze nastavit na %1, protože jsou 'null'</translation> </message> +</context> +<context> + <name>QDeclarativeVisualDataModel</name> <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-12"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-470"/> - <source>Connection refused</source> - <translation>Spojení bylo odmítnuto</translation> + <source>Delegate component must be Item type.</source> + <translation>Součástka zástupce musí být typu 'item'.</translation> </message> +</context> +<context> + <name>QDeclarativeXmlListModel</name> <message> - <location filename="../src/network/access/qhttp.cpp" line="+2421"/> - <source>Proxy authentication required</source> - <translation>Požadována proxy autentizace</translation> + <source>Qt was built without support for xmlpatterns</source> + <translation>Qt bylo sestaveno bez podpory pro xmlpatterns</translation> </message> +</context> +<context> + <name>QDeclarativeXmlListModelRole</name> <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+18"/> - <source>Unknown protocol specified</source> - <translation>Byl zadán neznámý protokol</translation> + <source>An XmlRole query must not start with '/'</source> + <translation>Vyhledávání XmlRole nesmí začínat s '/'</translation> </message> +</context> +<context> + <name>QDeclarativeXmlRoleList</name> <message> - <location filename="../src/network/access/qhttp.cpp" line="-132"/> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-12"/> - <location line="+19"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+6"/> - <source>HTTP request failed</source> - <translation>HTTP dotaz se nezdařil</translation> + <source>An XmlListModel query must start with '/' or "//"</source> + <translation>Vyhledávání XmlListModel musí začínat s '/' nebo "//"</translation> </message> +</context> +<context> + <name>QDial</name> <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-16"/> - <source>Proxy requires authentication</source> - <translation>Proxy server požaduje autentizaci</translation> + <source>QDial</source> + <translation>QDial</translation> </message> <message> - <location filename="../src/network/access/qhttp.cpp" line="+136"/> - <source>Authentication required</source> - <translation>Požadována autentizace</translation> + <source>SliderHandle</source> + <translation>Posuvník</translation> </message> <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+12"/> - <source>SSL handshake failed</source> - <translation>Během startu SSL protokolu se vyskytla chyba</translation> + <source>SpeedoMeter</source> + <translation>Rychloměr</translation> </message> +</context> +<context> + <name>QDialog</name> <message> - <location filename="../src/qt3support/network/q3http.cpp" line="+456"/> - <source>Connection to %1 closed</source> - <translation>Spojení s %1 ukončeno</translation> + <source>Done</source> + <translation>Hotovo</translation> </message> <message> - <location filename="../src/network/access/qhttp.cpp" line="+83"/> - <location line="+48"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-347"/> - <location line="+47"/> - <source>Invalid HTTP chunked body</source> - <translation>Obsah (chunked body - rozkouskované tělo) HTTP je neplatný</translation> + <source>What's This?</source> + <translation>Co je toto?</translation> </message> +</context> +<context> + <name>QDialogButtonBox</name> <message> - <location filename="../src/qt3support/network/q3http.cpp" line="+294"/> - <source>Host %1 found</source> - <translation>Počítač %1 byl nalezen</translation> + <source>OK</source> + <translation>OK</translation> </message> <message> - <location filename="../src/network/access/qhttp.cpp" line="-349"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-498"/> - <source>Wrong content length</source> - <translation>Neplatný údaj o délce obsahu</translation> + <source>&OK</source> + <translation>&OK</translation> </message> <message> - <location line="-995"/> - <location line="+820"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-634"/> - <location line="+567"/> - <source>Unknown error</source> - <translation>Neznámá chyba</translation> + <source>&No</source> + <translation>&Ne</translation> </message> <message> - <location line="+351"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+184"/> - <source>Invalid HTTP response header</source> - <translation>Hlavička HTTP odpovědi není platná</translation> + <source>&Yes</source> + <translation>&Ano</translation> </message> <message> - <location line="+28"/> - <source>Unknown authentication method</source> - <translation>Neznámý způsob autentizace</translation> + <source>Help</source> + <translation>Nápověda</translation> </message> <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-18"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+401"/> - <source>Connection closed</source> - <translation>Spojení ukončeno</translation> + <source>Open</source> + <translation>Otevřít</translation> </message> <message> - <location filename="../src/network/access/qhttp.cpp" line="-368"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-574"/> - <source>No server set to connect to</source> - <translation>Pro spojení nebyl nastaven žádný počítač - server</translation> + <source>Save</source> + <translation>Uložit</translation> </message> <message> - <location line="+168"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+60"/> - <source>Server closed connection unexpectedly</source> - <translation>Server neočekávaně uzavřel spojení</translation> + <source>&Save</source> + <translation>&Uložit</translation> + </message> + <message> + <source>Abort</source> + <translation>Zrušit</translation> + </message> + <message> + <source>Apply</source> + <translation>Použít</translation> + </message> + <message> + <source>Close</source> + <translation>Zavřít</translation> + </message> + <message> + <source>Reset</source> + <translation>Vrátit</translation> + </message> + <message> + <source>Retry</source> + <translation>Opakovat</translation> + </message> + <message> + <source>Restore Defaults</source> + <translation>Obnovit výchozí</translation> + </message> + <message> + <source>&Close</source> + <translation>&Zavřít</translation> + </message> + <message> + <source>Cancel</source> + <translation>Zrušit</translation> + </message> + <message> + <source>Ignore</source> + <translation>Přehlížet</translation> + </message> + <message> + <source>Close without Saving</source> + <translation>Zavřít bez uložení</translation> + </message> + <message> + <source>N&o to All</source> + <translation>N&e, žádné</translation> + </message> + <message> + <source>Save All</source> + <translation>Uložit vše</translation> + </message> + <message> + <source>&Cancel</source> + <translation>&Zrušit</translation> + </message> + <message> + <source>Discard</source> + <translation>Odmítnout</translation> + </message> + <message> + <source>Yes to &All</source> + <translation>Ano, &vše</translation> + </message> + <message> + <source>Don't Save</source> + <translation>Neukládat</translation> + </message> +</context> +<context> + <name>QDirModel</name> + <message> + <source>Kind</source> + <translation type="obsolete">Druh</translation> + </message> + <message> + <source>Name</source> + <translation>Název</translation> + </message> + <message> + <source>Size</source> + <translation>Velikost</translation> + </message> + <message> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>Druh</translation> + </message> + <message> + <source>Type</source> + <comment>All other platforms</comment> + <translation>Typ</translation> + </message> + <message> + <source>Type</source> + <translation type="obsolete">Typ</translation> + </message> + <message> + <source>Date Modified</source> + <translation>Datum změny</translation> + </message> +</context> +<context> + <name>QDockWidget</name> + <message> + <source>Dock</source> + <translation>Vplout do panelu</translation> + </message> + <message> + <source>Close</source> + <translation>Zavřít</translation> + </message> + <message> + <source>Float</source> + <translation>Plout</translation> + </message> +</context> +<context> + <name>QDoubleSpinBox</name> + <message> + <source>Less</source> + <translation>Méně</translation> + </message> + <message> + <source>More</source> + <translation>Více</translation> + </message> +</context> +<context> + <name>QErrorMessage</name> + <message> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <source>Fatal Error:</source> + <translation>Osudová chyba:</translation> + </message> + <message> + <source>&Show this message again</source> + <translation>Toto hlášení &ukázat ještě jednou</translation> + </message> + <message> + <source>Debug Message:</source> + <translation>Hlášení o odladění:</translation> + </message> + <message> + <source>Warning:</source> + <translation>Varování:</translation> + </message> +</context> +<context> + <name>QFile</name> + <message> + <source>Cannot create %1 for output</source> + <translation>%1 se nepodařilo zřídit pro výstup</translation> + </message> + <message> + <source>Failure to write block</source> + <translation>Datový blok se nepodařilo zapsat</translation> + </message> + <message> + <source>Will not rename sequential file using block copy</source> + <translation>Nepřejmenuje posloupný soubor pomocí kopie bloku</translation> + </message> + <message> + <source>Cannot remove source file</source> + <translation>Nelze odstranit zdrojový soubor</translation> + </message> + <message> + <source>Cannot open %1 for input</source> + <translation>%1 se nepodařilo otevřít pro čtení</translation> + </message> + <message> + <source>Destination file exists</source> + <translation>Cílový soubor již existuje</translation> + </message> + <message> + <source>Cannot open for output</source> + <translation>Nepodařilo se otevřít pro zápis</translation> + </message> +</context> +<context> + <name>QFileDialog</name> + <message> + <source>Back</source> + <translation>Zpět</translation> + </message> + <message> + <source>File</source> + <translation>Soubor</translation> + </message> + <message> + <source>File Folder</source> + <comment>Match Windows Explorer</comment> + <translation>Souborová složka</translation> + </message> + <message> + <source>Folder</source> + <comment>All other platforms</comment> + <translation>Složka</translation> + </message> + <message> + <source>Alias</source> + <comment>Mac OS X Finder</comment> + <translation>Přezdívka</translation> + </message> + <message> + <source>Shortcut</source> + <comment>All other platforms</comment> + <translation>Zkratka</translation> + </message> + <message> + <source>Open</source> + <translation>Otevřít</translation> + </message> + <message> + <source>&Open</source> + <translation>&Otevřít</translation> + </message> + <message> + <source>&Save</source> + <translation>&Uložit</translation> + </message> + <message> + <source>Drive</source> + <translation>Disková jednotka</translation> + </message> + <message> + <source>Show </source> + <translation>Ukázat </translation> + </message> + <message> + <source>'%1' is write protected. +Do you want to delete it anyway?</source> + <translation>'%1' je chráněn proti zápisu. +Přesto chcete soubor smazat?</translation> + </message> + <message> + <source>File &name:</source> + <translation>Název &souboru:</translation> + </message> + <message> + <source>New Folder</source> + <translation>Nová složka</translation> + </message> + <message> + <source>Parent Directory</source> + <translation>Nadřazený adresář</translation> + </message> + <message> + <source>&New Folder</source> + <translation>&Nová složka</translation> + </message> + <message> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <source>My Computer</source> + <translation>Můj počítač</translation> + </message> + <message> + <source>Look in:</source> + <translation>Hledat v:</translation> + </message> + <message> + <source>Files of type:</source> + <translation>Soubory typu:</translation> + </message> + <message> + <source>Find Directory</source> + <translation>Najít adresář</translation> + </message> + <message> + <source>Show &hidden files</source> + <translation>&Ukázat skryté soubory</translation> + </message> + <message> + <source>Are sure you want to delete '%1'?</source> + <translation>Jste si jistý, že %1 chcete smazat?</translation> + </message> + <message> + <source>Save As</source> + <translation>Uložit jako</translation> + </message> + <message> + <source>%1 +Directory not found. +Please verify the correct directory name was given.</source> + <translation>%1 +Adresář se nepodařilo nalézt. +Ověřte, prosím, že byl zadán správný název adresáře.</translation> + </message> + <message> + <source>List View</source> + <translation>Pohled se seznamem</translation> + </message> + <message> + <source>&Choose</source> + <translation>&Vybrat</translation> + </message> + <message> + <source>&Delete</source> + <translation>&Smazat</translation> + </message> + <message> + <source>All Files (*)</source> + <translation>Všechny soubory (*)</translation> + </message> + <message> + <source>Directories</source> + <translation>Adresáře</translation> + </message> + <message> + <source>All Files (*.*)</source> + <translation>Všechny soubory (*.*)</translation> + </message> + <message> + <source>&Rename</source> + <translation>&Přejmenovat</translation> + </message> + <message> + <source>Could not delete directory.</source> + <translation>Adresář se nepodařilo smazat.</translation> + </message> + <message> + <source>Directory:</source> + <translation>Adresář:</translation> + </message> + <message> + <source>Unknown</source> + <translation>Neznámý</translation> + </message> + <message> + <source>%1 already exists. +Do you want to replace it?</source> + <translation>Soubor %1 již existuje. +Chcete jej nahradit?</translation> + </message> + <message> + <source>Forward</source> + <translation>Dopředu</translation> + </message> + <message> + <source>Recent Places</source> + <translation>Naposledy navštívené</translation> + </message> + <message> + <source>Create New Folder</source> + <translation>Vytvořit novou složku</translation> + </message> + <message> + <source>Detail View</source> + <translation>Podrobný pohled</translation> + </message> + <message> + <source>%1 +File not found. +Please verify the correct file name was given.</source> + <translation>%1 +Soubor se nepodařilo nalézt. +Ověřte, prosím, že byl zadán správný název souboru.</translation> + </message> + <message> + <source>Go back</source> + <translation>Jít zpět</translation> + </message> + <message> + <source>Go forward</source> + <translation>Jít dopředu</translation> + </message> + <message> + <source>Go to the parent directory</source> + <translation>Jít do rodičovského adresáře</translation> + </message> + <message> + <source>Create a New Folder</source> + <translation>Vytvořit novou složku</translation> + </message> + <message> + <source>Change to list view mode</source> + <translation>Změnit na režim pohledu se seznamem</translation> + </message> + <message> + <source>Change to detail view mode</source> + <translation>Změnit na režim s podrobným pohledem</translation> + </message> +</context> +<context> + <name>QFileSystemModel</name> + <message> + <source>Kind</source> + <translation type="obsolete">Druh</translation> + </message> + <message> + <source>Name</source> + <translation>Název</translation> + </message> + <message> + <source>Size</source> + <translation>Velikost</translation> + </message> + <message> + <source>Type</source> + <translation type="obsolete">Typ</translation> + </message> + <message> + <source>%1 GB</source> + <translation>%1 GB</translation> + </message> + <message> + <source>%1 KB</source> + <translation>%1 KB</translation> + </message> + <message> + <source>%1 MB</source> + <translation>%1 MB</translation> + </message> + <message> + <source>%1 TB</source> + <translation>%1 TB</translation> + </message> + <message> + <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> + <translation><b>Název "%1" nelze použít.</b><p>Zkuste použít jiný název, s menším počtem znaků nebo bez zvláštních znaků.</translation> + </message> + <message> + <source>%1 bytes</source> + <translation>%1 bytů</translation> + </message> + <message> + <source>My Computer</source> + <translation>Můj počítač</translation> + </message> + <message> + <source>Computer</source> + <translation>Počítač</translation> + </message> + <message> + <source>Invalid filename</source> + <translation>Neplatný název souboru</translation> + </message> + <message> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>Druh</translation> + </message> + <message> + <source>Type</source> + <comment>All other platforms</comment> + <translation>Typ</translation> + </message> + <message> + <source>Date Modified</source> + <translation>Datum změny</translation> + </message> + <message> + <source>%1 byte(s)</source> + <translation>%1 byt(ů)</translation> + </message> +</context> +<context> + <name>QFontDatabase</name> + <message> + <source>Any</source> + <translation>Všechna</translation> + </message> + <message> + <source>Lao</source> + <translation>Laoské</translation> + </message> + <message> + <source>Bold</source> + <translation>Tučné</translation> + </message> + <message> + <source>Demi</source> + <translation>Polotučné</translation> + </message> + <message> + <source>Thai</source> + <translation>Thajské</translation> + </message> + <message> + <source>Black</source> + <translation>Černé</translation> + </message> + <message> + <source>Greek</source> + <translation>Řecké</translation> + </message> + <message> + <source>Khmer</source> + <translation>Khmerské</translation> + </message> + <message> + <source>Latin</source> + <translation>Latinské</translation> + </message> + <message> + <source>Light</source> + <translation>Lehké</translation> + </message> + <message> + <source>Ogham</source> + <translation>Ogamské</translation> + </message> + <message> + <source>Oriya</source> + <translation>Oriya</translation> + </message> + <message> + <source>Runic</source> + <translation>Runové</translation> + </message> + <message> + <source>Tamil</source> + <translation>Tamilské</translation> + </message> + <message> + <source>Cyrillic</source> + <translation>Cyrilské</translation> + </message> + <message> + <source>Kannada</source> + <translation>Kannada</translation> + </message> + <message> + <source>Malayalam</source> + <translation>Malayalam</translation> + </message> + <message> + <source>Simplified Chinese</source> + <translation>Zjednodušená čínština</translation> + </message> + <message> + <source>N'Ko</source> + <translation>N'Ko</translation> + </message> + <message> + <source>Demi Bold</source> + <translation>Polotučné</translation> + </message> + <message> + <source>Arabic</source> + <translation>Arabské</translation> + </message> + <message> + <source>Hebrew</source> + <translation>Hebrejské</translation> + </message> + <message> + <source>Myanmar</source> + <translation>Myanmar</translation> + </message> + <message> + <source>Italic</source> + <translation>Itala</translation> + </message> + <message> + <source>Korean</source> + <translation>Korejské</translation> + </message> + <message> + <source>Normal</source> + <translation>Obvyklé</translation> + </message> + <message> + <source>Oblique</source> + <translation>Nakloněné</translation> + </message> + <message> + <source>Telugu</source> + <translation>Telugu</translation> + </message> + <message> + <source>Thaana</source> + <translation>Thaana</translation> + </message> + <message> + <source>Symbol</source> + <translation>Symbol</translation> + </message> + <message> + <source>Syriac</source> + <translation>Syrské</translation> + </message> + <message> + <source>Devanagari</source> + <translation>Devanagari</translation> + </message> + <message> + <source>Japanese</source> + <translation>Japonské</translation> + </message> + <message> + <source>Bengali</source> + <translation>Bengálské</translation> + </message> + <message> + <source>Armenian</source> + <translation>Arménské</translation> + </message> + <message> + <source>Sinhala</source> + <translation>Sinhálské</translation> + </message> + <message> + <source>Tibetan</source> + <translation>Tibetské</translation> + </message> + <message> + <source>Vietnamese</source> + <translation>Větnamské</translation> + </message> + <message> + <source>Gujarati</source> + <translation>Gujarati</translation> + </message> + <message> + <source>Traditional Chinese</source> + <translation>Tradiční čínština</translation> + </message> + <message> + <source>Georgian</source> + <translation>Gruzínské</translation> + </message> + <message> + <source>Gurmukhi</source> + <translation>Gurmukhi</translation> + </message> +</context> +<context> + <name>QFontDialog</name> + <message> + <source>&Font</source> + <translation>&Písmo</translation> + </message> + <message> + <source>&Size</source> + <translation>&Velikost</translation> + </message> + <message> + <source>Sample</source> + <translation>Vzorek</translation> + </message> + <message> + <source>Font st&yle</source> + <translation>Druh pís&ma</translation> + </message> + <message> + <source>Wr&iting System</source> + <translation>Způsob &psaní</translation> + </message> + <message> + <source>Select Font</source> + <translation>Vybrat písmo</translation> + </message> + <message> + <source>&Underline</source> + <translation>&Podtrhnout</translation> + </message> + <message> + <source>Effects</source> + <translation>Efekty</translation> + </message> + <message> + <source>Stri&keout</source> + <translation>Pře&škrtnout</translation> + </message> +</context> +<context> + <name>QFtp</name> + <message> + <source>Listing directory failed: +%1</source> + <translation>Obsah adresářů nelze ukázat: +%1</translation> + </message> + <message> + <source>Creating directory failed: +%1</source> + <translation>Vytvoření adresářů se nezdařilo: +%1</translation> + </message> + <message> + <source>Not connected</source> + <translation>Žádné spojení</translation> + </message> + <message> + <source>Connection refused for data connection</source> + <translation>Odmítnuto spojení spojení pro data</translation> + </message> + <message> + <source>Login failed: +%1</source> + <translation>Přihlášení se nezdařilo: +%1</translation> + </message> + <message> + <source>Downloading file failed: +%1</source> + <translation>Stažení souboru se nezdařilo: +%1</translation> + </message> + <message> + <source>Connected to host</source> + <translation>Spojení s počítačem navázáno</translation> + </message> + <message> + <source>Connection timed out to host %1</source> + <translation>Časový limit pro spojení s počítačem '%1' byl překročen</translation> + </message> + <message> + <source>Connected to host %1</source> + <translation>Spojeno s počítačem %1</translation> + </message> + <message> + <source>Connecting to host failed: +%1</source> + <translation>Spojení s počítačem se nezdařilo: +%1</translation> + </message> + <message> + <source>Host %1 not found</source> + <translation>Počítač %1 se nepodařilo nalézt</translation> + </message> + <message> + <source>Uploading file failed: +%1</source> + <translation>Nahrání souboru se nezdařilo: +%1</translation> + </message> + <message> + <source>Changing directory failed: +%1</source> + <translation>Změna adresáře se nezdařila: +%1</translation> + </message> + <message> + <source>Host found</source> + <translation>Počítač byl nalezen</translation> + </message> + <message> + <source>Removing directory failed: +%1</source> + <translation>Odstranění adresáře se nezdařilo: +%1</translation> + </message> + <message> + <source>Connection refused to host %1</source> + <translation>Spojení s počítačem %1 odmítnuto</translation> + </message> + <message> + <source>Connection to %1 closed</source> + <translation>Spojení s %1 ukončeno</translation> + </message> + <message> + <source>Removing file failed: +%1</source> + <translation>Odstranění souboru se nezdařilo: +%1</translation> + </message> + <message> + <source>Host %1 found</source> + <translation>Počítač %1 byl nalezen</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> + </message> + <message> + <source>Connection closed</source> + <translation>Spojení ukončeno</translation> + </message> +</context> +<context> + <name>QHostInfo</name> + <message> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> + </message> + <message> + <source>No host name given</source> + <translation>Nebyl zadán název pro hostitelský počítač</translation> + </message> +</context> +<context> + <name>QHostInfoAgent</name> + <message> + <source>Host not found</source> + <translation>Nepodařilo se najít počítač</translation> + </message> + <message> + <source>Unknown address type</source> + <translation>Neznámý typ adresy</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> + </message> + <message> + <source>No host name given</source> + <translation>Nebyl zadán název pro hostitelský počítač</translation> + </message> + <message> + <source>Invalid hostname</source> + <translation>Neplatný název pro hostitelský počítač</translation> + </message> +</context> +<context> + <name>QHttp</name> + <message> + <source>Connection refused (or timed out)</source> + <translation>Spojení bylo odmítnuto (nebo byl překročen časový limit)</translation> + </message> + <message> + <source>Data corrupted</source> + <translation>Data jsou poškozena</translation> + </message> + <message> + <source>Connected to host</source> + <translation>Spojení s počítačem navázáno</translation> + </message> + <message> + <source>Connected to host %1</source> + <translation>Spojeno s počítačem %1</translation> + </message> + <message> + <source>Host %1 not found</source> + <translation>Počítač %1 se nepodařilo nalézt</translation> + </message> + <message> + <source>Host requires authentication</source> + <translation>Hostitelský počítač požaduje autentizaci</translation> + </message> + <message> + <source>Error writing response to device</source> + <translation>Při psaní odpovědi výstupnímu zařízení se vyskytla chyba</translation> + </message> + <message> + <source>HTTPS connection requested but SSL support not compiled in</source> + <translation>Požadované HTTPS spojení nelze vytvořit, protože neexistuje žádná SSL podpora</translation> + </message> + <message> + <source>Host found</source> + <translation>Počítač byl nalezen</translation> + </message> + <message> + <source>Connection refused</source> + <translation>Spojení bylo odmítnuto</translation> + </message> + <message> + <source>Proxy authentication required</source> + <translation>Požadována proxy autentizace</translation> + </message> + <message> + <source>Unknown protocol specified</source> + <translation>Byl zadán neznámý protokol</translation> + </message> + <message> + <source>HTTP request failed</source> + <translation>HTTP dotaz se nezdařil</translation> + </message> + <message> + <source>Proxy requires authentication</source> + <translation>Proxy server požaduje autentizaci</translation> + </message> + <message> + <source>Authentication required</source> + <translation>Požadována autentizace</translation> + </message> + <message> + <source>SSL handshake failed</source> + <translation>Během startu SSL protokolu se vyskytla chyba</translation> + </message> + <message> + <source>Connection to %1 closed</source> + <translation>Spojení s %1 ukončeno</translation> + </message> + <message> + <source>Invalid HTTP chunked body</source> + <translation>Obsah (chunked body - rozkouskované tělo) HTTP je neplatný</translation> + </message> + <message> + <source>Host %1 found</source> + <translation>Počítač %1 byl nalezen</translation> + </message> + <message> + <source>Wrong content length</source> + <translation>Neplatný údaj o délce obsahu</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> + </message> + <message> + <source>Invalid HTTP response header</source> + <translation>Hlavička HTTP odpovědi není platná</translation> + </message> + <message> + <source>Unknown authentication method</source> + <translation>Neznámý způsob autentizace</translation> + </message> + <message> + <source>Connection closed</source> + <translation>Spojení ukončeno</translation> + </message> + <message> + <source>No server set to connect to</source> + <translation>Pro spojení nebyl nastaven žádný počítač - server</translation> + </message> + <message> + <source>Server closed connection unexpectedly</source> + <translation>Server neočekávaně uzavřel spojení</translation> + </message> + <message> + <source>Request aborted</source> + <translation>Požadavek byl zrušen</translation> + </message> +</context> +<context> + <name>QHttpSocketEngine</name> + <message> + <source>Proxy connection refused</source> + <translation>Proxy server odmítl navázání spojení</translation> + </message> + <message> + <source>Proxy denied connection</source> + <translation>Proxy server odmítl spojení</translation> + </message> + <message> + <source>Proxy server not found</source> + <translation>Nepodařilo se najít žádný proxy server</translation> + </message> + <message> + <source>Proxy server connection timed out</source> + <translation>Při spojení s proxy serverem byl překročen časový limit</translation> + </message> + <message> + <source>Did not receive HTTP response from proxy</source> + <translation>Žádná HTTP odpověď od proxy serveru</translation> + </message> + <message> + <source>Proxy connection closed prematurely</source> + <translation>Proxy server předčasně ukončil spojení</translation> + </message> + <message> + <source>Error communicating with HTTP proxy</source> + <translation>Chyba při spojení s proxy serverem</translation> + </message> + <message> + <source>Authentication required</source> + <translation>Požadována autentizace</translation> + </message> + <message> + <source>Error parsing authentication request from proxy</source> + <translation>Chyba při vyhodnocení autentizačního požadavku proxy serveru</translation> + </message> +</context> +<context> + <name>QIBaseDriver</name> + <message> + <source>Unable to commit transaction</source> + <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + </message> + <message> + <source>Could not start transaction</source> + <translation>Nepodařilo se spustit žádnou transakci</translation> + </message> + <message> + <source>Error opening database</source> + <translation>Nepodařilo se otevřít spojení s databází</translation> + </message> + <message> + <source>Unable to rollback transaction</source> + <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + </message> +</context> +<context> + <name>QIBaseResult</name> + <message> + <source>Unable to commit transaction</source> + <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + </message> + <message> + <source>Unable to open BLOB</source> + <translation>Nepodařilo se otevřít BLOB</translation> + </message> + <message> + <source>Could not describe statement</source> + <translation>Nepodařilo se získat žádný popis příkazu</translation> + </message> + <message> + <source>Could not describe input statement</source> + <translation>Nepodařilo se získat žádný popis vstupního příkazu</translation> + </message> + <message> + <source>Could not allocate statement</source> + <translation>Přidělení příkazu se nezdařilo</translation> + </message> + <message> + <source>Unable to write BLOB</source> + <translation>Nepodařilo se zapsat BLOB</translation> + </message> + <message> + <source>Could not start transaction</source> + <translation>Nepodařilo se spustit žádnou transakci</translation> + </message> + <message> + <source>Unable to close statement</source> + <translation>Příkaz se nepodařilo zavřít</translation> + </message> + <message> + <source>Could not get query info</source> + <translation>Požadované informace k vyhledávání nejsou k dispozici</translation> + </message> + <message> + <source>Could not find array</source> + <translation>Nepodařilo se najít pole</translation> + </message> + <message> + <source>Could not get array data</source> + <translation>Nepodařilo se přečíst data pole</translation> + </message> + <message> + <source>Unable to execute query</source> + <translation>Dotaz se nepodařilo provést</translation> + </message> + <message> + <source>Could not prepare statement</source> + <translation>Příkaz se nepodařilo připravit</translation> + </message> + <message> + <source>Could not fetch next item</source> + <translation>Další prvek se nepodařilo vyzvednout</translation> + </message> + <message> + <source>Could not get statement info</source> + <translation>K dispozici není žádná informace k příkazu</translation> + </message> + <message> + <source>Unable to create BLOB</source> + <translation>Nepodařilo se vytvořit žádný BLOB</translation> + </message> + <message> + <source>Unable to read BLOB</source> + <translation>BLOB se nepodařilo přečíst</translation> + </message> +</context> +<context> + <name>QIODevice</name> + <message> + <source>No such file or directory</source> + <translation>Nepodařilo se najít žádný takový soubor nebo adresář</translation> + </message> + <message> + <source>Permission denied</source> + <translation>Přístup odepřen</translation> + </message> + <message> + <source>No space left on device</source> + <translation>Na zařízení není žádný volný úložný prostor</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> + </message> + <message> + <source>Too many open files</source> + <translation>Příliš mnoho otevřených souborů</translation> + </message> +</context> +<context> + <name>QInputContext</name> + <message> + <source>XIM</source> + <translation>XIM</translation> + </message> + <message> + <source>FEP</source> + <translation>FEP</translation> + </message> + <message> + <source>Windows input method</source> + <translation>Windows-vstupní metoda</translation> + </message> + <message> + <source>S60 FEP input method</source> + <translation>S60 FEP-vstupní metoda</translation> + </message> + <message> + <source>XIM input method</source> + <translation>XIM-vstupní metoda</translation> + </message> + <message> + <source>Mac OS X input method</source> + <translation>Mac OS X-vstupní metoda</translation> + </message> +</context> +<context> + <name>QInputDialog</name> + <message> + <source>Enter a value:</source> + <translation>Zadejte hodnotu:</translation> + </message> +</context> +<context> + <name>QLibrary</name> + <message> + <source>Could not unmap '%1': %2</source> + <translation type="obsolete">Operace unmap, zrušit zobrazení, se nezdařila u '%1': %2</translation> + </message> + <message> + <source>Cannot unload library %1: %2</source> + <translation>Knihovnu %1 nelze vyjmout: %2</translation> + </message> + <message> + <source>Cannot load library %1: %2</source> + <translation>Knihovnu %1 nelze nahrát: %2</translation> + </message> + <message> + <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> + <translation>Přídavný modul '%1' používá neslučitelnou Qt knihovnu. (%2.%3.%4) [%5]</translation> + </message> + <message> + <source>Cannot resolve symbol "%1" in %2: %3</source> + <translation>Symbol "%1" nelze v %2 vyřešit: %3</translation> + </message> + <message> + <source>Plugin verification data mismatch in '%1'</source> + <translation>Ověřovací data přídavného nesouhlasí v '%1'</translation> + </message> + <message> + <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> + <translation>Přídavný modul '%1' používá neslučitelnou Qt knihovnu. (Knihovny vytvořené v režimu ladění a vydání nemohou být používány společně.)</translation> + </message> + <message> + <source>The file '%1' is not a valid Qt plugin.</source> + <translation>Soubor '%1' není platným přídavným modulem Qt.</translation> + </message> + <message> + <source>The shared library was not found.</source> + <translation>Nepodařilo se nalézt sdílenou knihovnu.</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> + </message> + <message> + <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> + <translation>Přídavný modul '%1' používá neslučitelnou Qt knihovnu. Potřebný byl zvláštní klíč pro sestavení "%2", obdržen "%3"</translation> + </message> + <message> + <source>Could not mmap '%1': %2</source> + <translation type="obsolete">Operace mmap se nezdařila u '%1': %2</translation> + </message> +</context> +<context> + <name>QLineEdit</name> + <message> + <source>Cu&t</source> + <translation>&Vyjmout</translation> + </message> + <message> + <source>&Copy</source> + <translation>&Kopírovat</translation> + </message> + <message> + <source>&Redo</source> + <translation>&Znovu</translation> + </message> + <message> + <source>&Undo</source> + <translation>&Zpět</translation> + </message> + <message> + <source>&Paste</source> + <translation>&Vložit</translation> + </message> + <message> + <source>Delete</source> + <translation>Smazat</translation> + </message> + <message> + <source>Select All</source> + <translation>Vybrat vše</translation> + </message> +</context> +<context> + <name>QLocalServer</name> + <message> + <source>%1: Name error</source> + <translation>%1: Chybný název</translation> + </message> + <message> + <source>%1: Unknown error %2</source> + <translation>%1: Neznámá chyba %2</translation> + </message> + <message> + <source>%1: Permission denied</source> + <translation>%1: Přístup odepřen</translation> + </message> + <message> + <source>%1: Address in use</source> + <translation>%1: Adresa se již používá</translation> + </message> +</context> +<context> + <name>QLocalSocket</name> + <message> + <source>%1: Connection error</source> + <translation>%1: Chyba spojení</translation> + </message> + <message> + <source>%1: Connection refused</source> + <translation>%1: Spojení bylo odmítnuto</translation> + </message> + <message> + <source>%1: Unknown error %2</source> + <translation>%1: Neznámá chyba %2</translation> + </message> + <message> + <source>%1: Socket access error</source> + <translation>%1: Chyba při přístupu k zásuvce (socketu)</translation> + </message> + <message> + <source>%1: Socket resource error</source> + <translation>%1: Chyba zásuvky (socketu) - potíže se zdrojem</translation> + </message> + <message> + <source>%1: The socket operation is not supported</source> + <translation>%1: Tato operace se zásuvkou (socketem) není podporována</translation> </message> <message> - <location line="-747"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-441"/> - <source>Request aborted</source> - <translation>Požadavek byl zrušen</translation> + <source>%1: Invalid name</source> + <translation>%1: Neplatný název</translation> + </message> + <message> + <source>%1: Unknown error</source> + <translation>%1: Neznámá chyba</translation> + </message> + <message> + <source>%1: Socket operation timed out</source> + <translation>%1: Překročení času při operaci se zásuvkou (socketem)</translation> + </message> + <message> + <source>%1: Datagram too large</source> + <translation>%1: Datagram je příliš veliký</translation> + </message> + <message> + <source>%1: Remote closed</source> + <translation>%1: Spojení bylo protější stranou uzavřeno</translation> + </message> +</context> +<context> + <name>QMYSQLDriver</name> + <message> + <source>Unable to commit transaction</source> + <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + </message> + <message> + <source>Unable to open database '</source> + <translation>Nepodařilo se otevřít spojení s databází '</translation> + </message> + <message> + <source>Unable to connect</source> + <translation>Nepodařilo se navázat spojení</translation> + </message> + <message> + <source>Unable to rollback transaction</source> + <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + </message> + <message> + <source>Unable to begin transaction</source> + <translation>Transakci se nepodařilo spustit</translation> + </message> +</context> +<context> + <name>QMYSQLResult</name> + <message> + <source>Unable to execute statement</source> + <translation>Příkaz se nepodařilo provést</translation> + </message> + <message> + <source>Unable to store statement results</source> + <translation>Výsledky příkazu se nepodařilo uložit</translation> + </message> + <message> + <source>Unable to execute next query</source> + <translation>Další dotaz nelze provést</translation> + </message> + <message> + <source>Unable to bind outvalues</source> + <translation>Výstupní hodnoty se nepodařilo spojit</translation> + </message> + <message> + <source>Unable to store next result</source> + <translation>Další výsledek nelze uložit</translation> + </message> + <message> + <source>Unable to fetch data</source> + <translation>Nepodařilo se natáhnout žádná data</translation> + </message> + <message> + <source>Unable to prepare statement</source> + <translation>Příkaz se nepodařilo připravit</translation> + </message> + <message> + <source>Unable to store result</source> + <translation>Výsledek se nepodařilo uložit</translation> + </message> + <message> + <source>Unable to bind value</source> + <translation>Hodnotu se nepodařilo spojit</translation> + </message> + <message> + <source>Unable to execute query</source> + <translation>Dotaz se nepodařilo provést</translation> + </message> + <message> + <source>Unable to reset statement</source> + <translation>Příkaz se nepodařilo znovu nastavit</translation> + </message> +</context> +<context> + <name>QMdiArea</name> + <message> + <source>(Untitled)</source> + <translation>(Bez názvu)</translation> + </message> +</context> +<context> + <name>QMdiSubWindow</name> + <message> + <source>Help</source> + <translation>Nápověda</translation> + </message> + <message> + <source>Menu</source> + <translation>Menu</translation> + </message> + <message> + <source>&Move</source> + <translation>Po&sunout</translation> + </message> + <message> + <source>&Size</source> + <translation>Změnit &velikost</translation> + </message> + <message> + <source>Close</source> + <translation>Zavřít</translation> + </message> + <message> + <source>Minimize</source> + <translation>Zmenšit</translation> + </message> + <message> + <source>Shade</source> + <translation>Navinout</translation> + </message> + <message> + <source>Stay on &Top</source> + <translation>Zůstat v &popředí</translation> + </message> + <message> + <source>&Close</source> + <translation>&Zavřít</translation> + </message> + <message> + <source>- [%1]</source> + <translation>- [%1]</translation> + </message> + <message> + <source>%1 - [%2]</source> + <translation>%1 - [%2]</translation> + </message> + <message> + <source>&Restore</source> + <translation>&Obnovit</translation> + </message> + <message> + <source>Restore</source> + <translation>Obnovit</translation> + </message> + <message> + <source>Maximize</source> + <translation>Zvětšit</translation> + </message> + <message> + <source>Unshade</source> + <translation>Odvinout</translation> + </message> + <message> + <source>Mi&nimize</source> + <translation>Zmen&šit</translation> + </message> + <message> + <source>Ma&ximize</source> + <translation>Zvě&tšit</translation> + </message> + <message> + <source>Restore Down</source> + <translation>Obnovit</translation> + </message> +</context> +<context> + <name>QMenu</name> + <message> + <source>Open</source> + <translation>Otevřít</translation> + </message> + <message> + <source>Close</source> + <translation>Zavřít</translation> + </message> + <message> + <source>Execute</source> + <translation>Provést</translation> + </message> +</context> +<context> + <name>QMenuBar</name> + <message> + <source>Actions</source> + <translation>Činnosti</translation> + </message> +</context> +<context> + <name>QMessageBox</name> + <message> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <source>Help</source> + <translation>Nápověda</translation> + </message> + <message> + <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation><p>Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.</p><p>Qt poskytuje jednoduchou přenositelnost přes MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.</p>Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.</p><p>Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Podívejte se, prosím, na <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> kvůli přehledu licencování Qt.</p><p>Autorské právo (C) 2010 Nokia Corporation a/nebo její dceřinná(é) společnost(i).</p><p>Qt je výrobkem společnosti Nokia. Podívejte se na <a href="http://qt.nokia.com/">qt.nokia.com</a>kvůli více informacím.</p></translation> + </message> + <message> + <source><h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><h3>O Qt</h3><p>Tento program používá Qt ve verzi %1.</p><p>Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.</p><p>Qt poskytuje jednoduchou přenositelnost přes MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.</p>Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.</p><p>Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Podívejte se, prosím, na <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> kvůli přehledu licencování Qt.</p><p>Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná(é) společnost(i).</p><p>Qt je výrobkem společnosti Nokia. Podívejte se na <a href="http://qt.nokia.com/">qt.nokia.com</a>kvůli více informacím.</p></translation> + </message> + <message> + <source>Show Details...</source> + <translation>Ukázat podrobnosti...</translation> + </message> + <message> + <source><h3>About Qt</h3><p>This program uses Qt version %1.</p></source> + <translation><h3>O Qt</h3><p>Tento program používá Qt-verze %1.</p></translation> + </message> + <message> + <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><p>Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.</p><p>Qt poskytuje jednoduchou přenositelnost přes MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.</p>Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.</p><p>Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Podívejte se, prosím, na <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> kvůli přehledu licencování Qt.</p><p>Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná(é) společnost(i).</p><p>Qt je výrobkem společnosti Nokia. Podívejte se na <a href="http://qt.nokia.com/">qt.nokia.com</a>kvůli více informacím.</p></translation> + </message> + <message> + <source>About Qt</source> + <translation>O Qt</translation> + </message> + <message> + <source><p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> for an overview of Qt licensing.</p></source> + <translation type="obsolete"><p>Tento program používá Qt Open Source Edition verze %1.</p><p>Qt Open Source Edition je zamýšlena pro vývoj Open Source aplikací. Pro vývoj vlastnických aplikací (uzavřené zdrojové kódy) potřebujete Qt licenci.</p><p>Podívejte se, prosím, na <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> kvůli přehledu licencování Qt.</p></translation> + </message> + <message> + <source>Hide Details...</source> + <translation>Skrýt podrobnosti...</translation> + </message> + <message> + <source><p>This program uses Qt version %1.</p></source> + <translation type="obsolete"><p>Tento program používá Qt-verze %1.</p></translation> + </message> +</context> +<context> + <name>QMultiInputContext</name> + <message> + <source>Select IM</source> + <translation>Zvolit způsob vstupu</translation> + </message> +</context> +<context> + <name>QMultiInputContextPlugin</name> + <message> + <source>Multiple input method switcher that uses the context menu of the text widgets</source> + <translation>Přepínač pro více způsobů vstupu, který používá související nabídku textového prvku</translation> + </message> + <message> + <source>Multiple input method switcher</source> + <translation>Přepínač pro více způsobů vstupu</translation> </message> </context> <context> - <name>QHttpSocketEngine</name> + <name>QNativeSocketEngine</name> <message> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+29"/> - <source>Proxy connection refused</source> - <translation>Proxy server odmítl navázání spojení</translation> + <source>The proxy type is invalid for this operation</source> + <translation>Tuto operaci nelze s tímto typem proxy provést</translation> </message> <message> - <location line="-35"/> - <source>Proxy denied connection</source> - <translation>Proxy server odmítl spojení</translation> + <source>Network operation timed out</source> + <translation>Časový limit pro síťovou operaci byl překročen</translation> </message> <message> - <location line="+33"/> - <source>Proxy server not found</source> - <translation>Nepodařilo se najít žádný proxy server</translation> + <source>The remote host closed the connection</source> + <translation>Vzdálený počítač uzavřel spojení</translation> </message> <message> - <location line="+4"/> - <source>Proxy server connection timed out</source> - <translation>Při spojení s proxy serverem byl překročen časový limit</translation> + <source>Invalid socket descriptor</source> + <translation>Neplatný deskriptor zásuvky (socketu)</translation> </message> <message> - <location line="-120"/> - <source>Did not receive HTTP response from proxy</source> - <translation>Žádná HTTP odpověď od proxy serveru</translation> + <source>Host unreachable</source> + <translation>Cílový počítač je nedosažitelný</translation> </message> <message> - <location line="+122"/> - <source>Proxy connection closed prematurely</source> - <translation>Proxy server předčasně ukončil spojení</translation> + <source>Protocol type not supported</source> + <translation>Protokol tohoto typu není podporován</translation> </message> <message> - <location line="-29"/> - <source>Error communicating with HTTP proxy</source> - <translation>Chyba při spojení s proxy serverem</translation> + <source>Datagram was too large to send</source> + <translation>Datagram byl pro odeslání příliš veliký</translation> </message> <message> - <location line="-37"/> - <source>Authentication required</source> - <translation>Požadována autentizace</translation> + <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> + <translation>Vyzkoušelo se použít IPv6 zásuvku (socket) na systému bez podpory IPv6</translation> </message> <message> - <location line="-31"/> - <source>Error parsing authentication request from proxy</source> - <translation>Chyba při vyhodnocení autentizačního požadavku proxy serveru</translation> + <source>Unable to receive a message</source> + <translation>Zprávu se nepodařilo přijmout</translation> </message> -</context> -<context> - <name>QIBaseDriver</name> <message> - <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1558"/> - <source>Unable to commit transaction</source> - <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + <source>Permission denied</source> + <translation>Přístup odepřen</translation> </message> <message> - <location line="-13"/> - <source>Could not start transaction</source> - <translation>Nepodařilo se spustit žádnou transakci</translation> + <source>Connection refused</source> + <translation>Spojení bylo odmítnuto</translation> </message> <message> - <location line="-54"/> - <source>Error opening database</source> - <translation>Nepodařilo se otevřít spojení s databází</translation> + <source>Unable to write</source> + <translation>Nepodařilo se zapsat</translation> </message> <message> - <location line="+80"/> - <source>Unable to rollback transaction</source> - <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + <source>Another socket is already listening on the same port</source> + <translation>Na tomto portu již naslouchá jiná zásuvka (socket)</translation> </message> -</context> -<context> - <name>QIBaseResult</name> <message> - <location line="-707"/> - <source>Unable to commit transaction</source> - <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + <source>Unable to send a message</source> + <translation>Nepodařilo se odeslat hlášení</translation> </message> <message> - <location line="-422"/> - <source>Unable to open BLOB</source> - <translation>Nepodařilo se otevřít BLOB</translation> + <source>The bound address is already in use</source> + <translation>Uvedená adresa se už používá</translation> </message> <message> - <location line="+499"/> - <source>Could not describe statement</source> - <translation>Nepodařilo se získat žádný popis příkazu</translation> + <source>Connection timed out</source> + <translation>Časový limit pro spojení byl překročen</translation> </message> <message> - <location line="-25"/> - <location line="+11"/> - <source>Could not describe input statement</source> - <translation>Nepodařilo se získat žádný popis vstupního příkazu</translation> + <source>Network error</source> + <translation>Síťová chyba</translation> </message> <message> - <location line="-21"/> - <source>Could not allocate statement</source> - <translation>Přidělení příkazu se nezdařilo</translation> + <source>Unsupported socket operation</source> + <translation>Nepodporovaná zásuvková operace (povel pro socket)</translation> </message> <message> - <location line="-478"/> - <source>Unable to write BLOB</source> - <translation>Nepodařilo se zapsat BLOB</translation> + <source>Operation on non-socket</source> + <translation>Operaci lze použít pouze na jedné zásuvce (socketu)</translation> </message> <message> - <location line="+417"/> - <source>Could not start transaction</source> - <translation>Nepodařilo se spustit žádnou transakci</translation> + <source>Unable to initialize broadcast socket</source> + <translation>Zásuvku pro vysílání (socket) se nepodařilo spustit</translation> </message> <message> - <location line="+211"/> - <source>Unable to close statement</source> - <translation>Příkaz se nepodařilo zavřít</translation> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> </message> <message> - <location line="-231"/> - <source>Could not get query info</source> - <translation>Požadované informace k vyhledávání nejsou k dispozici</translation> + <source>Unable to initialize non-blocking socket</source> + <translation>Neblokující zásuvku (socket) se nepodařilo spustit</translation> </message> <message> - <location line="-242"/> - <location line="+187"/> - <source>Could not find array</source> - <translation>Nepodařilo se najít pole</translation> + <source>The address is protected</source> + <translation>Adresa je chráněna</translation> </message> <message> - <location line="-155"/> - <source>Could not get array data</source> - <translation>Nepodařilo se přečíst data pole</translation> + <source>Network unreachable</source> + <translation>Síť je nedosažitelná</translation> </message> <message> - <location line="+449"/> - <source>Unable to execute query</source> - <translation>Dotaz se nepodařilo provést</translation> + <source>The address is not available</source> + <translation>Adresa není dostupná</translation> </message> <message> - <location line="-153"/> - <source>Could not prepare statement</source> - <translation>Příkaz se nepodařilo připravit</translation> + <source>Out of resources</source> + <translation>Nejsou dostupné žádné zdroje</translation> </message> +</context> +<context> + <name>QNetworkAccessCacheBackend</name> <message> - <location line="+199"/> - <source>Could not fetch next item</source> - <translation>Další prvek se nepodařilo vyzvednout</translation> + <source>Error opening %1</source> + <translation>%1 se nepodařilo otevřít</translation> </message> +</context> +<context> + <name>QNetworkAccessDataBackend</name> <message> - <location line="+197"/> - <source>Could not get statement info</source> - <translation>K dispozici není žádná informace k příkazu</translation> + <source>Operation not supported on %1</source> + <translation>Tato operace není %1 podporována</translation> </message> <message> - <location line="-885"/> - <source>Unable to create BLOB</source> - <translation>Nepodařilo se vytvořit žádný BLOB</translation> + <source>Invalid URI: %1</source> + <translation>Neplatný URI: %1</translation> </message> +</context> +<context> + <name>QNetworkAccessDebugPipeBackend</name> <message> - <location line="+36"/> - <source>Unable to read BLOB</source> - <translation>BLOB se nepodařilo přečíst</translation> + <source>Write error writing to %1: %2</source> + <translation>Při zápisu do souboru %1: %2 nastala chyba</translation> + </message> + <message> + <source>Socket error on %1: %2</source> + <translation>Chyba zásuvky (socketu) u %1: %2</translation> + </message> + <message> + <source>Remote host closed the connection prematurely on %1</source> + <translation>Vzdálený počítač předčasně ukončil spojení s %1</translation> </message> </context> <context> - <name>QIODevice</name> + <name>QNetworkAccessFileBackend</name> <message> - <location filename="../src/corelib/global/qglobal.cpp" line="+2064"/> - <source>No such file or directory</source> - <translation>Nepodařilo se najít žádný takový soubor nebo adresář</translation> + <source>Request for opening non-local file %1</source> + <translation>Požadavek na otevření souboru přes síť %1</translation> </message> <message> - <location line="-6"/> - <source>Permission denied</source> - <translation>Přístup odepřen</translation> + <source>Read error reading from %1: %2</source> + <translation>Při čtení ze souboru %1 nastala chyba: %2</translation> </message> <message> - <location line="+9"/> - <source>No space left on device</source> - <translation>Na zařízení není žádný volný úložný prostor</translation> + <source>Cannot open %1: Path is a directory</source> + <translation>%1 nelze otevřít: Jedná se o adresář</translation> </message> <message> - <location filename="../src/corelib/io/qiodevice.cpp" line="+1561"/> - <source>Unknown error</source> - <translation>Neznámá chyba</translation> + <source>Error opening %1: %2</source> + <translation>%1 se nepodařilo otevřít: %2</translation> </message> <message> - <location filename="../src/corelib/global/qglobal.cpp" line="-6"/> - <source>Too many open files</source> - <translation>Příliš mnoho otevřených souborů</translation> + <source>Write error writing to %1: %2</source> + <translation>Při zápisu do souboru %1: %2 nastala chyba</translation> </message> </context> <context> - <name>QInputContext</name> + <name>QNetworkAccessFtpBackend</name> <message> - <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+256"/> - <source>XIM</source> - <translation>XIM</translation> + <source>No suitable proxy found</source> + <translation>Nepodařilo se najít žádný vhodný proxy server</translation> </message> <message> - <location line="+4"/> - <source>FEP</source> - <translation>FEP</translation> + <source>Error while downloading %1: %2</source> + <translation>Při stahování %1 se vyskytla chyba: %2</translation> </message> <message> - <location line="+27"/> - <source>Windows input method</source> - <translation>Windows-vstupní metoda</translation> + <source>Error while uploading %1: %2</source> + <translation>Při nahrávání %1 se vyskytla chyba: %2</translation> </message> <message> - <location line="+8"/> - <source>S60 FEP input method</source> - <translation>S60 FEP-vstupní metoda</translation> + <source>Cannot open %1: is a directory</source> + <translation>%1 nelze otevřít: Jedná se o adresář</translation> </message> <message> - <location line="-12"/> - <source>XIM input method</source> - <translation>XIM-vstupní metoda</translation> + <source>Logging in to %1 failed: authentication required</source> + <translation>Přihlášení do %1 se nezdařilo: Je požadována autentizace</translation> + </message> +</context> +<context> + <name>QNetworkAccessHttpBackend</name> + <message> + <source>No suitable proxy found</source> + <translation>Nepodařilo se najít žádný vhodný proxy server</translation> </message> +</context> +<context> + <name>QNetworkAccessManager</name> <message> - <location line="+8"/> - <source>Mac OS X input method</source> - <translation>Mac OS X-vstupní metoda</translation> + <source>Network access is disabled.</source> + <translation>Přístup k síti není dovolen.</translation> </message> </context> <context> - <name>QInputDialog</name> + <name>QNetworkReply</name> <message> - <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/> - <source>Enter a value:</source> - <translation>Zadejte hodnotu:</translation> + <source>Error downloading %1 - server replied: %2</source> + <translation>Beim Herunterladen von %1 trat ein Fehler auf - Die Antwort des Servers ist: %2</translation> + </message> + <message> + <source>Protocol "%1" is unknown</source> + <translation>Protokol "%1" není znám</translation> + </message> + <message> + <source>Network session error.</source> + <translation>Chyba při spojení přes síť.</translation> + </message> + <message> + <source>Temporary network failure.</source> + <translation>Síť dočasně vypadla.</translation> </message> </context> <context> - <name>QLibrary</name> + <name>QNetworkReplyImpl</name> + <message> + <source>Operation canceled</source> + <translation>Operace byla zrušena</translation> + </message> +</context> +<context> + <name>QNetworkSession</name> + <message> + <source>Invalid configuration.</source> + <translation>Neplatné nastavení.</translation> + </message> +</context> +<context> + <name>QNetworkSessionPrivateImpl</name> + <message> + <source>Roaming error</source> + <translation>Chyba při toulání se (roaming)</translation> + </message> + <message> + <source>Session aborted by user or system</source> + <translation>Spojení bylo zrušeno buď uživatelem nebo operačním systémem</translation> + </message> + <message> + <source>The specified configuration cannot be used.</source> + <translation>Zadané nastavení nelze použít.</translation> + </message> + <message> + <source>Unidentified Error</source> + <translation>Neznámá chyba</translation> + </message> + <message> + <source>Unknown session error.</source> + <translation>Neznámá chyba při spojení přes síť.</translation> + </message> + <message> + <source>The session was aborted by the user or system.</source> + <translation>Spojení bylo zrušeno buď uživatelem nebo operačním systémem.</translation> + </message> + <message> + <source>The requested operation is not supported by the system.</source> + <translation>Požadovaná operace není systémem podporována.</translation> + </message> + <message> + <source>Roaming was aborted or is not possible.</source> + <translation>Toulání se (roaming) bylo buď zrušeno, nebo zde není možné.</translation> + </message> +</context> +<context> + <name>QOCIDriver</name> + <message> + <source>Unable to commit transaction</source> + <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + </message> + <message> + <source>Unable to initialize</source> + <translation type="obsolete">Inicializace se nezdařila</translation> + </message> + <message> + <source>Unable to logon</source> + <translation>Přihlášení se nezdařilo</translation> + </message> <message> - <location filename="../src/corelib/plugin/qlibrary.cpp" line="+411"/> - <source>Could not unmap '%1': %2</source> - <translation>Operace unmap, zrušit zobrazení, se nezdařila u '%1': %2</translation> + <source>Unable to rollback transaction</source> + <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> </message> <message> - <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+253"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+109"/> - <source>Cannot unload library %1: %2</source> - <translation>Knihovnu %1 nelze vyjmout: %2</translation> + <source>Unable to begin transaction</source> + <translation>Transakci se nepodařilo spustit</translation> </message> <message> - <location line="-17"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="-22"/> - <source>Cannot load library %1: %2</source> - <translation>Knihovnu %1 nelze nahrát: %2</translation> + <source>Unable to initialize</source> + <comment>QOCIDriver</comment> + <translation>Spuštění se nezdařilo</translation> </message> +</context> +<context> + <name>QOCIResult</name> <message> - <location filename="../src/corelib/plugin/qlibrary.cpp" line="+341"/> - <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> - <translation>Přídavný modul '%1' používá neslučitelnou Qt knihovnu. (%2.%3.%4) [%5]</translation> + <source>Unable to alloc statement</source> + <translation>Přidělení příkazu se nepodařilo</translation> </message> <message> - <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+51"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+37"/> - <source>Cannot resolve symbol "%1" in %2: %3</source> - <translation>Symbol "%1" nelze v %2 vyřešit: %3</translation> + <source>Unable to goto next</source> + <translation>Nelze jít k dalšímu prvku</translation> </message> <message> - <location filename="../src/corelib/plugin/qlibrary.cpp" line="-347"/> - <source>Plugin verification data mismatch in '%1'</source> - <translation>Ověřovací data přídavného nesouhlasí v '%1'</translation> + <source>Unable to get statement type</source> + <translation>Nepodařilo se získat typ příkazu</translation> </message> <message> - <location line="+375"/> - <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> - <translation>Přídavný modul '%1' používá neslučitelnou Qt knihovnu. (Knihovny vytvořené v režimu ladění a vydání nemohou být používány společně.)</translation> + <source>Unable to execute statement</source> + <translation>Příkaz se nepodařilo provést</translation> </message> <message> - <location line="-43"/> - <source>The file '%1' is not a valid Qt plugin.</source> - <translation>Soubor '%1' není platným přídavným modulem Qt.</translation> + <source>Unable to bind column for batch execute</source> + <translation>Nepodařilo se spojit sloupec pro provedení příkazu dávkového zpracování</translation> </message> <message> - <location line="-2"/> - <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+343"/> - <source>The shared library was not found.</source> - <translation>Nepodařilo se nalézt sdílenou knihovnu.</translation> + <source>Unable to execute select statement</source> + <translation type="obsolete">Výběrové vyhledávání se nepodařilo provést</translation> </message> <message> - <location line="+402"/> - <source>Unknown error</source> - <translation>Neznámá chyba</translation> + <source>Unable to prepare statement</source> + <translation>Příkaz se nepodařilo připravit</translation> </message> <message> - <location line="-365"/> - <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> - <translation>Přídavný modul '%1' používá neslučitelnou Qt knihovnu. Potřebný byl zvláštní klíč pro sestavení "%2", obdržen "%3"</translation> + <source>Unable to execute batch statement</source> + <translation>Příkaz pro dávkové zpracování se nepodařilo provést</translation> </message> <message> - <location line="-389"/> - <source>Could not mmap '%1': %2</source> - <translation>Operace mmap se nezdařila u '%1': %2</translation> + <source>Unable to bind value</source> + <translation>Hodnotu se nepodařilo spojit</translation> </message> </context> <context> - <name>QLineEdit</name> + <name>QODBCDriver</name> <message> - <location filename="../src/gui/widgets/qlineedit.cpp" line="+1991"/> - <source>Cu&t</source> - <translation>&Vyjmout</translation> + <source>Unable to commit transaction</source> + <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> </message> <message> - <location line="+5"/> - <source>&Copy</source> - <translation>&Kopírovat</translation> + <source>Unable to enable autocommit</source> + <translation>'autocommit' se nepodařilo povolit</translation> </message> <message> - <location line="-12"/> - <source>&Redo</source> - <translation>&Znovu</translation> + <source>Unable to connect - Driver doesn't support all needed functionality</source> + <translation type="obsolete">Nepodařilo se navázat spojení, protože ovladač nutnou funkcionalitu plně nepodporuje</translation> </message> <message> - <location line="-4"/> - <source>&Undo</source> - <translation>&Zpět</translation> + <source>Unable to disable autocommit</source> + <translation>'autocommit', automatické odeslání, se nepodařilo zastavit</translation> </message> <message> - <location line="+21"/> - <source>&Paste</source> - <translation>&Vložit</translation> + <source>Unable to connect</source> + <translation>Nepodařilo se navázat spojení</translation> </message> <message> - <location line="+5"/> - <source>Delete</source> - <translation>Smazat</translation> + <source>Unable to connect - Driver doesn't support all functionality required</source> + <translation>Nepodařilo se navázat spojení, protože ovladač nutnou funkcionalitu plně nepodporuje</translation> </message> <message> - <location line="+6"/> - <source>Select All</source> - <translation>Vybrat vše</translation> + <source>Unable to rollback transaction</source> + <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> </message> </context> <context> - <name>QLocalServer</name> - <message> - <location filename="../src/network/socket/qlocalserver.cpp" line="+224"/> - <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+256"/> - <source>%1: Name error</source> - <translation>%1: Chybný název</translation> - </message> - <message> - <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+9"/> - <source>%1: Unknown error %2</source> - <translation>%1: Neznámá chyba %2</translation> - </message> + <name>QODBCResult</name> <message> - <location line="-17"/> - <source>%1: Permission denied</source> - <translation>%1: Přístup odepřen</translation> + <source>Unable to bind variable</source> + <translation>Proměnnou se nepodařilo provést</translation> </message> <message> - <location line="+12"/> - <source>%1: Address in use</source> - <translation>%1: Adresa se již používá</translation> + <source>Unable to execute statement</source> + <translation>Příkaz se nepodařilo provést</translation> </message> -</context> -<context> - <name>QLocalSocket</name> <message> - <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+153"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+160"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+75"/> - <source>%1: Connection error</source> - <translation>%1: Chyba spojení</translation> + <source>Unable to fetch next</source> + <translation>Další datový záznam se nepodařilo natáhnout</translation> </message> <message> - <location line="-21"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="-21"/> - <source>%1: Connection refused</source> - <translation>%1: Spojení bylo odmítnuto</translation> + <source>Unable to fetch last</source> + <translation>Poslední datový záznam se nepodařilo natáhnout</translation> </message> <message> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+28"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/> - <source>%1: Unknown error %2</source> - <translation>%1: Neznámá chyba %2</translation> + <source>Unable to prepare statement</source> + <translation>Příkaz se nepodařilo spustit</translation> </message> <message> - <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+9"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="-19"/> - <source>%1: Socket access error</source> - <translation>%1: Chyba při přístupu k zásuvce (socketu)</translation> + <source>Unable to fetch previous</source> + <translation>Předchozí datový záznam se nepodařilo natáhnout</translation> </message> <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Socket resource error</source> - <translation>%1: Chyba zásuvky (socketu) - potíže se zdrojem</translation> + <source>Unable to fetch</source> + <translation>Nepodařilo se natáhnout žádná data</translation> </message> <message> - <location line="+12"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+12"/> - <source>%1: The socket operation is not supported</source> - <translation>%1: Tato operace se zásuvkou (socketem) není podporována</translation> + <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> + <translation>QODBCResult::reset: 'SQL_CURSOR_STATIC' se nepodařilo nastavit jako příkaz vlastnosti . Ověřte, prosím, nastavení svého ODBC ovladače</translation> </message> <message> - <location line="-18"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="-18"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-5"/> - <location line="+45"/> - <source>%1: Invalid name</source> - <translation>%1: Neplatný název</translation> + <source>Unable to fetch first</source> + <translation>První datový záznam se nepodařilo natáhnout</translation> </message> +</context> +<context> + <name>QObject</name> <message> - <location line="+22"/> - <source>%1: Unknown error</source> - <translation>%1: Neznámá chyba</translation> + <source>Invalid hostname</source> + <translation type="obsolete">Neplatný název pro hostitelský počítač</translation> </message> <message> - <location line="-13"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+9"/> - <source>%1: Socket operation timed out</source> - <translation>%1: Překročení času při operaci se zásuvkou (socketem)</translation> + <source>Home</source> + <translation type="obsolete">Home</translation> </message> <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Datagram too large</source> - <translation>%1: Datagram je příliš veliký</translation> + <source>Protocol error: packet of size 0 received</source> + <translation type="obsolete">Chyba v zápisu: Byl přijat paket o nulové velikosti</translation> </message> <message> - <location line="-15"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="-15"/> - <source>%1: Remote closed</source> - <translation>%1: Spojení bylo protější stranou uzavřeno</translation> + <source>Invalid URI: %1</source> + <translation type="obsolete">Neplátná URI: %1</translation> </message> -</context> -<context> - <name>QMYSQLDriver</name> <message> - <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1440"/> - <source>Unable to commit transaction</source> - <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + <source>Socket error on %1: %2</source> + <translation type="obsolete">Chyba zásuvky (socketu) u %1: %2</translation> </message> <message> - <location line="-179"/> - <source>Unable to open database '</source> - <translation>Nepodařilo se otevřít spojení s databází '</translation> + <source>No host name given</source> + <translation type="obsolete">Nebyl zadán název pro hostitelský počítač</translation> </message> <message> - <location line="+11"/> - <source>Unable to connect</source> - <translation>Nepodařilo se navázat spojení</translation> + <source>Read error reading from %1: %2</source> + <translation type="obsolete">Při čtení ze souboru %1 nastala chyba: %2</translation> </message> <message> - <location line="+185"/> - <source>Unable to rollback transaction</source> - <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + <source>Remote host closed the connection prematurely on %1</source> + <translation type="obsolete">Vzdálený počítač předčasně ukončil spojení s %1</translation> </message> <message> - <location line="-34"/> - <source>Unable to begin transaction</source> - <translation>Transakci se nepodařilo spustit</translation> + <source>Operation not supported on %1</source> + <translation type="obsolete">Tato operace není %1 podporována</translation> </message> -</context> -<context> - <name>QMYSQLResult</name> <message> - <location line="-413"/> - <source>Unable to execute statement</source> - <translation>Příkaz se nepodařilo provést</translation> + <source>Write error writing to %1: %2</source> + <translation type="obsolete">Při zápisu do souboru %1: %2 nastala chyba</translation> </message> <message> - <location line="+23"/> - <source>Unable to store statement results</source> - <translation>Výsledky příkazu se nepodařilo uložit</translation> + <source>PulseAudio Sound Server</source> + <translation>Zvukový server PulseAudio</translation> </message> <message> - <location line="-253"/> - <source>Unable to execute next query</source> - <translation>Další dotaz nelze provést</translation> + <source>"%1" duplicates a previous role name and will be disabled.</source> + <translation>"%1" je již zadán jako název předchozí úlohy, a je proto vypnut.</translation> </message> <message> - <location line="+244"/> - <location line="+21"/> - <source>Unable to bind outvalues</source> - <translation>Výstupní hodnoty se nepodařilo spojit</translation> + <source>invalid query: "%1"</source> + <translation>Neplátný dotaz: "%1"</translation> </message> +</context> +<context> + <name>QPPDOptionsModel</name> <message> - <location line="-255"/> - <source>Unable to store next result</source> - <translation>Další výsledek nelze uložit</translation> + <source>Name</source> + <translation>Název</translation> </message> <message> - <location line="-302"/> - <source>Unable to fetch data</source> - <translation>Nepodařilo se natáhnout žádná data</translation> + <source>Value</source> + <translation>Hodnota</translation> </message> +</context> +<context> + <name>QPSQLDriver</name> <message> - <location line="+380"/> - <location line="+8"/> - <source>Unable to prepare statement</source> - <translation>Příkaz se nepodařilo připravit</translation> + <source>Unable to subscribe</source> + <translation>Registrace se nezdařila</translation> </message> <message> - <location line="-199"/> - <source>Unable to store result</source> - <translation>Výsledek se nepodařilo uložit</translation> + <source>Could not begin transaction</source> + <translation>Transakci se nepodařilo spustit</translation> </message> <message> - <location line="+322"/> - <source>Unable to bind value</source> - <translation>Hodnotu se nepodařilo spojit</translation> + <source>Could not rollback transaction</source> + <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> </message> <message> - <location line="-328"/> - <source>Unable to execute query</source> - <translation>Dotaz se nepodařilo provést</translation> + <source>Could not commit transaction</source> + <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> </message> <message> - <location line="+242"/> - <source>Unable to reset statement</source> - <translation>Příkaz se nepodařilo znovu nastavit</translation> + <source>Unable to connect</source> + <translation>Nepodařilo se navázat spojení</translation> </message> -</context> -<context> - <name>QMdiArea</name> <message> - <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/> - <source>(Untitled)</source> - <translation>(Bez názvu)</translation> + <source>Unable to unsubscribe</source> + <translation>Registraci se nepodařilo zrušit</translation> </message> </context> <context> - <name>QMdiSubWindow</name> + <name>QPSQLResult</name> <message> - <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+355"/> - <source>Help</source> - <translation>Nápověda</translation> + <source>Unable to prepare statement</source> + <translation>Příkaz se nepodařilo připravit</translation> </message> <message> - <location line="+3"/> - <source>Menu</source> - <translation>Menu</translation> + <source>Unable to create query</source> + <translation>Nepodařilo se vytvořit žádný dotaz</translation> </message> +</context> +<context> + <name>QPageSetupWidget</name> <message> - <location line="+699"/> - <source>&Move</source> - <translation>Po&sunout</translation> + <source>Form</source> + <translation>Formulář</translation> </message> <message> - <location line="+1"/> - <source>&Size</source> - <translation>Změnit &velikost</translation> + <source>bottom margin</source> + <translation>Dolní okraj</translation> </message> <message> - <location line="-706"/> - <source>Close</source> - <translation>Zavřít</translation> + <source>Paper</source> + <translation>Papír</translation> </message> <message> - <location line="-18"/> - <source>Minimize</source> - <translation>Zmenšit</translation> + <source>Paper source:</source> + <translation>Zdroj papíru:</translation> </message> <message> - <location line="+9"/> - <source>Shade</source> - <translation>Navinout</translation> + <source>Centimeters (cm)</source> + <translation>Centimetry (cm)</translation> </message> <message> - <location line="+720"/> - <source>Stay on &Top</source> - <translation>Zůstat v &popředí</translation> + <source>right margin</source> + <translation>Pravý okraj</translation> </message> <message> - <location line="+3"/> - <source>&Close</source> - <translation>&Zavřít</translation> + <source>Margins</source> + <translation>Okraje</translation> </message> <message> - <location line="-787"/> - <source>- [%1]</source> - <translation>- [%1]</translation> + <source>Landscape</source> + <translation>Formát na šířku</translation> </message> <message> - <location line="+1"/> - <source>%1 - [%2]</source> - <translation>%1 - [%2]</translation> + <source>Width:</source> + <translation>Šířka:</translation> </message> <message> - <location line="+774"/> - <source>&Restore</source> - <translation>&Obnovit</translation> + <source>Orientation</source> + <translation>Zaměření</translation> </message> <message> - <location line="-705"/> - <source>Restore</source> - <translation>Obnovit</translation> + <source>Portrait</source> + <translation>Formát na výšku</translation> </message> <message> - <location line="-12"/> - <source>Maximize</source> - <translation>Zvětšit</translation> + <source>top margin</source> + <translation>Horní okraj</translation> </message> <message> - <location line="+3"/> - <source>Unshade</source> - <translation>Odvinout</translation> + <source>left margin</source> + <translation>Levý okraj</translation> </message> <message> - <location line="+719"/> - <source>Mi&nimize</source> - <translation>Zmen&šit</translation> + <source>Page size:</source> + <translation>Velikost stran:</translation> </message> <message> - <location line="+2"/> - <source>Ma&ximize</source> - <translation>Zvě&tšit</translation> + <source>Reverse portrait</source> + <translation>Obrácený formát na výšku</translation> </message> <message> - <location line="-714"/> - <source>Restore Down</source> - <translation>Obnovit</translation> + <source>Millimeters (mm)</source> + <translation>Milimetry (mm)</translation> </message> -</context> -<context> - <name>QMenu</name> <message> - <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+158"/> - <location line="+225"/> - <source>Open</source> - <translation>Otevřít</translation> + <source>Points (pt)</source> + <translation>Body (pt)</translation> </message> <message> - <location line="-226"/> - <location line="+225"/> - <source>Close</source> - <translation>Zavřít</translation> + <source>Inches (in)</source> + <translation>Palce (in)</translation> </message> <message> - <location line="-222"/> - <location line="+225"/> - <location line="+51"/> - <source>Execute</source> - <translation>Provést</translation> + <source>Reverse landscape</source> + <translation>Obrácený formát na šířku</translation> </message> -</context> -<context> - <name>QMenuBar</name> <message> - <location filename="../src/gui/widgets/qmenu_symbian.cpp" line="+410"/> - <source>Actions</source> - <translation>Činnosti</translation> + <source>Height:</source> + <translation>Výška:</translation> </message> </context> <context> - <name>QMessageBox</name> + <name>QPluginLoader</name> <message> - <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1964"/> - <location line="+847"/> - <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/> - <location line="+8"/> - <source>OK</source> - <translation>OK</translation> + <source>The plugin was not loaded.</source> + <translation>Přídavný modul nebyl nahrán.</translation> </message> <message> - <location line="+1"/> - <source>Help</source> - <translation>Nápověda</translation> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> </message> +</context> +<context> + <name>QPrintDialog</name> <message> - <source><h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation type="obsolete"><h3>O Qt</h3><p>Tento program používá Qt ve verzi %1.</p><p>Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.</p><p>Qt poskytuje jednoduchou přenositelnost přes MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.</p>Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.</p><p>Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Podívejte se, prosím, na <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> kvůli přehledu licencování Qt.</p><p>Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná(é) společnost(i).</p><p>Qt je výrobkem společnosti Nokia. Podívejte se na <a href="http://qt.nokia.com/">qt.nokia.com</a>kvůli více informacím.</p></translation> + <source>A0</source> + <translation>A0</translation> </message> <message> - <location line="-1099"/> - <source>Show Details...</source> - <translation>Ukázat podrobnosti...</translation> + <source>A1</source> + <translation>A1</translation> </message> <message> - <location line="+1575"/> - <source><h3>About Qt</h3><p>This program uses Qt version %1.</p></source> - <translation><h3>O Qt</h3><p>Tento program používá Qt-verze %1.</p></translation> + <source>A2</source> + <translation>A2</translation> </message> <message> - <location line="+5"/> - <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation><p>Qt je sadou softwarových nástrojů C++ určených pro vývoj aplikací napříč platformami.</p><p>Qt poskytuje jednoduchou přenositelnost přes MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, a všechny hlavní obchodní varianty systému Unix. Qt je rovněž dostupný pro vložená zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné pod třemi rozdílnými licenčními volbami navrženými pro přizpůsobení se potřebám našich různých uživatelů.</p>Qt licencované pod naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, kde si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami, nebo jinak řečeno, když nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt licencované pod GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem), za předpokladu že můžete souhlasit s požadavky a podmínkami GNU LGPL version 2.1.</p><p>Qt licencované pod GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochoten souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Podívejte se, prosím, na <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> kvůli přehledu licencování Qt.</p><p>Copyright (C) 2009 Nokia Corporation a/nebo její dceřinná(é) společnost(i).</p><p>Qt je výrobkem společnosti Nokia. Podívejte se na <a href="http://qt.nokia.com/">qt.nokia.com</a>kvůli více informacím.</p></translation> + <source>A3</source> + <translation>A3</translation> </message> <message> - <location line="+31"/> - <source>About Qt</source> - <translation>O Qt</translation> + <source>A4</source> + <translation>A4</translation> </message> <message> - <source><p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> for an overview of Qt licensing.</p></source> - <translation type="obsolete"><p>Tento program používá Qt Open Source Edition verze %1.</p><p>Qt Open Source Edition je zamýšlena pro vývoj Open Source aplikací. Pro vývoj vlastnických aplikací (uzavřené zdrojové kódy) potřebujete Qt licenci.</p><p>Podívejte se, prosím, na <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> kvůli přehledu licencování Qt.</p></translation> + <source>A5</source> + <translation>A5</translation> </message> <message> - <location line="-1610"/> - <source>Hide Details...</source> - <translation>Skrýt podrobnosti...</translation> + <source>A6</source> + <translation>A6</translation> </message> <message> - <source><p>This program uses Qt version %1.</p></source> - <translation type="obsolete"><p>Tento program používá Qt-verze %1.</p></translation> + <source>A7</source> + <translation>A7</translation> </message> -</context> -<context> - <name>QMultiInputContext</name> <message> - <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/> - <source>Select IM</source> - <translation>Zvolit způsob vstupu</translation> + <source>A8</source> + <translation>A8</translation> </message> -</context> -<context> - <name>QMultiInputContextPlugin</name> <message> - <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+102"/> - <source>Multiple input method switcher that uses the context menu of the text widgets</source> - <translation>Přepínač pro více způsobů vstupu, který používá související nabídku textového prvku</translation> + <source>A9</source> + <translation>A9</translation> </message> <message> - <location line="-7"/> - <source>Multiple input method switcher</source> - <translation>Přepínač pro více způsobů vstupu</translation> + <source>B0</source> + <translation>B0</translation> </message> -</context> -<context> - <name>QNativeSocketEngine</name> <message> - <location filename="../src/network/socket/qnativesocketengine.cpp" line="+269"/> - <source>The proxy type is invalid for this operation</source> - <translation>Tuto operaci nelze s tímto typem proxy provést</translation> + <source>B1</source> + <translation>B1</translation> </message> <message> - <location line="-60"/> - <source>Network operation timed out</source> - <translation>Časový limit pro síťovou operaci byl překročen</translation> + <source>B2</source> + <translation>B2</translation> </message> <message> - <location line="-3"/> - <source>The remote host closed the connection</source> - <translation>Vzdálený počítač uzavřel spojení</translation> + <source>B3</source> + <translation>B3</translation> </message> <message> - <location line="+15"/> - <source>Invalid socket descriptor</source> - <translation>Neplatný deskriptor zásuvky (socketu)</translation> + <source>B4</source> + <translation>B4</translation> </message> <message> - <location line="+3"/> - <source>Host unreachable</source> - <translation>Cílový počítač je nedosažitelný</translation> + <source>B5</source> + <translation>B5</translation> </message> <message> - <location line="-6"/> - <source>Protocol type not supported</source> - <translation>Protokol tohoto typu není podporován</translation> + <source>B6</source> + <translation>B6</translation> </message> <message> - <location line="+30"/> - <source>Datagram was too large to send</source> - <translation>Datagram byl pro odeslání příliš veliký</translation> + <source>B7</source> + <translation>B7</translation> </message> <message> - <location line="-45"/> - <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> - <translation>Vyzkoušelo se použít IPv6 zásuvku (socket) na systému bez podpory IPv6</translation> + <source>B8</source> + <translation>B8</translation> </message> <message> - <location line="+51"/> - <source>Unable to receive a message</source> - <translation>Zprávu se nepodařilo přijmout</translation> + <source>B9</source> + <translation>B9</translation> </message> <message> - <location line="-24"/> - <source>Permission denied</source> - <translation>Přístup odepřen</translation> + <source>OK</source> + <translation>OK</translation> </message> <message> - <location line="+6"/> - <source>Connection refused</source> - <translation>Spojení bylo odmítnuto</translation> + <source>B10</source> + <translation>B10</translation> </message> <message> - <location line="+21"/> - <source>Unable to write</source> - <translation>Nepodařilo se zapsat</translation> + <source>C5E</source> + <translation>C5E</translation> </message> <message> - <location line="+6"/> - <source>Another socket is already listening on the same port</source> - <translation>Na tomto portu již naslouchá jiná zásuvka (socket)</translation> + <source>DLE</source> + <translation>DLE</translation> </message> <message> - <location line="-12"/> - <source>Unable to send a message</source> - <translation>Nepodařilo se odeslat hlášení</translation> + <source>A6 (105 x 148 mm)</source> + <translation>A6 (105 x 148 mm)</translation> </message> <message> - <location line="-12"/> - <source>The bound address is already in use</source> - <translation>Uvedená adresa se už používá</translation> + <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> + <translation>Právní (8,5 x 14 palců, 216 x 356 mm)</translation> </message> <message> - <location line="-6"/> - <source>Connection timed out</source> - <translation>Časový limit pro spojení byl překročen</translation> + <source>Folio</source> + <translation>Folio</translation> </message> <message> - <location line="+27"/> - <source>Network error</source> - <translation>Síťová chyba</translation> + <source>Legal</source> + <translation>Právní</translation> </message> <message> - <location line="-45"/> - <source>Unsupported socket operation</source> - <translation>Nepodporovaná zásuvková operace (povel pro socket)</translation> + <source>Print all</source> + <translation>Tisknout vše</translation> </message> <message> - <location line="+51"/> - <source>Operation on non-socket</source> - <translation>Operaci lze použít pouze na jedné zásuvce (socketu)</translation> + <source>Print</source> + <translation>Tisk</translation> </message> <message> - <location line="-66"/> - <source>Unable to initialize broadcast socket</source> - <translation>Zásuvku pro vysílání (socket) se nepodařilo spustit</translation> + <source>&Options <<</source> + <translation>&Nastavení << </translation> </message> <message> - <location line="+72"/> - <source>Unknown error</source> - <translation>Neznámá chyba</translation> + <source>&Options >></source> + <translation>&Nastavení >></translation> </message> <message> - <location line="-75"/> - <source>Unable to initialize non-blocking socket</source> - <translation>Neblokující zásuvku (socket) se nepodařilo spustit</translation> + <source>B6 (125 x 176 mm)</source> + <translation>B6 (125 x 176 mm)</translation> </message> <message> - <location line="+48"/> - <source>The address is protected</source> - <translation>Adresa je chráněna</translation> + <source>B8 (62 x 88 mm)</source> + <translation>B8 (62 x 88 mm)</translation> </message> <message> - <location line="-18"/> - <source>Network unreachable</source> - <translation>Síť je nedosažitelná</translation> + <source>A8 (52 x 74 mm)</source> + <translation>A8 (52 x 74 mm)</translation> </message> <message> - <location line="+15"/> - <source>The address is not available</source> - <translation>Adresa není dostupná</translation> + <source>B9 (44 x 62 mm)</source> + <translation>B9 (44 x 62 mm)</translation> </message> <message> - <location line="-30"/> - <source>Out of resources</source> - <translation>Nejsou dostupné žádné zdroje</translation> + <source>A9 (37 x 52 mm)</source> + <translation>A9 (37 x 52 mm)</translation> </message> -</context> -<context> - <name>QNetworkAccessCacheBackend</name> <message> - <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+66"/> - <source>Error opening %1</source> - <translation>%1 se nepodařilo otevřít</translation> + <source>B0 (1000 x 1414 mm)</source> + <translation>B0 (1000 x 1414 mm)</translation> </message> -</context> -<context> - <name>QNetworkAccessDebugPipeBackend</name> <message> - <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+195"/> - <source>Write error writing to %1: %2</source> - <translation>Při zápisu do souboru %1: %2 nastala chyba</translation> + <source>A5 (148 x 210 mm)</source> + <translation>A5 (148 x 210 mm)</translation> </message> -</context> -<context> - <name>QNetworkAccessFileBackend</name> <message> - <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+100"/> - <source>Request for opening non-local file %1</source> - <translation>Požadavek na otevření souboru přes síť %1</translation> + <source>Tabloid (279 x 432 mm)</source> + <translation>Bulvární noviny/tisk (279 x 432 mm)</translation> </message> <message> - <location line="+152"/> - <source>Read error reading from %1: %2</source> - <translation>Při čtení ze souboru %1 nastala chyba: %2</translation> + <source>B10 (31 x 44 mm)</source> + <translation>B10 (31 x 44 mm)</translation> </message> <message> - <location line="-21"/> - <source>Cannot open %1: Path is a directory</source> - <translation>%1 nelze otevřít: Jedná se o adresář</translation> + <source>B2 (500 x 707 mm)</source> + <translation>B2 (500 x 707 mm)</translation> </message> <message> - <location line="-86"/> - <source>Error opening %1: %2</source> - <translation>%1 se nepodařilo otevřít: %2</translation> + <source>&Print</source> + <translation>&Tisk</translation> </message> <message> - <location line="+38"/> - <source>Write error writing to %1: %2</source> - <translation>Při zápisu do souboru %1: %2 nastala chyba</translation> + <source>A3 (297 x 420 mm)</source> + <translation>A3 (297 x 420 mm)</translation> </message> -</context> -<context> - <name>QNetworkAccessFtpBackend</name> <message> - <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+131"/> - <source>No suitable proxy found</source> - <translation>Nepodařilo se najít žádný vhodný proxy server</translation> + <source>Print selection</source> + <translation>Tisk výběru</translation> </message> <message> - <location line="+165"/> - <source>Error while downloading %1: %2</source> - <translation>Při stahování %1 se vyskytla chyba: %2</translation> + <source>Print to File (Postscript)</source> + <translation>Tisk do souboru (Postscript)</translation> </message> <message> - <location line="+2"/> - <source>Error while uploading %1: %2</source> - <translation>Při nahrávání %1 se vyskytla chyba: %2</translation> + <source>B4 (250 x 353 mm)</source> + <translation>B4 (250 x 353 mm)</translation> </message> <message> - <location line="-153"/> - <source>Cannot open %1: is a directory</source> - <translation>%1 nelze otevřít: Jedná se o adresář</translation> + <source>%1 already exists. +Do you want to overwrite it?</source> + <translation>Soubor %1 již existuje. +Má se přepsat?</translation> </message> <message> - <location line="+112"/> - <source>Logging in to %1 failed: authentication required</source> - <translation>Přihlášení do %1 se nezdařilo: Je požadována autentizace</translation> + <source>A1 (594 x 841 mm)</source> + <translation>A1 (594 x 841 mm)</translation> </message> -</context> -<context> - <name>QNetworkAccessHttpBackend</name> <message> - <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+585"/> - <source>No suitable proxy found</source> - <translation>Nepodařilo se najít žádný vhodný proxy server</translation> + <source>Custom</source> + <translation>Stanovený uživatelem</translation> </message> -</context> -<context> - <name>QNetworkReply</name> <message> - <location line="+95"/> - <source>Error downloading %1 - server replied: %2</source> - <translation>Beim Herunterladen von %1 trat ein Fehler auf - Die Antwort des Servers ist: %2</translation> + <source>B1 (707 x 1000 mm)</source> + <translation>B1 (707 x 1000 mm)</translation> </message> <message> - <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+77"/> - <source>Protocol "%1" is unknown</source> - <translation>Protokol "%1" není znám</translation> + <source>Folio (210 x 330 mm)</source> + <translation>Folio (210 x 330 mm)</translation> </message> -</context> -<context> - <name>QNetworkReplyImpl</name> <message> - <location line="+519"/> - <location line="+28"/> - <source>Operation canceled</source> - <translation>Operace byla zrušena</translation> + <source>Ledger</source> + <translation>Hlavní (účetní) kniha</translation> </message> -</context> -<context> - <name>QOCIDriver</name> <message> - <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2166"/> - <source>Unable to commit transaction</source> - <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + <source>Letter</source> + <translation>Dopis</translation> </message> <message> - <source>Unable to initialize</source> - <translation type="obsolete">Inicializace se nezdařila</translation> + <source>DLE (110 x 220 mm)</source> + <translation>DLE (110 x 220 mm)</translation> </message> <message> - <location line="-90"/> - <source>Unable to logon</source> - <translation>Přihlášení se nezdařilo</translation> + <source>C5E (163 x 229 mm)</source> + <translation>C5E (163 x 229 mm)</translation> </message> <message> - <location line="+109"/> - <source>Unable to rollback transaction</source> - <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> + <translation>B5 (176 x 250 mm, 6.93 x 9.84 palců</translation> </message> <message> - <location line="-38"/> - <source>Unable to begin transaction</source> - <translation>Transakci se nepodařilo spustit</translation> + <source>Print range</source> + <translation>Tisková oblast</translation> </message> <message> - <location line="-215"/> - <source>Unable to initialize</source> - <comment>QOCIDriver</comment> - <translation>Spuštění se nezdařilo</translation> + <source>Print current page</source> + <translation>Vytisknout tuto stranu</translation> </message> -</context> -<context> - <name>QOCIResult</name> <message> - <location line="-165"/> - <source>Unable to alloc statement</source> - <translation>Přidělení příkazu se nepodařilo</translation> + <source>File exists</source> + <translation>Soubor již existuje</translation> </message> <message> - <location line="-59"/> - <source>Unable to goto next</source> - <translation>Nelze jít k dalšímu prvku</translation> + <source>Write %1 file</source> + <translation>Zapsat %1 soubor</translation> </message> <message> - <location line="+100"/> - <source>Unable to get statement type</source> - <translation>Nepodařilo se získat typ příkazu</translation> + <source>A0 (841 x 1189 mm)</source> + <translation>A0 (841 x 1189 mm)</translation> </message> <message> - <location line="+39"/> - <source>Unable to execute statement</source> - <translation>Příkaz se nepodařilo provést</translation> + <source>Local file</source> + <translation>Místní soubor</translation> </message> <message> - <location line="-634"/> - <location line="+161"/> - <location line="+15"/> - <source>Unable to bind column for batch execute</source> - <translation>Nepodařilo se spojit sloupec pro provedení příkazu dávkového zpracování</translation> + <source>locally connected</source> + <translation>přímo spojeno</translation> </message> <message> - <source>Unable to execute select statement</source> - <translation type="obsolete">Výběrové vyhledávání se nepodařilo provést</translation> + <source>Ledger (432 x 279 mm)</source> + <translation>Hlavní (účetní) kniha (432 x 279 mm)</translation> </message> <message> - <location line="+393"/> - <source>Unable to prepare statement</source> - <translation>Příkaz se nepodařilo připravit</translation> + <source>Aliases: %1</source> + <translation>Přezdívka: %1</translation> </message> <message> - <location line="-378"/> - <source>Unable to execute batch statement</source> - <translation>Příkaz pro dávkové zpracování se nepodařilo provést</translation> + <source>Print to File (PDF)</source> + <translation>Tisk do souboru (PDF)</translation> </message> <message> - <location line="+424"/> - <source>Unable to bind value</source> - <translation>Hodnotu se nepodařilo spojit</translation> + <source>Print To File ...</source> + <translation>Tisk do souboru...</translation> </message> -</context> -<context> - <name>QODBCDriver</name> <message> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+2045"/> - <source>Unable to commit transaction</source> - <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + <source>US Common #10 Envelope (105 x 241 mm)</source> + <translation>US běžná #10 obálka (105 x 241 mm)</translation> </message> <message> - <location line="+32"/> - <source>Unable to enable autocommit</source> - <translation>'autocommit' se nepodařilo povolit</translation> + <source>Tabloid</source> + <translation>Bulvární noviny</translation> </message> <message> - <source>Unable to connect - Driver doesn't support all needed functionality</source> - <translation type="obsolete">Nepodařilo se navázat spojení, protože ovladač nutnou funkcionalitu plně nepodporuje</translation> + <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> + <translation>A4 (210 x 297 mm, 8.26 x 11.7 palců)</translation> </message> <message> - <location line="-49"/> - <source>Unable to disable autocommit</source> - <translation>'autocommit', automatické odeslání, se nepodařilo zastavit</translation> + <source>Executive</source> + <translation>Prováděcí</translation> </message> <message> - <location line="-238"/> - <source>Unable to connect</source> - <translation>Nepodařilo se navázat spojení</translation> + <source>unknown</source> + <translation>Neznámý</translation> </message> <message> - <location line="+6"/> - <source>Unable to connect - Driver doesn't support all functionality required</source> - <translation>Nepodařilo se navázat spojení, protože ovladač nutnou funkcionalitu plně nepodporuje</translation> + <source><qt>Do you want to overwrite it?</qt></source> + <translation><qt>Chcete jej přepsat?</qt></translation> </message> <message> - <location line="+266"/> - <source>Unable to rollback transaction</source> - <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> + <translation>Prováděcí (7,5 x 10 palců, 191 x 254 mm)</translation> </message> -</context> -<context> - <name>QODBCResult</name> <message> - <location line="-566"/> - <source>Unable to bind variable</source> - <translation>Proměnnou se nepodařilo provést</translation> + <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> + <translation>Dopis (8,5 x 11 palců, 216 x 279 mm)</translation> </message> <message> - <location line="-615"/> - <location line="+623"/> - <source>Unable to execute statement</source> - <translation>Příkaz se nepodařilo provést</translation> + <source>The 'From' value cannot be greater than the 'To' value.</source> + <translation>Údaj pro první stranu nesmí být větší než údaj pro poslední stranu.</translation> </message> <message> - <location line="-547"/> - <source>Unable to fetch next</source> - <translation>Další datový záznam se nepodařilo natáhnout</translation> + <source>US Common #10 Envelope</source> + <translation>US běžná #10 obálka</translation> </message> <message> - <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+190"/> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+72"/> - <location line="+576"/> - <source>Unable to fetch last</source> - <translation>Poslední datový záznam se nepodařilo natáhnout</translation> + <source>%1 is a directory. +Please choose a different file name.</source> + <translation>%1 je adresář. +Zvolte, prosím, pro soubor jiný název.</translation> </message> <message> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-377"/> - <source>Unable to prepare statement</source> - <translation>Příkaz se nepodařilo spustit</translation> + <source>File %1 is not writable. +Please choose a different file name.</source> + <translation>Soubor %1 je chráněn proti zápisu. +Zvolte, prosím, pro soubor jiný název.</translation> </message> <message> - <location line="-230"/> - <source>Unable to fetch previous</source> - <translation>Předchozí datový záznam se nepodařilo natáhnout</translation> + <source>B3 (353 x 500 mm)</source> + <translation>B3 (353 x 500 mm)</translation> </message> <message> - <location line="-63"/> - <source>Unable to fetch</source> - <translation>Nepodařilo se natáhnout žádná data</translation> + <source>A7 (74 x 105 mm)</source> + <translation>A7 (74 x 105 mm)</translation> </message> <message> - <location line="-71"/> - <location line="+346"/> - <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> - <translation>QODBCResult::reset: 'SQL_CURSOR_STATIC' se nepodařilo nastavit jako příkaz vlastnosti . Ověřte, prosím, nastavení svého ODBC ovladače</translation> + <source>A2 (420 x 594 mm)</source> + <translation>A2 (420 x 594 mm)</translation> </message> <message> - <location line="-231"/> - <source>Unable to fetch first</source> - <translation>První datový záznam se nepodařilo natáhnout</translation> + <source>B7 (88 x 125 mm)</source> + <translation>B7 (88 x 125 mm)</translation> </message> </context> <context> - <name>QObject</name> + <name>QPrintPreviewDialog</name> <message> - <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="-97"/> - <source>Invalid hostname</source> - <translation>Neplatný název pro hostitelský počítač</translation> + <source>%1%</source> + <translation>%1%</translation> </message> <message> - <source>Home</source> - <translation type="obsolete">Home</translation> + <source>Print Preview</source> + <translation>Náhled tisku</translation> </message> <message> - <source>Protocol error: packet of size 0 received</source> - <translation type="obsolete">Chyba v zápisu: Byl přijat paket o nulové velikosti</translation> + <source>Close</source> + <translation>Zavřít</translation> </message> <message> - <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+131"/> - <source>Invalid URI: %1</source> - <translation>Neplátná URI: %1</translation> + <source>Print</source> + <translation>Tisk</translation> </message> <message> - <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+60"/> - <source>Socket error on %1: %2</source> - <translation>Chyba zásuvky (socketu) u %1: %2</translation> + <source>Fit page</source> + <translation>Přizpůsobit stranu</translation> </message> <message> - <location filename="../src/network/kernel/qhostinfo.cpp" line="+175"/> - <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+0"/> - <source>No host name given</source> - <translation>Nebyl zadán název pro hostitelský počítač</translation> + <source>Zoom in</source> + <translation>Zvětšit</translation> </message> <message> - <source>Read error reading from %1: %2</source> - <translation type="obsolete">Při čtení ze souboru %1 nastala chyba: %2</translation> + <source>Landscape</source> + <translation>Formát na šířku</translation> </message> <message> - <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+15"/> - <source>Remote host closed the connection prematurely on %1</source> - <translation>Vzdálený počítač předčasně ukončil spojení s %1</translation> + <source>Zoom out</source> + <translation>Zmenšit</translation> </message> <message> - <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="-57"/> - <source>Operation not supported on %1</source> - <translation>Tato operace není %1 podporována</translation> + <source>Fit width</source> + <translation>Přizpůsobit šířku</translation> </message> <message> - <source>Write error writing to %1: %2</source> - <translation type="obsolete">Při zápisu do souboru %1: %2 nastala chyba</translation> + <source>Portrait</source> + <translation>Formát na výšku</translation> </message> -</context> -<context> - <name>QPPDOptionsModel</name> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1198"/> - <source>Name</source> - <translation>Název</translation> + <source>Page Setup</source> + <translation>Nastavení strany</translation> </message> <message> - <location line="+2"/> - <source>Value</source> - <translation>Hodnota</translation> + <source>Page setup</source> + <translation>Nastavení strany</translation> + </message> + <message> + <source>Show overview of all pages</source> + <translation>Ukázat přehled všech stran</translation> </message> -</context> -<context> - <name>QPSQLDriver</name> <message> - <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+1251"/> - <source>Unable to subscribe</source> - <translation>Registrace se nezdařila</translation> + <source>First page</source> + <translation>První strana</translation> </message> <message> - <location line="-420"/> - <source>Could not begin transaction</source> - <translation>Transakci se nepodařilo spustit</translation> + <source>Last page</source> + <translation>Poslední strana</translation> </message> <message> - <location line="+46"/> - <source>Could not rollback transaction</source> - <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + <source>Show single page</source> + <translation>Ukázat jednotlivé strany</translation> </message> <message> - <location line="-16"/> - <source>Could not commit transaction</source> - <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + <source>Export to PDF</source> + <translation>Vyvést do PDF</translation> </message> <message> - <location line="-79"/> - <source>Unable to connect</source> - <translation>Nepodařilo se navázat spojení</translation> + <source>Previous page</source> + <translation>Předchozí strana</translation> </message> <message> - <location line="+501"/> - <source>Unable to unsubscribe</source> - <translation>Registraci se nepodařilo zrušit</translation> + <source>Next page</source> + <translation>Další strana</translation> </message> -</context> -<context> - <name>QPSQLResult</name> <message> - <location line="-713"/> - <source>Unable to prepare statement</source> - <translation>Příkaz se nepodařilo připravit</translation> + <source>Show facing pages</source> + <translation>Ukázat strany ležící naproti</translation> </message> <message> - <location line="-372"/> - <source>Unable to create query</source> - <translation>Nepodařilo se vytvořit žádný dotaz</translation> + <source>Export to PostScript</source> + <translation>Vyvést do PostScriptu</translation> </message> </context> <context> - <name>QPageSetupWidget</name> + <name>QPrintPropertiesWidget</name> <message> - <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/> <source>Form</source> <translation>Formulář</translation> </message> <message> - <location/> - <source>bottom margin</source> - <translation>Dolní okraj</translation> - </message> - <message> - <location/> - <source>Paper</source> - <translation>Papír</translation> + <source>Page</source> + <translation>Strana</translation> </message> <message> - <location/> - <source>Paper source:</source> - <translation>Zdroj papíru:</translation> + <source>Advanced</source> + <translation>Rozšířené</translation> </message> +</context> +<context> + <name>QPrintSettingsOutput</name> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/> - <source>Centimeters (cm)</source> - <translation>Centimetry (cm)</translation> + <source>to</source> + <translation>do</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/> - <source>right margin</source> - <translation>Pravý okraj</translation> + <source>Form</source> + <translation>Formulář</translation> </message> <message> - <location/> - <source>Margins</source> - <translation>Okraje</translation> + <source>None</source> + <translation>Žádný</translation> </message> <message> - <location/> - <source>Landscape</source> - <translation>Formát na šířku</translation> + <source>Color</source> + <translation>Barva</translation> </message> <message> - <location/> - <source>Width:</source> - <translation>Šířka:</translation> + <source>Print all</source> + <translation>Tisknout vše</translation> </message> <message> - <location/> - <source>Orientation</source> - <translation>Zaměření</translation> + <source>Selection</source> + <translation>Výběr</translation> </message> <message> - <location/> - <source>Portrait</source> - <translation>Formát na výšku</translation> + <source>Long side</source> + <translation>Dlouhá strana</translation> </message> <message> - <location/> - <source>top margin</source> - <translation>Horní okraj</translation> + <source>Copies</source> + <translation>Počet exemplářů</translation> </message> <message> - <location/> - <source>left margin</source> - <translation>Levý okraj</translation> + <source>Print range</source> + <translation>Tisk oblasti</translation> </message> <message> - <location/> - <source>Page size:</source> - <translation>Velikost stran:</translation> + <source>Color Mode</source> + <translation>Barevný režim</translation> </message> <message> - <location/> - <source>Reverse portrait</source> - <translation>Obrácený formát na výšku</translation> + <source>Options</source> + <translation>Volby</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+0"/> - <source>Millimeters (mm)</source> - <translation>Milimetry (mm)</translation> + <source>Output Settings</source> + <translation>Nastavení výstupu</translation> </message> <message> - <location line="+0"/> - <source>Points (pt)</source> - <translation>Body (pt)</translation> + <source>Reverse</source> + <translation>Obrácený</translation> </message> <message> - <location line="+0"/> - <source>Inches (in)</source> - <translation>Palce (in)</translation> + <source>Grayscale</source> + <translation>Odstíny šedi</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/> - <source>Reverse landscape</source> - <translation>Obrácený formát na šířku</translation> + <source>Short side</source> + <translation>Krátká strana</translation> </message> <message> - <location/> - <source>Height:</source> - <translation>Výška:</translation> + <source>Collate</source> + <translation>Srovnat</translation> </message> -</context> -<context> - <name>QPluginLoader</name> <message> - <location filename="../src/corelib/plugin/qpluginloader.cpp" line="-89"/> - <source>The plugin was not loaded.</source> - <translation>Přídavný modul nebyl nahrán.</translation> + <source>Copies:</source> + <translation>Počet exemplářů:</translation> </message> <message> - <location line="+113"/> - <source>Unknown error</source> - <translation>Neznámá chyba</translation> + <source>Pages from</source> + <translation>Strany od</translation> </message> -</context> -<context> - <name>QPrintDialog</name> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/> - <source>A0</source> - <translation>A0</translation> + <source>Duplex Printing</source> + <translation>Zdvojený tisk</translation> </message> <message> - <location line="+1"/> - <source>A1</source> - <translation>A1</translation> + <source>Current Page</source> + <translation>Nynější strana</translation> </message> +</context> +<context> + <name>QPrintWidget</name> <message> - <location line="+1"/> - <source>A2</source> - <translation>A2</translation> + <source>...</source> + <translation>...</translation> </message> <message> - <location line="+1"/> - <source>A3</source> - <translation>A3</translation> + <source>Form</source> + <translation>Formulář</translation> </message> <message> - <location line="+1"/> - <source>A4</source> - <translation>A4</translation> + <source>Type:</source> + <translation>Typ:</translation> </message> <message> - <location line="+1"/> - <source>A5</source> - <translation>A5</translation> + <source>&Name:</source> + <translation>&Název:</translation> </message> <message> - <location line="+1"/> - <source>A6</source> - <translation>A6</translation> + <source>Output &file:</source> + <translation>Výstupní &soubor:</translation> </message> <message> - <location line="+1"/> - <source>A7</source> - <translation>A7</translation> + <source>P&roperties</source> + <translation>&Vlastnosti</translation> </message> <message> - <location line="+1"/> - <source>A8</source> - <translation>A8</translation> + <source>Preview</source> + <translation>Náhled</translation> </message> <message> - <location line="+1"/> - <source>A9</source> - <translation>A9</translation> + <source>Printer</source> + <translation>Tiskárna</translation> </message> <message> - <location line="+1"/> - <source>B0</source> - <translation>B0</translation> + <source>Location:</source> + <translation>Umístění:</translation> </message> +</context> +<context> + <name>QProcess</name> <message> - <location line="+1"/> - <source>B1</source> - <translation>B1</translation> + <source>Error writing to process</source> + <translation>Zápis do procesu se nezdařil</translation> </message> <message> - <location line="+1"/> - <source>B2</source> - <translation>B2</translation> + <source>No program defined</source> + <translation>Nestanoven žádný program</translation> </message> <message> - <location line="+1"/> - <source>B3</source> - <translation>B3</translation> + <source>Resource error (fork failure): %1</source> + <translation>Potíže se zdroji (selhání rozcestí - "fork failure"): %1</translation> </message> <message> - <location line="+1"/> - <source>B4</source> - <translation>B4</translation> + <source>Error reading from process</source> + <translation>Čtení z procesu se nezdařilo</translation> </message> <message> - <location line="+1"/> - <source>B5</source> - <translation>B5</translation> + <source>Process failed to start</source> + <translation type="obsolete">Spuštění procesu se nezdařilo</translation> </message> <message> - <location line="+1"/> - <source>B6</source> - <translation>B6</translation> + <source>Could not open input redirection for reading</source> + <translation>Vstupní přesměrování se nepodařilo otevřít pro čtení</translation> </message> <message> - <location line="+1"/> - <source>B7</source> - <translation>B7</translation> + <source>Could not open output redirection for writing</source> + <translation>Výstupní přesměrování se nepodařilo otevřít pro zápis</translation> </message> <message> - <location line="+1"/> - <source>B8</source> - <translation>B8</translation> + <source>Process operation timed out</source> + <translation>Překročení času u procesu</translation> </message> <message> - <location line="+1"/> - <source>B9</source> - <translation>B9</translation> + <source>Process crashed</source> + <translation>Proces spadl</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+266"/> - <source>OK</source> - <translation>OK</translation> + <source>Process failed to start: %1</source> + <translation>Proces se nepodařilo spustit: %1</translation> </message> +</context> +<context> + <name>QProgressDialog</name> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+1"/> - <source>B10</source> - <translation>B10</translation> + <source>Cancel</source> + <translation>Zrušit</translation> </message> +</context> +<context> + <name>QPushButton</name> <message> - <location line="+1"/> - <source>C5E</source> - <translation>C5E</translation> + <source>Open</source> + <translation>Otevřít</translation> </message> +</context> +<context> + <name>QRadioButton</name> <message> - <location line="+1"/> - <source>DLE</source> - <translation>DLE</translation> + <source>Check</source> + <translation>Označit křížkem</translation> </message> +</context> +<context> + <name>QRegExp</name> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+335"/> - <source>A6 (105 x 148 mm)</source> - <translation>A6 (105 x 148 mm)</translation> + <source>bad lookahead syntax</source> + <translation>nesprávná syntax pro plánování dopředu</translation> </message> <message> - <location line="+20"/> - <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> - <translation>Právní (8,5 x 14 palců, 216 x 356 mm)</translation> + <source>no error occurred</source> + <translation>žádná chyba</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+2"/> - <source>Folio</source> - <translation>Folio</translation> + <source>missing left delim</source> + <translation>chybějící levé vymezení</translation> </message> <message> - <location line="+2"/> - <source>Legal</source> - <translation>Právní</translation> + <source>bad char class syntax</source> + <translation>nesprávná syntax pro třídu znaku</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+20"/> - <source>Print all</source> - <translation>Tisknout vše</translation> + <source>disabled feature used</source> + <translation>byla použita zakázaná vlastnost</translation> </message> <message> - <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+112"/> - <location line="+13"/> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/> - <source>Print</source> - <translation>Tisk</translation> + <source>invalid octal value</source> + <translation>neplatná osmičková hodnota</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-733"/> - <source>&Options <<</source> - <translation>&Nastavení << </translation> + <source>invalid interval</source> + <translation>neplatný interval</translation> </message> <message> - <location line="-72"/> - <location line="+68"/> - <source>&Options >></source> - <translation>&Nastavení >></translation> + <source>invalid category</source> + <translation>neplatná skupina</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-30"/> - <source>B6 (125 x 176 mm)</source> - <translation>B6 (125 x 176 mm)</translation> + <source>bad repetition syntax</source> + <translation>nesprávná syntax pro opakování</translation> </message> <message> - <location line="+2"/> - <source>B8 (62 x 88 mm)</source> - <translation>B8 (62 x 88 mm)</translation> + <source>met internal limit</source> + <translation>dosažena vnitřní mez</translation> </message> <message> - <location line="-10"/> - <source>A8 (52 x 74 mm)</source> - <translation>A8 (52 x 74 mm)</translation> + <source>unexpected end</source> + <translation>neočekávaný konec</translation> </message> +</context> +<context> + <name>QSQLite2Driver</name> <message> - <location line="+11"/> - <source>B9 (44 x 62 mm)</source> - <translation>B9 (44 x 62 mm)</translation> + <source>Unable to commit transaction</source> + <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> </message> <message> - <location line="-10"/> - <source>A9 (37 x 52 mm)</source> - <translation>A9 (37 x 52 mm)</translation> + <source>Error to open database</source> + <translation type="obsolete">Nepodařilo se otevřít spojení s datatabází</translation> </message> <message> - <location line="+1"/> - <source>B0 (1000 x 1414 mm)</source> - <translation>B0 (1000 x 1414 mm)</translation> + <source>Unable to rollback Transaction</source> + <translation type="obsolete">Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> </message> <message> - <location line="-5"/> - <source>A5 (148 x 210 mm)</source> - <translation>A5 (148 x 210 mm)</translation> + <source>Unable to begin transaction</source> + <translation>Transakci se nepodařilo spustit</translation> </message> <message> - <location line="+23"/> - <source>Tabloid (279 x 432 mm)</source> - <translation>Bulvární noviny/tisk (279 x 432 mm)</translation> + <source>Error opening database</source> + <translation>Nepodařilo se otevřít spojení s databází</translation> </message> <message> - <location line="-8"/> - <source>B10 (31 x 44 mm)</source> - <translation>B10 (31 x 44 mm)</translation> + <source>Unable to rollback transaction</source> + <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> </message> +</context> +<context> + <name>QSQLite2Result</name> <message> - <location line="-8"/> - <source>B2 (500 x 707 mm)</source> - <translation>B2 (500 x 707 mm)</translation> + <source>Unable to execute statement</source> + <translation>Příkaz se nepodařilo provést</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-63"/> - <source>&Print</source> - <translation>&Tisk</translation> + <source>Unable to fetch results</source> + <translation>Výsledek se nepodařilo natáhnout</translation> </message> +</context> +<context> + <name>QSQLiteDriver</name> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-9"/> - <source>A3 (297 x 420 mm)</source> - <translation>A3 (297 x 420 mm)</translation> + <source>Unable to commit transaction</source> + <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> </message> <message> - <location line="+44"/> - <source>Print selection</source> - <translation>Tisk výběru</translation> + <source>Error closing database</source> + <translation>Nepodařilo se uzavřít spojení s datatabází</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+321"/> - <source>Print to File (Postscript)</source> - <translation>Tisk do souboru (Postscript)</translation> + <source>Error opening database</source> + <translation>Nepodařilo se otevřít spojení s databází</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-33"/> - <source>B4 (250 x 353 mm)</source> - <translation>B4 (250 x 353 mm)</translation> + <source>Unable to rollback transaction</source> + <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+206"/> - <source>%1 already exists. -Do you want to overwrite it?</source> - <translation>Soubor %1 již existuje. -Má se přepsat?</translation> + <source>Unable to begin transaction</source> + <translation>Transakci se nepodařilo spustit</translation> </message> +</context> +<context> + <name>QSQLiteResult</name> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-13"/> - <source>A1 (594 x 841 mm)</source> - <translation>A1 (594 x 841 mm)</translation> + <source>Unable to fetch row</source> + <translation>Řádek se nepodařilo natáhnout</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+4"/> - <source>Custom</source> - <translation>Stanovený uživatelem</translation> + <source>No query</source> + <translation>Žádný požadavek</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+10"/> - <source>B1 (707 x 1000 mm)</source> - <translation>B1 (707 x 1000 mm)</translation> + <source>Unable to execute statement</source> + <translation>Příkaz se nepodařilo provést</translation> </message> <message> - <location line="+13"/> - <source>Folio (210 x 330 mm)</source> - <translation>Folio (210 x 330 mm)</translation> + <source>Unable to bind parameters</source> + <translation>Parametry se nepodařilo spojit</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-5"/> - <source>Ledger</source> - <translation>Hlavní (účetní) kniha</translation> + <source>Unable to reset statement</source> + <translation>Příkaz se nepodařilo znovu nastavit</translation> </message> <message> - <location line="+2"/> - <source>Letter</source> - <translation>Dopis</translation> + <source>Parameter count mismatch</source> + <translation>Počet parametrů není správný</translation> </message> +</context> +<context> + <name>QScriptBreakpointsModel</name> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-2"/> - <source>DLE (110 x 220 mm)</source> - <translation>DLE (110 x 220 mm)</translation> + <source>ID</source> + <translation>ID</translation> </message> <message> - <location line="-1"/> - <source>C5E (163 x 229 mm)</source> - <translation>C5E (163 x 229 mm)</translation> + <source>Location</source> + <translation>Umístění</translation> </message> <message> - <location line="-6"/> - <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> - <translation>B5 (176 x 250 mm, 6.93 x 9.84 palců</translation> + <source>Condition</source> + <translation>Podmínka</translation> </message> <message> - <location line="+33"/> - <source>Print range</source> - <translation>Tisková oblast</translation> + <source>Ignore-count</source> + <translation>Spustit po</translation> </message> <message> - <location line="-229"/> - <source>File exists</source> - <translation>Soubor již existuje</translation> + <source>Single-shot</source> + <translation>Spustit jednou</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-158"/> - <source>Write %1 file</source> - <translation>Zapsat %1 soubor</translation> + <source>Hit-count</source> + <translation>Spuštěný</translation> </message> +</context> +<context> + <name>QScriptBreakpointsWidget</name> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+181"/> - <source>A0 (841 x 1189 mm)</source> - <translation>A0 (841 x 1189 mm)</translation> + <source>New</source> + <translation>Nový</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-1"/> - <source>Local file</source> - <translation>Místní soubor</translation> + <source>Delete</source> + <translation>Smazat</translation> </message> +</context> +<context> + <name>QScriptDebugger</name> <message> - <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+108"/> - <source>locally connected</source> - <translation>přímo spojeno</translation> + <source>Go to Line</source> + <translation>Jít na řádek</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+25"/> - <source>Ledger (432 x 279 mm)</source> - <translation>Hlavní (účetní) kniha (432 x 279 mm)</translation> + <source>Line:</source> + <translation>Řádek:</translation> </message> <message> - <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+23"/> - <location line="+225"/> - <source>Aliases: %1</source> - <translation>Přezdívka: %1</translation> + <source>Interrupt</source> + <translation>Přerušit</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-48"/> - <source>Print to File (PDF)</source> - <translation>Tisk do souboru (PDF)</translation> + <source>Shift+F5</source> + <translation>Shift+F5</translation> </message> <message> - <location line="+123"/> - <source>Print To File ...</source> - <translation>Tisk do souboru...</translation> + <source>Continue</source> + <translation>Pokračovat</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+4"/> - <source>US Common #10 Envelope (105 x 241 mm)</source> - <translation>US běžná #10 obálka (105 x 241 mm)</translation> + <source>F5</source> + <translation>F5</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+1"/> - <source>Tabloid</source> - <translation>Bulvární noviny</translation> + <source>Step Into</source> + <translation>Krok do</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-25"/> - <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> - <translation>A4 (210 x 297 mm, 8.26 x 11.7 palců)</translation> + <source>F11</source> + <translation>F11</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-5"/> - <source>Executive</source> - <translation>Prováděcí</translation> + <source>Step Over</source> + <translation>Krok přes</translation> </message> <message> - <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+223"/> - <location line="+199"/> - <source>unknown</source> - <translation>Neznámý</translation> + <source>F10</source> + <translation>F10</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-184"/> - <source><qt>Do you want to overwrite it?</qt></source> - <translation><qt>Chcete jej přepsat?</qt></translation> + <source>Step Out</source> + <translation>Krok ven</translation> </message> <message> - <location line="+203"/> - <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> - <translation>Prováděcí (7,5 x 10 palců, 191 x 254 mm)</translation> + <source>Shift+F11</source> + <translation>Shift+F11</translation> </message> <message> - <location line="+4"/> - <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> - <translation>Dopis (8,5 x 11 palců, 216 x 279 mm)</translation> + <source>Run to Cursor</source> + <translation>Provést po kurzor</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/> - <source>The 'From' value cannot be greater than the 'To' value.</source> - <translation>Údaj pro první stranu nesmí být větší než údaj pro poslední stranu.</translation> + <source>Ctrl+F10</source> + <translation>Ctrl+F10</translation> </message> <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+6"/> - <source>US Common #10 Envelope</source> - <translation>US běžná #10 obálka</translation> + <source>Run to New Script</source> + <translation>Provést po nový skript</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+76"/> - <source>%1 is a directory. -Please choose a different file name.</source> - <translation>%1 je adresář. -Zvolte, prosím, pro soubor jiný název.</translation> + <source>Toggle Breakpoint</source> + <translation>Přepnout bod přerušení (zastavení)</translation> </message> <message> - <location line="+4"/> - <source>File %1 is not writable. -Please choose a different file name.</source> - <translation>Soubor %1 je chráněn proti zápisu. -Zvolte, prosím, pro soubor jiný název.</translation> + <source>F9</source> + <translation>F9</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-14"/> - <source>B3 (353 x 500 mm)</source> - <translation>B3 (353 x 500 mm)</translation> + <source>Clear Debug Output</source> + <translation>Smazat výstup ladění</translation> </message> <message> - <location line="-6"/> - <source>A7 (74 x 105 mm)</source> - <translation>A7 (74 x 105 mm)</translation> + <source>Clear Error Log</source> + <translation>Smazat výstupní zápis s chybami</translation> </message> <message> - <location line="-5"/> - <source>A2 (420 x 594 mm)</source> - <translation>A2 (420 x 594 mm)</translation> + <source>Clear Console</source> + <translation>Smazat konzoli</translation> </message> <message> - <location line="+15"/> - <source>B7 (88 x 125 mm)</source> - <translation>B7 (88 x 125 mm)</translation> + <source>&Find in Script...</source> + <translation>&Hledat ve skriptu...</translation> + </message> + <message> + <source>Ctrl+F</source> + <translation>Ctrl+F</translation> </message> -</context> -<context> - <name>QPrintPreviewDialog</name> <message> - <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+246"/> - <source>%1%</source> - <translation>%1%</translation> + <source>Find &Next</source> + <translation>Najít &další</translation> </message> <message> - <location line="+68"/> - <source>Print Preview</source> - <translation>Náhled tisku</translation> + <source>F3</source> + <translation>F3</translation> </message> <message> - <source>Close</source> - <translation type="obsolete">Zavřít</translation> + <source>Find &Previous</source> + <translation>Najít &předchozí</translation> </message> <message> - <location line="+89"/> - <source>Print</source> - <translation>Tisk</translation> + <source>Shift+F3</source> + <translation>Shift+F3</translation> </message> <message> - <location line="-46"/> - <source>Fit page</source> - <translation>Přizpůsobit stranu</translation> + <source>Ctrl+G</source> + <translation>Ctrl+G</translation> </message> <message> - <location line="+11"/> - <source>Zoom in</source> - <translation>Zvětšit</translation> + <source>Debug</source> + <translation>Ladit</translation> </message> +</context> +<context> + <name>QScriptDebuggerCodeFinderWidget</name> <message> - <location line="+8"/> - <source>Landscape</source> - <translation>Formát na šířku</translation> + <source>Close</source> + <translation>Zavřít</translation> </message> <message> - <location line="-7"/> - <source>Zoom out</source> - <translation>Zmenšit</translation> + <source>Previous</source> + <translation>Předchozí</translation> </message> <message> - <location line="-13"/> - <source>Fit width</source> - <translation>Přizpůsobit šířku</translation> + <source>Next</source> + <translation>Další</translation> </message> <message> - <location line="+19"/> - <source>Portrait</source> - <translation>Formát na výšku</translation> + <source>Case Sensitive</source> + <translation>Rozlišující velká a malá písmena</translation> </message> <message> - <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/> - <location line="+12"/> - <source>Page Setup</source> - <translation>Nastavení strany</translation> + <source>Whole words</source> + <translation>Celá slova</translation> </message> <message> - <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+29"/> - <source>Page setup</source> - <translation>Nastavení strany</translation> + <source><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped</source> + <translation><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Hledání dosáhlo konce</translation> </message> +</context> +<context> + <name>QScriptDebuggerLocalsModel</name> <message> - <location line="-16"/> - <source>Show overview of all pages</source> - <translation>Ukázat přehled všech stran</translation> + <source>Name</source> + <translation>Název</translation> </message> <message> - <location line="-42"/> - <source>First page</source> - <translation>První strana</translation> + <source>Value</source> + <translation>Hodnota</translation> </message> +</context> +<context> + <name>QScriptDebuggerStackModel</name> <message> - <location line="+1"/> - <source>Last page</source> - <translation>Poslední strana</translation> + <source>Level</source> + <translation>Úroveň</translation> </message> <message> - <location line="+39"/> - <source>Show single page</source> - <translation>Ukázat jednotlivé strany</translation> + <source>Name</source> + <translation>Název</translation> </message> <message> - <location line="+168"/> - <source>Export to PDF</source> - <translation>Vyvést do PDF</translation> + <source>Location</source> + <translation>Umístění</translation> </message> +</context> +<context> + <name>QScriptEdit</name> <message> - <location line="-209"/> - <source>Previous page</source> - <translation>Předchozí strana</translation> + <source>Toggle Breakpoint</source> + <translation>Přepnout bod zastavení</translation> </message> <message> - <location line="-1"/> - <source>Next page</source> - <translation>Další strana</translation> + <source>Disable Breakpoint</source> + <translation>Vypnout bod zastavení</translation> </message> <message> - <location line="+43"/> - <source>Show facing pages</source> - <translation>Ukázat strany ležící naproti</translation> + <source>Enable Breakpoint</source> + <translation>Zapnout bod zastavení</translation> </message> <message> - <location line="+170"/> - <source>Export to PostScript</source> - <translation>Vyvést do PostScriptu</translation> + <source>Breakpoint Condition:</source> + <translation>Podmínka zastavení:</translation> </message> </context> <context> - <name>QPrintPropertiesWidget</name> + <name>QScriptEngineDebugger</name> <message> - <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/> - <source>Form</source> - <translation>Formulář</translation> + <source>Loaded Scripts</source> + <translation>Nahrané skripty</translation> </message> <message> - <location/> - <source>Page</source> - <translation>Strana</translation> + <source>Breakpoints</source> + <translation>Body zastavení</translation> </message> <message> - <location/> - <source>Advanced</source> - <translation>Rozšířené</translation> + <source>Stack</source> + <translation>Zásobník</translation> </message> -</context> -<context> - <name>QPrintSettingsOutput</name> <message> - <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/> - <source>to</source> - <translation>do</translation> + <source>Locals</source> + <translation>Místní proměnné</translation> </message> <message> - <location/> - <source>Form</source> - <translation>Formulář</translation> + <source>Console</source> + <translation>Konzole</translation> </message> <message> - <location/> - <source>None</source> - <translation>Žádný</translation> + <source>Debug Output</source> + <translation>Výstup ladění</translation> </message> <message> - <location/> - <source>Color</source> - <translation>Barva</translation> + <source>Error Log</source> + <translation>Výstupní zápis s chybami</translation> </message> <message> - <location/> - <source>Print all</source> - <translation>Tisknout vše</translation> + <source>Search</source> + <translation>Hledat</translation> </message> <message> - <location/> - <source>Selection</source> - <translation>Výběr</translation> + <source>View</source> + <translation>Pohled</translation> </message> <message> - <location/> - <source>Long side</source> - <translation>Dlouhá strana</translation> + <source>Qt Script Debugger</source> + <translation>Qt ladění skriptů</translation> </message> +</context> +<context> + <name>QScriptNewBreakpointWidget</name> <message> - <location/> - <source>Copies</source> - <translation>Počet exemplářů</translation> + <source>Close</source> + <translation>Zavřít</translation> </message> +</context> +<context> + <name>QScrollBar</name> <message> - <location/> - <source>Print range</source> - <translation>Tisk oblasti</translation> + <source>Top</source> + <translation>Začátek</translation> </message> <message> - <location/> - <source>Color Mode</source> - <translation>Barevný režim</translation> + <source>Scroll down</source> + <translation>Projíždět dolů</translation> </message> <message> - <location/> - <source>Options</source> - <translation>Volby</translation> + <source>Scroll here</source> + <translation>Projíždět až sem</translation> </message> <message> - <location/> - <source>Output Settings</source> - <translation>Nastavení výstupu</translation> + <source>Scroll left</source> + <translation>Projíždět doleva</translation> </message> <message> - <location/> - <source>Reverse</source> - <translation>Obrácený</translation> + <source>Line up</source> + <translation>O jeden řádek nahoru</translation> </message> <message> - <location/> - <source>Grayscale</source> - <translation>Odstíny šedi</translation> + <source>Line down</source> + <translation>O jeden řádek dolů</translation> </message> <message> - <location/> - <source>Short side</source> - <translation>Krátká strana</translation> + <source>Bottom</source> + <translation>Konec</translation> </message> <message> - <location/> - <source>Collate</source> - <translation>Srovnat</translation> + <source>Page up</source> + <translation>O stranu nahoru</translation> </message> <message> - <location/> - <source>Copies:</source> - <translation>Počet exemplářů:</translation> + <source>Position</source> + <translation>Poloha</translation> </message> <message> - <location/> - <source>Pages from</source> - <translation>Strany od</translation> + <source>Page right</source> + <translation>O stranu doprava</translation> </message> <message> - <location/> - <source>Duplex Printing</source> - <translation>Zdvojený tisk</translation> + <source>Scroll up</source> + <translation>Projíždět nahoru</translation> </message> -</context> -<context> - <name>QPrintWidget</name> <message> - <location filename="../src/gui/dialogs/qprintwidget.ui"/> - <source>...</source> - <translation>...</translation> + <source>Scroll right</source> + <translation>Projíždět doprava</translation> </message> <message> - <location/> - <source>Form</source> - <translation>Formulář</translation> + <source>Left edge</source> + <translation>Levý okraj</translation> </message> <message> - <location/> - <source>Type:</source> - <translation>Typ:</translation> + <source>Page down</source> + <translation>O stranu dolů</translation> </message> <message> - <location/> - <source>&Name:</source> - <translation>&Název:</translation> + <source>Page left</source> + <translation>O stranu doleva</translation> </message> <message> - <location/> - <source>Output &file:</source> - <translation>Výstupní &soubor:</translation> + <source>Right edge</source> + <translation>Pravý okraj</translation> </message> +</context> +<context> + <name>QSharedMemory</name> <message> - <location/> - <source>P&roperties</source> - <translation>&Vlastnosti</translation> + <source>%1: doesn't exist</source> + <translation>%1: Neexistuje</translation> </message> <message> - <location/> - <source>Preview</source> - <translation>Náhled</translation> + <source>%1: UNIX key file doesn't exist</source> + <translation>%1: Soubor s unixovým klíčem neexistuje</translation> </message> <message> - <location/> - <source>Printer</source> - <translation>Tiskárna</translation> + <source>%1: system-imposed size restrictions</source> + <translation>%1: Bylo dosaženo systémem podmíněné meze velikosti</translation> </message> <message> - <location/> - <source>Location:</source> - <translation>Umístění:</translation> + <source>%1: unix key file doesn't exists</source> + <translation type="obsolete">%1: Soubor s unixovým klíčem neexistuje</translation> </message> -</context> -<context> - <name>QProcess</name> <message> - <location filename="../src/corelib/io/qprocess.cpp" line="+954"/> - <location line="+826"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+763"/> - <source>Error writing to process</source> - <translation>Zápis do procesu se nezdařil</translation> + <source>%1: doesn't exists</source> + <translation>%1: Neexistuje</translation> </message> <message> - <location line="+203"/> - <source>No program defined</source> - <translation>Nestanoven žádný program</translation> + <source>%1: key is empty</source> + <translation>%1: Neplatný údaj u klíče (prázdný)</translation> </message> <message> - <location filename="../src/corelib/io/qprocess_unix.cpp" line="+653"/> - <source>Resource error (fork failure): %1</source> - <translation>Potíže se zdroji (selhání rozcestí - "fork failure"): %1</translation> + <source>%1: key error</source> + <translation>%1: Chybný klíč</translation> </message> <message> - <location filename="../src/corelib/io/qprocess.cpp" line="-1128"/> - <location line="+52"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="-190"/> - <location line="+50"/> - <source>Error reading from process</source> - <translation>Čtení z procesu se nezdařilo</translation> + <source>%1: create size is less then 0</source> + <translation>%1: Údaj o velikosti vytvoření je menší než nula</translation> </message> <message> - <source>Process failed to start</source> - <translation type="obsolete">Spuštění procesu se nezdařilo</translation> + <source>%1: already exists</source> + <translation>%1: Již existuje</translation> </message> <message> - <location filename="../src/corelib/io/qprocess_unix.cpp" line="-251"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="-486"/> - <source>Could not open input redirection for reading</source> - <translation>Vstupní přesměrování se nepodařilo otevřít pro čtení</translation> + <source>%1: unknown error %2</source> + <translation>%1: Neznámá chyba %2</translation> </message> <message> - <location line="+12"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+20"/> - <source>Could not open output redirection for writing</source> - <translation>Výstupní přesměrování se nepodařilo otevřít pro zápis</translation> + <source>%1: invalid size</source> + <translation>%1: Neplatná velikost</translation> </message> <message> - <location line="+491"/> - <location line="+52"/> - <location line="+74"/> - <location line="+66"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+406"/> - <location line="+50"/> - <location line="+75"/> - <location line="+42"/> - <location line="+54"/> - <source>Process operation timed out</source> - <translation>Překročení času u procesu</translation> + <source>%1: unable to make key</source> + <translation>%1: Nepodařilo se vytvořit klíč</translation> </message> <message> - <location filename="../src/corelib/io/qprocess.cpp" line="+117"/> - <source>Process crashed</source> - <translation>Proces spadl</translation> + <source>%1: unable to set key on lock</source> + <translation>%1: Nepodařilo se nastavit klíč pro uzavření</translation> </message> <message> - <location filename="../src/corelib/io/qprocess_win.cpp" line="-381"/> - <source>Process failed to start: %1</source> - <translation>Proces se nepodařilo spustit: %1</translation> + <source>%1: unable to unlock</source> + <translation>%1: Uzavření se nepodařilo zrušit</translation> </message> -</context> -<context> - <name>QProgressDialog</name> <message> - <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+196"/> - <source>Cancel</source> - <translation>Zrušit</translation> + <source>%1: permission denied</source> + <translation>%1: Přístup odepřen</translation> </message> -</context> -<context> - <name>QPushButton</name> <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-4"/> - <source>Open</source> - <translation>Otevřít</translation> + <source>%1: ftok failed</source> + <translation>%1: Vyvolání ftok se nezdařilo</translation> </message> -</context> -<context> - <name>QRadioButton</name> <message> - <location line="+12"/> - <source>Check</source> - <translation>Označit křížkem</translation> + <source>%1: out of resources</source> + <translation>%1: Nejsou již použitelné zdroje</translation> </message> -</context> -<context> - <name>QRegExp</name> <message> - <location filename="../src/corelib/tools/qregexp.cpp" line="+68"/> - <source>bad lookahead syntax</source> - <translation>nesprávná syntax pro plánování dopředu</translation> + <source>%1: not attached</source> + <translation>%1: Nepřipojen</translation> </message> <message> - <location line="-3"/> - <source>no error occurred</source> - <translation>žádná chyba</translation> + <source>%1: size query failed</source> + <translation>%1: Vyhledání velikosti se nezdařilo</translation> </message> <message> - <location line="+6"/> - <source>missing left delim</source> - <translation>chybějící levé vymezení</translation> + <source>%1: unable to lock</source> + <translation>%1: Uzavření se nezdařilo</translation> </message> +</context> +<context> + <name>QShortcut</name> <message> - <location line="-4"/> - <source>bad char class syntax</source> - <translation>nesprávná syntax pro třídu znaku</translation> + <source>+</source> + <translation>+</translation> </message> <message> - <location line="-1"/> - <source>disabled feature used</source> - <translation>byla použita zakázaná vlastnost</translation> + <source>No</source> + <translation>Ne</translation> </message> <message> - <location line="+4"/> - <source>invalid octal value</source> - <translation>neplatná osmičková hodnota</translation> + <source>Up</source> + <translation>Nahoru</translation> </message> <message> - <location line="+4"/> - <source>invalid interval</source> - <translation>neplatný interval</translation> + <source>Alt</source> + <translation>Alt</translation> </message> <message> - <location line="+1"/> - <source>invalid category</source> - <translation>neplatná skupina</translation> + <source>F%1</source> + <translation>F%1</translation> </message> <message> - <location line="-6"/> - <source>bad repetition syntax</source> - <translation>nesprávná syntax pro opakování</translation> + <source>Del</source> + <translation>Delete</translation> </message> <message> - <location line="+4"/> - <source>met internal limit</source> - <translation>dosažena vnitřní mez</translation> + <source>End</source> + <translation>End</translation> </message> <message> - <location line="-1"/> - <source>unexpected end</source> - <translation>neočekávaný konec</translation> + <source>Esc</source> + <translation>Esc</translation> </message> -</context> -<context> - <name>QSQLite2Driver</name> <message> - <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+449"/> - <source>Unable to commit transaction</source> - <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + <source>Ins</source> + <translation>Insert</translation> </message> <message> - <source>Error to open database</source> - <translation type="obsolete">Nepodařilo se otevřít spojení s datatabází</translation> + <source>Tab</source> + <translation>Tab</translation> </message> <message> - <source>Unable to rollback Transaction</source> - <translation type="obsolete">Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + <source>Yes</source> + <translation>Ano</translation> </message> <message> - <location line="-17"/> - <source>Unable to begin transaction</source> - <translation>Transakci se nepodařilo spustit</translation> + <source>Back</source> + <translation>Zpět</translation> </message> <message> - <location line="-41"/> - <source>Error opening database</source> - <translation>Nepodařilo se otevřít spojení s databází</translation> + <source>Call</source> + <extracomment>Button to start a call (note: a separate button is used to end the call)</extracomment> + <translation>Volání</translation> </message> <message> - <location line="+75"/> - <source>Unable to rollback transaction</source> - <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + <source>Ctrl</source> + <translation>Ctrl</translation> </message> -</context> -<context> - <name>QSQLite2Result</name> <message> - <location line="-176"/> - <source>Unable to execute statement</source> - <translation>Příkaz se nepodařilo provést</translation> + <source>Down</source> + <translation>Dolů</translation> </message> <message> - <location line="-143"/> - <source>Unable to fetch results</source> - <translation>Výsledek se nepodařilo natáhnout</translation> + <source>Flip</source> + <translation>Obrátit</translation> </message> -</context> -<context> - <name>QSQLiteDriver</name> <message> - <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+590"/> - <source>Unable to commit transaction</source> - <translation>Transakci se nepodařilo provést (operace 'commit', odeslání, se nezdařila)</translation> + <source>Help</source> + <translation>Nápověda</translation> </message> <message> - <location line="-35"/> - <source>Error closing database</source> - <translation>Nepodařilo se uzavřít spojení s datatabází</translation> + <source>Home</source> + <translation>Home</translation> </message> <message> - <location line="-11"/> - <source>Error opening database</source> - <translation>Nepodařilo se otevřít spojení s databází</translation> + <source>Left</source> + <translation>Vlevo</translation> </message> <message> - <location line="+61"/> - <source>Unable to rollback transaction</source> - <translation>Transakci se nepodařilo zvrátit (operace 'rollback', zvrácení, se nezdařila)</translation> + <source>Menu</source> + <translation>Menu</translation> </message> <message> - <location line="-30"/> - <source>Unable to begin transaction</source> - <translation>Transakci se nepodařilo spustit</translation> + <source>Toggle Call/Hangup</source> + <extracomment>Button that will hang up if we're in call, or make a call if we're not.</extracomment> + <translation>Přepnout volat/zavěsit</translation> </message> -</context> -<context> - <name>QSQLiteResult</name> <message> - <location line="-378"/> - <location line="+66"/> - <location line="+8"/> - <source>Unable to fetch row</source> - <translation>Řádek se nepodařilo natáhnout</translation> + <source>Voice Dial</source> + <extracomment>Button to trigger voice dialing</extracomment> + <translation>Hlasové vytáčení</translation> </message> <message> - <location line="-73"/> - <source>No query</source> - <translation>Žádný požadavek</translation> + <source>Last Number Redial</source> + <extracomment>Button to redial the last number called</extracomment> + <translation>Opakované vytáčení posledního čísla</translation> </message> <message> - <location line="+132"/> - <source>Unable to execute statement</source> - <translation>Příkaz se nepodařilo provést</translation> + <source>Camera Shutter</source> + <extracomment>Button to trigger the camera shutter (take a picture)</extracomment> + <translation>Závěrka kamery</translation> </message> <message> - <location line="+65"/> - <source>Unable to bind parameters</source> - <translation>Parametry se nepodařilo spojit</translation> + <source>Camera Focus</source> + <extracomment>Button to focus the camera</extracomment> + <translation>Zaostření kamery</translation> </message> <message> - <location line="-45"/> - <source>Unable to reset statement</source> - <translation>Příkaz se nepodařilo znovu nastavit</translation> + <source>Kanji</source> + <translation>Kandži</translation> </message> <message> - <location line="+52"/> - <source>Parameter count mismatch</source> - <translation>Počet parametrů není správný</translation> + <source>Muhenkan</source> + <translation>Muhenkan</translation> </message> -</context> -<context> - <name>QScriptBreakpointsModel</name> <message> - <location filename="../src/scripttools/debugging/qscriptbreakpointsmodel.cpp" line="+455"/> - <source>ID</source> - <translation>ID</translation> + <source>Henkan</source> + <translation>Henkan</translation> </message> <message> - <location line="+2"/> - <source>Location</source> - <translation>Umístění</translation> + <source>Romaji</source> + <translation>Romaji</translation> </message> <message> - <location line="+2"/> - <source>Condition</source> - <translation>Podmínka</translation> + <source>Hiragana</source> + <translation>Hiragana</translation> </message> <message> - <location line="+2"/> - <source>Ignore-count</source> - <translation>Spustit po</translation> + <source>Katakana</source> + <translation>Katakana</translation> </message> <message> - <location line="+2"/> - <source>Single-shot</source> - <translation>Spustit jednou</translation> + <source>Hiragana Katakana</source> + <translation>Hiragana Katakana</translation> </message> <message> - <location line="+2"/> - <source>Hit-count</source> - <translation>Spuštěný</translation> + <source>Zenkaku</source> + <translation>Zenkaku</translation> </message> -</context> -<context> - <name>QScriptBreakpointsWidget</name> <message> - <location filename="../src/scripttools/debugging/qscriptbreakpointswidget.cpp" line="+298"/> - <source>New</source> - <translation>Nový</translation> + <source>Hankaku</source> + <translation>Hankaku</translation> </message> <message> - <location line="+6"/> - <source>Delete</source> - <translation>Smazat</translation> + <source>Zenkaku Hankaku</source> + <translation>Zenkaku Hankaku</translation> </message> -</context> -<context> - <name>QScriptDebugger</name> <message> - <location filename="../src/scripttools/debugging/qscriptdebugger.cpp" line="+885"/> - <location line="+1013"/> - <source>Go to Line</source> - <translation>Jít na řádek</translation> + <source>Touroku</source> + <translation>Touroku</translation> </message> <message> - <location line="-1012"/> - <source>Line:</source> - <translation>Řádek:</translation> + <source>Massyo</source> + <translation>Massyo</translation> </message> <message> - <location line="+791"/> - <source>Interrupt</source> - <translation>Přerušit</translation> + <source>Kana Lock</source> + <translation>Kana Zámek</translation> </message> <message> - <location line="+2"/> - <source>Shift+F5</source> - <translation>Shift+F5</translation> + <source>Kana Shift</source> + <translation>Kany Posun</translation> </message> <message> - <location line="+15"/> - <source>Continue</source> - <translation>Pokračovat</translation> + <source>Eisu Shift</source> + <translation>Eisu Posun</translation> </message> <message> - <location line="+2"/> - <source>F5</source> - <translation>F5</translation> + <source>Eisu toggle</source> + <translation>Eisu Přepínač</translation> </message> <message> - <location line="+15"/> - <source>Step Into</source> - <translation>Krok do</translation> + <source>Code input</source> + <translation>Vstup pro kód</translation> </message> <message> - <location line="+2"/> - <source>F11</source> - <translation>F11</translation> + <source>Multiple Candidate</source> + <translation>Více návrhů</translation> </message> <message> - <location line="+15"/> - <source>Step Over</source> - <translation>Krok přes</translation> + <source>Previous Candidate</source> + <translation>Předchozí návrh</translation> </message> <message> - <location line="+2"/> - <source>F10</source> - <translation>F10</translation> + <source>Hangul</source> + <translation>Hangul</translation> </message> <message> - <location line="+15"/> - <source>Step Out</source> - <translation>Krok ven</translation> + <source>Hangul Start</source> + <translation>Hangul začátek</translation> </message> <message> - <location line="+2"/> - <source>Shift+F11</source> - <translation>Shift+F11</translation> + <source>Hangul End</source> + <translation>Hangul konec</translation> </message> <message> - <location line="+15"/> - <source>Run to Cursor</source> - <translation>Provést po kurzor</translation> + <source>Hangul Hanja</source> + <translation>Hangul Hanja</translation> </message> <message> - <location line="+2"/> - <source>Ctrl+F10</source> - <translation>Ctrl+F10</translation> + <source>Hangul Jamo</source> + <translation>Hangul Jamo</translation> </message> <message> - <location line="+16"/> - <source>Run to New Script</source> - <translation>Provést po nový skript</translation> + <source>Hangul Romaja</source> + <translation>Hangul Romaja</translation> </message> <message> - <location line="+15"/> - <source>Toggle Breakpoint</source> - <translation>Přepnout bod přerušení (zastavení)</translation> + <source>Hangul Jeonja</source> + <translation>Hangul Jeonja</translation> </message> <message> - <location line="+1"/> - <source>F9</source> - <translation>F9</translation> + <source>Hangul Banja</source> + <translation>Hangul Banja</translation> </message> <message> - <location line="+14"/> - <source>Clear Debug Output</source> - <translation>Smazat výstup ladění</translation> + <source>Hangul PreHanja</source> + <translation>Hangul PreHanja</translation> </message> <message> - <location line="+13"/> - <source>Clear Error Log</source> - <translation>Smazat výstupní zápis s chybami</translation> + <source>Hangul PostHanja</source> + <translation>Hangul PostHanja</translation> </message> <message> - <location line="+13"/> - <source>Clear Console</source> - <translation>Smazat konzoli</translation> + <source>Hangul Special</source> + <translation>Hangul zvláštní</translation> </message> <message> - <location line="+14"/> - <source>&Find in Script...</source> - <translation>&Hledat ve skriptu...</translation> + <source>Meta</source> + <translation>Meta</translation> </message> <message> - <location line="+1"/> - <source>Ctrl+F</source> - <translation>Ctrl+F</translation> + <source>PgUp</source> + <translation>PgUp</translation> </message> <message> - <location line="+17"/> - <source>Find &Next</source> - <translation>Najít &další</translation> + <source>Stop</source> + <translation>Stop</translation> </message> <message> - <location line="+2"/> - <source>F3</source> - <translation>F3</translation> + <source>Enter</source> + <translation>Enter</translation> + </message> + <message> + <source>Pause</source> + <translation>Pause</translation> </message> <message> - <location line="+13"/> - <source>Find &Previous</source> - <translation>Najít &předchozí</translation> + <source>Print</source> + <translation>Print</translation> </message> <message> - <location line="+2"/> - <source>Shift+F3</source> - <translation>Shift+F3</translation> + <source>Right</source> + <translation>Vpravo</translation> </message> <message> - <location line="+14"/> - <source>Ctrl+G</source> - <translation>Ctrl+G</translation> + <source>Shift</source> + <translation>Shift</translation> </message> <message> - <location line="+11"/> - <source>Debug</source> - <translation>Ladit</translation> + <source>Space</source> + <extracomment>This and all following "incomprehensible" strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used.</extracomment> + <translation>Mezerník</translation> </message> -</context> -<context> - <name>QScriptDebuggerCodeFinderWidget</name> <message> - <location filename="../src/scripttools/debugging/qscriptdebuggercodefinderwidget.cpp" line="+141"/> - <source>Close</source> - <translation>Zavřít</translation> + <source>Media Record</source> + <translation>Nahrát</translation> </message> <message> - <location line="+13"/> - <source>Previous</source> - <translation>Předchozí</translation> + <source>Print Screen</source> + <translation>Print Screen</translation> </message> <message> - <location line="+7"/> - <source>Next</source> - <translation>Další</translation> + <source>Treble Down</source> + <translation>Výšky -</translation> </message> <message> - <location line="+5"/> - <source>Case Sensitive</source> - <translation>Rozlišující velká a malá písmena</translation> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> </message> <message> - <location line="+3"/> - <source>Whole words</source> - <translation>Celá slova</translation> + <source>Volume Down</source> + <translation>Hlasitost -</translation> </message> <message> - <location line="+9"/> - <source><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped</source> - <translation><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Hledání dosáhlo konce</translation> + <source>Volume Mute</source> + <translation>Ztlumit hlasitost</translation> </message> -</context> -<context> - <name>QScriptDebuggerLocalsModel</name> <message> - <location filename="../src/scripttools/debugging/qscriptdebuggerlocalsmodel.cpp" line="+872"/> - <source>Name</source> - <translation>Název</translation> + <source>Media Previous</source> + <translation>Předchozí</translation> </message> <message> - <location line="+2"/> - <source>Value</source> - <translation>Hodnota</translation> + <source>Home Page</source> + <translation>Domovská stránka</translation> </message> -</context> -<context> - <name>QScriptDebuggerStackModel</name> <message> - <location filename="../src/scripttools/debugging/qscriptdebuggerstackmodel.cpp" line="+161"/> - <source>Level</source> - <translation>Úroveň</translation> + <source>Volume Up</source> + <translation>Hlasitost +</translation> </message> <message> - <location line="+2"/> - <source>Name</source> - <translation>Název</translation> + <source>Launch (6)</source> + <translation>Spustit (6)</translation> </message> <message> - <location line="+2"/> - <source>Location</source> - <translation>Umístění</translation> + <source>Launch (7)</source> + <translation>Spustit (7)</translation> </message> -</context> -<context> - <name>QScriptEdit</name> <message> - <location filename="../src/scripttools/debugging/qscriptedit.cpp" line="+411"/> - <source>Toggle Breakpoint</source> - <translation>Přepnout bod zastavení</translation> + <source>Launch (8)</source> + <translation>Spustit (8)</translation> </message> <message> - <location line="+2"/> - <source>Disable Breakpoint</source> - <translation>Vypnout bod zastavení</translation> + <source>Launch (9)</source> + <translation>Spustit (9)</translation> </message> <message> - <location line="+1"/> - <source>Enable Breakpoint</source> - <translation>Zapnout bod zastavení</translation> + <source>Launch (2)</source> + <translation>Spustit (2)</translation> </message> <message> - <location line="+4"/> - <source>Breakpoint Condition:</source> - <translation>Podmínka zastavení:</translation> + <source>Launch (3)</source> + <translation>Spustit (3)</translation> </message> -</context> -<context> - <name>QScriptEngineDebugger</name> <message> - <location filename="../src/scripttools/debugging/qscriptenginedebugger.cpp" line="+523"/> - <source>Loaded Scripts</source> - <translation>Nahrané skripty</translation> + <source>Launch (4)</source> + <translation>Spustit (4)</translation> </message> <message> - <location line="+6"/> - <source>Breakpoints</source> - <translation>Body zastavení</translation> + <source>Launch (5)</source> + <translation>Spustit (5)</translation> </message> <message> - <location line="+6"/> - <source>Stack</source> - <translation>Zásobník</translation> + <source>Launch (0)</source> + <translation>Spustit (0)</translation> </message> <message> - <location line="+6"/> - <source>Locals</source> - <translation>Místní proměnné</translation> + <source>Launch (1)</source> + <translation>Spustit (1)</translation> </message> <message> - <location line="+6"/> - <source>Console</source> - <translation>Konzole</translation> + <source>Launch (F)</source> + <translation>Spustit (F)</translation> </message> <message> - <location line="+6"/> - <source>Debug Output</source> - <translation>Výstup ladění</translation> + <source>Launch (B)</source> + <translation>Spustit (B)</translation> </message> <message> - <location line="+6"/> - <source>Error Log</source> - <translation>Výstupní zápis s chybami</translation> + <source>Launch (C)</source> + <translation>Spustit (C)</translation> </message> <message> - <location line="+12"/> - <source>Search</source> - <translation>Hledat</translation> + <source>Launch (D)</source> + <translation>Spustit (D)</translation> </message> <message> - <location line="+7"/> - <source>View</source> - <translation>Pohled</translation> + <source>Launch (E)</source> + <translation>Spustit (E)</translation> </message> <message> - <location line="+18"/> - <source>Qt Script Debugger</source> - <translation>Qt ladění skriptů</translation> + <source>Launch (A)</source> + <translation>Spustit (A)</translation> </message> -</context> -<context> - <name>QScriptNewBreakpointWidget</name> <message> - <location filename="../src/scripttools/debugging/qscriptbreakpointswidget.cpp" line="-223"/> - <source>Close</source> - <translation>Zavřít</translation> + <source>Delete</source> + <translation>Delete</translation> </message> -</context> -<context> - <name>QScrollBar</name> <message> - <location filename="../src/gui/widgets/qscrollbar.cpp" line="+456"/> - <source>Top</source> - <translation>Začátek</translation> + <source>Escape</source> + <translation>Escape</translation> </message> <message> - <location line="+7"/> - <source>Scroll down</source> - <translation>Projíždět dolů</translation> + <source>Hangup</source> + <extracomment>Button to end a call (note: a separate button is used to start the call)</extracomment> + <translation>Pověsit</translation> </message> <message> - <location line="-9"/> - <source>Scroll here</source> - <translation>Projíždět až sem</translation> + <source>Insert</source> + <translation>Insert</translation> </message> <message> - <location line="+8"/> - <source>Scroll left</source> - <translation>Projíždět doleva</translation> + <source>Bass Boost</source> + <translation>Zesílení basů</translation> </message> <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/> - <source>Line up</source> - <translation>O jeden řádek nahoru</translation> + <source>PgDown</source> + <translation>PgDown</translation> </message> <message> - <location line="+8"/> - <source>Line down</source> - <translation>O jeden řádek dolů</translation> + <source>Return</source> + <translation>Return</translation> </message> <message> - <location filename="../src/gui/widgets/qscrollbar.cpp" line="-5"/> - <source>Bottom</source> - <translation>Konec</translation> + <source>Search</source> + <translation>Hledat</translation> </message> <message> - <location line="+2"/> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/> - <source>Page up</source> - <translation>O stranu nahoru</translation> + <source>Select</source> + <translation>Vybrat</translation> </message> <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+2"/> - <source>Position</source> - <translation>Poloha</translation> + <source>SysReq</source> + <translation>SysReq</translation> </message> <message> - <location filename="../src/gui/widgets/qscrollbar.cpp" line="+1"/> - <source>Page right</source> - <translation>O stranu doprava</translation> + <source>NumLock</source> + <translation>NumLock</translation> </message> <message> - <location line="+2"/> - <source>Scroll up</source> - <translation>Projíždět nahoru</translation> + <source>ScrollLock</source> + <translation>ScrollLock</translation> </message> <message> - <location line="+1"/> - <source>Scroll right</source> - <translation>Projíždět doprava</translation> + <source>Media Pause</source> + <extracomment>Media player pause button</extracomment> + <translation>Pozastavení přehrávání</translation> </message> <message> - <location line="-7"/> - <source>Left edge</source> - <translation>Levý okraj</translation> + <source>Toggle Media Play/Pause</source> + <extracomment>Media player button to toggle between playing and paused</extracomment> + <translation>Přepnout přehrávat/pozastavit</translation> </message> <message> - <location line="+4"/> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+2"/> - <source>Page down</source> - <translation>O stranu dolů</translation> + <source>Monitor Brightness Up</source> + <translation>Zvýšit jas obrazovky</translation> </message> <message> - <location line="-1"/> - <source>Page left</source> - <translation>O stranu doleva</translation> + <source>Monitor Brightness Down</source> + <translation>Snížit jas obrazovky</translation> </message> <message> - <location line="-2"/> - <source>Right edge</source> - <translation>Pravý okraj</translation> + <source>Keyboard Light On/Off</source> + <translation>Zapnout/Vypnout podsvícení klávesnice</translation> </message> -</context> -<context> - <name>QSharedMemory</name> <message> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+88"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+74"/> - <source>%1: doesn't exist</source> - <translation>%1: Neexistuje</translation> + <source>Keyboard Brightness Up</source> + <translation>Zvýšit jas klávesnice</translation> </message> <message> - <location line="+39"/> - <source>%1: UNIX key file doesn't exist</source> - <translation>%1: Soubor s unixovým klíčem neexistuje</translation> + <source>Keyboard Brightness Down</source> + <translation>Snížit jas klávesnice</translation> </message> <message> - <location line="+78"/> - <source>%1: system-imposed size restrictions</source> - <translation>%1: Bylo dosaženo systémem podmíněné meze velikosti</translation> + <source>Power Off</source> + <translation>Vypnout</translation> </message> <message> - <source>%1: unix key file doesn't exists</source> - <translation type="obsolete">%1: Soubor s unixovým klíčem neexistuje</translation> + <source>Wake Up</source> + <translation>Probudit</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="+71"/> - <source>%1: doesn't exists</source> - <translation>%1: Neexistuje</translation> + <source>Eject</source> + <translation>Vysunout</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-86"/> - <source>%1: key is empty</source> - <translation>%1: Neplatný údaj u klíče (prázdný)</translation> + <source>Screensaver</source> + <translation>Spořič/Šetřič obrazovky</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="+44"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+67"/> - <source>%1: key error</source> - <translation>%1: Chybný klíč</translation> + <source>WWW</source> + <translation>Internet</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+304"/> - <source>%1: create size is less then 0</source> - <translation>%1: Údaj o velikosti vytvoření je menší než nula</translation> + <source>Sleep</source> + <translation>Režim spánku</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="-48"/> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-35"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-76"/> - <source>%1: already exists</source> - <translation>%1: Již existuje</translation> + <source>LightBulb</source> + <translation>Osvětlení</translation> </message> <message> - <location line="+19"/> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+14"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+25"/> - <source>%1: unknown error %2</source> - <translation>%1: Neznámá chyba %2</translation> + <source>Shop</source> + <translation>Obchod</translation> </message> <message> - <location line="-11"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-12"/> - <source>%1: invalid size</source> - <translation>%1: Neplatná velikost</translation> + <source>History</source> + <translation>Průběh</translation> </message> <message> - <location line="+67"/> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+87"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+27"/> - <source>%1: unable to make key</source> - <translation>%1: Nepodařilo se vytvořit klíč</translation> + <source>Add Favorite</source> + <translation>Přidat záložku</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="-81"/> - <source>%1: unable to set key on lock</source> - <translation>%1: Nepodařilo se nastavit klíč pro uzavření</translation> + <source>Hot Links</source> + <translation>Doporučené odkazy</translation> </message> <message> - <location line="+271"/> - <source>%1: unable to unlock</source> - <translation>%1: Uzavření se nepodařilo zrušit</translation> + <source>Adjust Brightness</source> + <translation>Upravit jas</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="-59"/> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-105"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-18"/> - <source>%1: permission denied</source> - <translation>%1: Přístup odepřen</translation> + <source>Finance</source> + <translation>Finance</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+54"/> - <source>%1: ftok failed</source> - <translation>%1: Vyvolání ftok se nezdařilo</translation> + <source>Community</source> + <translation>Společenství</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="-4"/> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-40"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-4"/> - <source>%1: out of resources</source> - <translation>%1: Nejsou již použitelné zdroje</translation> + <source>Audio Rewind</source> + <translation>Zvuk přetočit zpět</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+164"/> - <source>%1: not attached</source> - <translation>%1: Nepřipojen</translation> + <source>Back Forward</source> + <translation>Zpět dopředu</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+90"/> - <source>%1: size query failed</source> - <translation>%1: Vyhledání velikosti se nezdařilo</translation> + <source>Application Left</source> + <translation>Aplikace vlevo</translation> </message> <message> - <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="-22"/> - <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+155"/> - <source>%1: unable to lock</source> - <translation>%1: Uzavření se nezdařilo</translation> + <source>Application Right</source> + <translation>Aplikace vpravo</translation> </message> -</context> -<context> - <name>QShortcut</name> <message> - <location filename="../src/gui/kernel/qkeysequence.cpp" line="+1143"/> - <source>+</source> - <translation>+</translation> + <source>Book</source> + <translation>Kniha</translation> </message> <message> - <location line="-664"/> - <source>No</source> - <translation>Ne</translation> + <source>CD</source> + <translation>CD</translation> </message> <message> - <location line="-71"/> - <source>Up</source> - <translation>Nahoru</translation> + <source>Calculator</source> + <translation>Kalkulačka</translation> </message> <message> - <location line="+644"/> - <location line="+135"/> - <source>Alt</source> - <translation>Alt</translation> + <source>Clear</source> + <translation>Smazat</translation> </message> <message> - <location line="+17"/> - <source>F%1</source> - <translation>F%1</translation> + <source>Clear Grab</source> + <translation>Smazat přístup</translation> </message> <message> - <location line="-803"/> - <source>Del</source> - <translation>Delete</translation> + <source>Close</source> + <translation>Zavřít</translation> </message> <message> - <location line="+5"/> - <source>End</source> - <translation>End</translation> + <source>Copy</source> + <translation>Kopírovat</translation> </message> <message> - <location line="-12"/> - <source>Esc</source> - <translation>Esc</translation> + <source>Cut</source> + <translation>Vyjmout</translation> </message> <message> - <location line="+6"/> - <source>Ins</source> - <translation>Insert</translation> + <source>Display</source> + <translation>Zobrazit</translation> </message> <message> - <location line="-5"/> - <source>Tab</source> - <translation>Tab</translation> + <source>DOS</source> + <translation>DOS</translation> </message> <message> - <location line="+83"/> - <source>Yes</source> - <translation>Ano</translation> + <source>Documents</source> + <translation>Dokumenty</translation> </message> <message> - <location line="-58"/> - <source>Back</source> - <translation>Zpět</translation> + <source>Spreadsheet</source> + <translation>Tabulkový dokument</translation> </message> <message> - <location line="+67"/> - <source>Call</source> - <translation>Volání</translation> + <source>Browser</source> + <translation>Prohlížeč</translation> </message> <message> - <location line="+563"/> - <location line="+135"/> - <source>Ctrl</source> - <translation>Ctrl</translation> + <source>Game</source> + <translation>Hra</translation> </message> <message> - <location line="-775"/> - <source>Down</source> - <translation>Dolů</translation> + <source>Go</source> + <translation>Do toho</translation> </message> <message> - <location line="+79"/> - <source>Flip</source> - <translation>Obrátit</translation> + <source>iTouch</source> + <translation>iTouch</translation> </message> <message> - <location line="-72"/> - <source>Help</source> - <translation>Nápověda</translation> + <source>Logoff</source> + <translation>Odhlásit se</translation> </message> <message> - <location line="-12"/> - <source>Home</source> - <translation>Home</translation> + <source>Market</source> + <translation>Trh</translation> </message> <message> - <location line="+2"/> - <source>Left</source> - <translation>Vlevo</translation> + <source>Meeting</source> + <translation>Schůze</translation> </message> <message> - <location line="+9"/> - <source>Menu</source> - <translation>Menu</translation> + <source>Keyboard Menu</source> + <translation>Nabídka klávesnice</translation> </message> <message> - <location line="+637"/> - <location line="+130"/> - <source>Meta</source> - <translation>Meta</translation> + <source>Menu PB</source> + <translation>Nabídka PB</translation> </message> <message> - <location line="-772"/> - <source>PgUp</source> - <translation>PgUp</translation> + <source>My Sites</source> + <translation>Moje místa</translation> </message> <message> - <location line="+11"/> - <source>Stop</source> - <translation>Stop</translation> + <source>News</source> + <translation>Zprávy</translation> </message> <message> - <location line="-23"/> - <source>Enter</source> - <translation>Enter</translation> + <source>Home Office</source> + <translation>Domácí kancelář</translation> </message> <message> - <location line="+3"/> - <source>Pause</source> - <translation>Pause</translation> + <source>Option</source> + <translation>Volba</translation> </message> <message> - <location line="+1"/> - <source>Print</source> - <translation>Print</translation> + <source>Paste</source> + <translation>Vložit</translation> </message> <message> - <location line="+6"/> - <source>Right</source> - <translation>Vpravo</translation> + <source>Phone</source> + <translation>Telefon</translation> </message> <message> - <location line="+642"/> - <location line="+138"/> - <source>Shift</source> - <translation>Shift</translation> + <source>Reply</source> + <translation>Odpovědět</translation> </message> <message> - <location line="-796"/> - <source>Space</source> - <translation>Mezerník</translation> + <source>Reload</source> + <translation>Nahrát znovu</translation> </message> <message> - <location line="+43"/> - <source>Media Record</source> - <translation>Nahrát</translation> + <source>Rotate Windows</source> + <translation>Otáčet okny</translation> </message> <message> - <location line="+27"/> - <source>Print Screen</source> - <translation>Print Screen</translation> + <source>Rotation PB</source> + <translation>Otáčení PB</translation> </message> <message> - <location line="-32"/> - <source>Treble Down</source> - <translation>Výšky -</translation> + <source>Rotation KB</source> + <translation>Otáčení KB</translation> </message> <message> - <location line="+38"/> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> + <source>Save</source> + <translation>Uložit</translation> </message> <message> - <location line="-45"/> - <source>Volume Down</source> - <translation>Hlasitost -</translation> + <source>Send</source> + <translation>Poslat</translation> </message> <message> - <location line="+1"/> - <source>Volume Mute</source> - <translation>Ztlumit hlasitost</translation> + <source>Spellchecker</source> + <translation>Ověření pravopisu</translation> </message> <message> - <location line="+9"/> - <source>Media Previous</source> - <translation>Předchozí</translation> + <source>Split Screen</source> + <translation>Rozdělit obrazovku</translation> </message> <message> - <location line="+3"/> - <source>Home Page</source> - <translation>Domovská stránka</translation> + <source>Support</source> + <translation>Podpora</translation> </message> <message> - <location line="-11"/> - <source>Volume Up</source> - <translation>Hlasitost +</translation> + <source>Task Panel</source> + <translation>Panel s úkoly</translation> </message> <message> - <location line="+24"/> - <source>Launch (6)</source> - <translation>Spustit (6)</translation> + <source>Terminal</source> + <translation>Terminál</translation> </message> <message> - <location line="+1"/> - <source>Launch (7)</source> - <translation>Spustit (7)</translation> + <source>Tools</source> + <translation>Nástroje</translation> </message> <message> - <location line="+1"/> - <source>Launch (8)</source> - <translation>Spustit (8)</translation> + <source>Travel</source> + <translation>Cestování</translation> </message> <message> - <location line="+1"/> - <source>Launch (9)</source> - <translation>Spustit (9)</translation> + <source>Video</source> + <translation>Video</translation> </message> <message> - <location line="-7"/> - <source>Launch (2)</source> - <translation>Spustit (2)</translation> + <source>Word Processor</source> + <translation>Zpracování textu</translation> </message> <message> - <location line="+1"/> - <source>Launch (3)</source> - <translation>Spustit (3)</translation> + <source>XFer</source> + <translation>XFer</translation> </message> <message> - <location line="+1"/> - <source>Launch (4)</source> - <translation>Spustit (4)</translation> + <source>Zoom In</source> + <translation>Přiblížit</translation> </message> <message> - <location line="+1"/> - <source>Launch (5)</source> - <translation>Spustit (5)</translation> + <source>Zoom Out</source> + <translation>Oddálit</translation> </message> <message> - <location line="-5"/> - <source>Launch (0)</source> - <translation>Spustit (0)</translation> + <source>Away</source> + <translation>Pryč</translation> </message> <message> - <location line="+1"/> - <source>Launch (1)</source> - <translation>Spustit (1)</translation> + <source>Messenger</source> + <translation>Posel</translation> </message> <message> - <location line="+14"/> - <source>Launch (F)</source> - <translation>Spustit (F)</translation> + <source>WebCam</source> + <translation>Internetová kamera</translation> </message> <message> - <location line="-4"/> - <source>Launch (B)</source> - <translation>Spustit (B)</translation> + <source>Mail Forward</source> + <translation>Předání dál</translation> </message> <message> - <location line="+1"/> - <source>Launch (C)</source> - <translation>Spustit (C)</translation> + <source>Pictures</source> + <translation>Obrázky</translation> </message> <message> - <location line="+1"/> - <source>Launch (D)</source> - <translation>Spustit (D)</translation> + <source>Music</source> + <translation>Hudba</translation> </message> <message> - <location line="+1"/> - <source>Launch (E)</source> - <translation>Spustit (E)</translation> + <source>Battery</source> + <translation>Baterie</translation> </message> <message> - <location line="-4"/> - <source>Launch (A)</source> - <translation>Spustit (A)</translation> + <source>Bluetooth</source> + <translation>Modrozub</translation> </message> <message> - <location line="+17"/> - <source>Delete</source> - <translation>Delete</translation> + <source>Wireless</source> + <translation>Bezdrát</translation> </message> <message> - <location line="+1"/> - <source>Escape</source> - <translation>Escape</translation> + <source>Ultra Wide Band</source> + <translation>Ultra široké pásmo</translation> </message> <message> - <location line="+16"/> - <source>Hangup</source> - <translation>Pověsit</translation> + <source>Audio Forward</source> + <translation>Zvuk přetočit dopředu</translation> </message> <message> - <location line="-18"/> - <source>Insert</source> - <translation>Insert</translation> + <source>Audio Repeat</source> + <translation>Opakovat zvuk</translation> </message> <message> - <location line="-43"/> - <source>Bass Boost</source> - <translation>Zesílení basů</translation> + <source>Audio Random Play</source> + <translation>Zvuk přehrávat náhodně</translation> </message> <message> - <location line="-15"/> - <source>PgDown</source> - <translation>PgDown</translation> + <source>Subtitle</source> + <translation>Titulky</translation> </message> <message> - <location line="-14"/> - <source>Return</source> - <translation>Return</translation> + <source>Audio Cycle Track</source> + <translation>Změnit zvukovou stopu</translation> </message> <message> - <location line="+41"/> - <source>Search</source> - <translation>Hledat</translation> + <source>Time</source> + <translation>Čas</translation> </message> <message> - <location line="+38"/> - <source>Select</source> - <translation>Vybrat</translation> + <source>View</source> + <translation>Pohled</translation> </message> <message> - <location line="-73"/> - <source>SysReq</source> - <translation>SysReq</translation> + <source>Top Menu</source> + <translation>Hlavní nabídka</translation> </message> <message> - <location line="+10"/> - <source>NumLock</source> - <translation>NumLock</translation> + <source>Suspend</source> + <translation>Pozastavit</translation> </message> <message> - <location line="+1"/> - <source>ScrollLock</source> - <translation>ScrollLock</translation> + <source>Hibernate</source> + <translation>Přezimovat</translation> </message> <message> - <location line="+68"/> <source>Context1</source> <translation>Kontext1</translation> </message> <message> - <location line="+1"/> <source>Context2</source> <translation>Kontext2</translation> </message> <message> - <location line="+1"/> <source>Context3</source> <translation>Kontext3</translation> </message> <message> - <location line="+1"/> <source>Context4</source> <translation>Kontext4</translation> </message> <message> - <location line="-22"/> <source>Page Up</source> <translation>Page Up</translation> </message> <message> - <location line="-23"/> <source>Open URL</source> <translation>Otevřít URL</translation> </message> <message> - <location line="+25"/> <source>Caps Lock</source> <translation>Caps Lock</translation> </message> <message> - <location line="+7"/> <source>System Request</source> <translation>Žádost systému</translation> </message> <message> - <location line="-60"/> <source>CapsLock</source> <translation>CapsLock</translation> </message> <message> - <location line="-17"/> <source>Backtab</source> <translation>Zpět-Tab</translation> </message> <message> - <location line="+32"/> <source>Bass Up</source> <translation>Basy +</translation> </message> <message> - <location line="-5"/> <source>Refresh</source> <translation>Obnovit</translation> </message> <message> - <location line="+19"/> <source>Launch Mail</source> <translation>Spustit e-mail</translation> </message> <message> - <location line="-45"/> <source>Backspace</source> <translation>Backspace</translation> </message> <message> - <location line="+32"/> <source>Bass Down</source> <translation>Basy -</translation> </message> <message> - <location line="+11"/> <source>Standby</source> <translation>V pohotovosti</translation> </message> <message> - <location line="-10"/> <source>Treble Up</source> <translation>Výšky +</translation> </message> <message> - <location line="+37"/> <source>Num Lock</source> <translation>Num Lock</translation> </message> <message> - <location line="+1"/> <source>Number Lock</source> <translation>Zahlen-Feststelltaste</translation> </message> <message> - <location line="-30"/> <source>Favorites</source> <translation>Oblíbené</translation> </message> <message> - <location line="-17"/> <source>Forward</source> <translation>Dopředu</translation> </message> <message> - <location line="+44"/> <source>Page Down</source> <translation>Obraz dolů</translation> </message> <message> - <location line="-33"/> <source>Media Play</source> <translation>Přehrávání</translation> </message> <message> - <location line="+1"/> <source>Media Stop</source> <translation>Zastavit přehrávání</translation> </message> <message> - <location line="+2"/> <source>Media Next</source> <translation>Další</translation> </message> <message> - <location line="+8"/> <source>Launch Media</source> <translation>Spustit přehrávač</translation> </message> @@ -5845,27 +6501,22 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QSlider</name> <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+153"/> <source>Page up</source> <translation>O stranu nahoru</translation> </message> <message> - <location line="+2"/> <source>Position</source> <translation>Poloha</translation> </message> <message> - <location line="+3"/> <source>Page right</source> <translation>O stranu doprava</translation> </message> <message> - <location line="+0"/> <source>Page down</source> <translation>O stranu dolů</translation> </message> <message> - <location line="-5"/> <source>Page left</source> <translation>O stranu doleva</translation> </message> @@ -5873,72 +6524,58 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QSocks5SocketEngine</name> <message> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+710"/> <source>Network operation timed out</source> <translation>Časový limit pro síťovou operaci byl překročen</translation> </message> <message> - <location line="-773"/> <source>Connection to proxy closed prematurely</source> <translation>Proxy server předčasně ukončil spojení</translation> </message> <message> - <location line="+27"/> <source>Proxy authentication failed: %1</source> <translation>Autentizace u proxy serveru se nezdařila: %1</translation> </message> <message> - <location line="-1"/> <source>Proxy authentication failed</source> <translation>Autentizace u proxy serveru se nezdařila</translation> </message> <message> - <location line="+29"/> <source>General SOCKSv5 server failure</source> <translation>Všeobecná chyba při spojení s SOCKSv5 serverem</translation> </message> <message> - <location line="+33"/> <source>Unknown SOCKSv5 proxy error code 0x%1</source> <translation>Byl obdržen neznámý chybový kód od SOCKSv5 proxy serveru: 0x%1</translation> </message> <message> - <location line="-29"/> <source>Connection not allowed by SOCKSv5 server</source> <translation>SOCKSv5 server odmítl spojení</translation> </message> <message> - <location line="+20"/> <source>SOCKSv5 command not supported</source> <translation>Tento SOCKSv5 příkaz není podporován</translation> </message> <message> - <location line="-70"/> <source>Connection to proxy timed out</source> <translation>Při spojení s proxy serverem byl překročen časový limit</translation> </message> <message> - <location line="-5"/> <source>Proxy host not found</source> <translation>Proxy server se nepodařilo najit</translation> </message> <message> - <location line="+71"/> <source>TTL expired</source> <translation>TTL uplynul</translation> </message> <message> - <location line="+8"/> <source>Address type not supported</source> <translation>Tento typ adresy není podporován</translation> </message> <message> - <location line="-87"/> <source>Connection to proxy refused</source> <translation>Proxy server odmítl navázání spojení</translation> </message> <message> - <location line="+40"/> <source>SOCKS version 5 protocol error</source> <translation>Chyba protokolu (SOCKS verze 5)</translation> </message> @@ -5946,32 +6583,26 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QSoftKeyManager</name> <message> - <location filename="../src/gui/kernel/qsoftkeymanager.cpp" line="+78"/> <source>Ok</source> <translation>OK</translation> </message> <message> - <location line="+3"/> <source>Select</source> <translation>Vybrat</translation> </message> <message> - <location line="+3"/> <source>Done</source> <translation>Hotovo</translation> </message> <message> - <location line="+3"/> <source>Options</source> <translation>Volby</translation> </message> <message> - <location line="+3"/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location line="+151"/> <source>Exit</source> <translation>Ukončit</translation> </message> @@ -5979,12 +6610,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QSpinBox</name> <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-567"/> <source>Less</source> <translation>Méně</translation> </message> <message> - <location line="-2"/> <source>More</source> <translation>Více</translation> </message> @@ -5992,56 +6621,42 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QSql</name> <message> - <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+893"/> - <location line="+16"/> - <location line="+36"/> <source>No</source> <translation>Ne</translation> </message> <message> - <location line="-53"/> - <location line="+16"/> - <location line="+36"/> <source>Yes</source> <translation>Ano</translation> </message> <message> - <location line="-34"/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location line="-20"/> <source>Delete</source> <translation>Delete</translation> </message> <message> - <location line="+11"/> <source>Insert</source> <translation>Vložit</translation> </message> <message> - <location line="+2"/> <source>Update</source> <translation>Obnovit</translation> </message> <message> - <location line="-12"/> <source>Delete this record?</source> <translation>Smazat tento zápis?</translation> </message> <message> - <location line="+16"/> <source>Save edits?</source> <translation>Uložit změny?</translation> </message> <message> - <location line="+35"/> <source>Confirm</source> <translation>Potvrdit</translation> </message> <message> - <location line="+1"/> <source>Cancel your edits?</source> <translation>Zrušit změny?</translation> </message> @@ -6049,80 +6664,165 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QSslSocket</name> <message> - <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+362"/> <source>Error creating SSL session: %1</source> <translation>Nepodařilo se vytvořit sezení SSL: %1</translation> </message> <message> - <location line="-15"/> <source>Error creating SSL session, %1</source> <translation>Nepodařilo se vytvořit sezení SSL, %1</translation> </message> <message> - <location line="-46"/> <source>Cannot provide a certificate with no key, %1</source> <translation>Bez klíče nelze poskytnout žádné osvědčení k volnému použití, %1</translation> </message> <message> - <location line="+245"/> + <source>Private key does not certify public key, %1</source> + <translation>Soukromý klíč nedosvědčuje veřejný klíč, %1</translation> + </message> + <message> <source>Unable to write data: %1</source> <translation>Data se nepodařilo zapsat: %1</translation> </message> <message> - <location line="+215"/> + <source>Unable to decrypt data: %1</source> + <translation>Data se nepodařilo rozluštit: %1</translation> + </message> + <message> <source>Error during SSL handshake: %1</source> <translation>Během startu SSL protokolu se vyskytla chyba: %1</translation> </message> <message> - <location line="-453"/> <source>Error loading local certificate, %1</source> <translation>Nepodařilo se nahrát místní osvědčení, %1</translation> </message> <message> - <location line="-23"/> <source>Invalid or empty cipher list (%1)</source> <translation>Neplatný či prázdný seznam se šifrovacími klíči (%1)</translation> </message> <message> - <location line="+42"/> <source>Private key does not certificate public key, %1</source> - <translation>Vystavení osvědčení k veřejnému klíči přes soukromý klíč se nezdařilo, %1</translation> + <translation type="obsolete">Vystavení osvědčení k veřejnému klíči přes soukromý klíč se nezdařilo, %1</translation> </message> <message> - <location line="-67"/> <source>Error creating SSL context (%1)</source> <translation>Nepodařilo se vytvořit žádný kontext SSL (%1)</translation> </message> <message> - <location line="+405"/> <source>Error while reading: %1</source> <translation>Při čtení se vyskytla chyba: %1</translation> </message> <message> - <location line="-345"/> <source>Error loading private key, %1</source> <translation>Soukromý klíč se nepodařilo nahrát, %1</translation> </message> + <message> + <source>No error</source> + <translation>Žádná chyba</translation> + </message> + <message> + <source>The issuer certificate could not be found</source> + <translation>Osvědčení od vydavatele se nepodařilo nalézt</translation> + </message> + <message> + <source>The certificate signature could not be decrypted</source> + <translation>Podpis osvědčení se nepodařilo rozluštit</translation> + </message> + <message> + <source>The public key in the certificate could not be read</source> + <translation>Veřejný klíč v osvědčení se nepodařilo přečíst</translation> + </message> + <message> + <source>The signature of the certificate is invalid</source> + <translation>Podpis osvědčení je neplatný</translation> + </message> + <message> + <source>The certificate is not yet valid</source> + <translation>Osvědčení ještě není platné</translation> + </message> + <message> + <source>The certificate has expired</source> + <translation>Platnost osvědčení uplynula</translation> + </message> + <message> + <source>The certificate's notBefore field contains an invalid time</source> + <translation>Pole osvědčení 'notBefore' obsahuje neplatný čas</translation> + </message> + <message> + <source>The certificate's notAfter field contains an invalid time</source> + <translation>Pole osvědčení 'notAfter' obsahuje neplatný čas</translation> + </message> + <message> + <source>The certificate is self-signed, and untrusted</source> + <translation>Osvědčení je podepsáno samo sebou, a proto není důvěryhodné</translation> + </message> + <message> + <source>The root certificate of the certificate chain is self-signed, and untrusted</source> + <translation>Kořenové osvědčení řetězce osvědčení je podepsáno samo sebou, a proto není důvěryhodné</translation> + </message> + <message> + <source>The issuer certificate of a locally looked up certificate could not be found</source> + <translation>Osvědčení od vydavatele místně nalezeného osvědčení se nepodařilo najít</translation> + </message> + <message> + <source>No certificates could be verified</source> + <translation>Žádný z osvědčení se nepodařilo ověřit</translation> + </message> + <message> + <source>One of the CA certificates is invalid</source> + <translation>Jedno z osvědčení osvědčovacího místa (CA) je neplatné</translation> + </message> + <message> + <source>The basicConstraints path length parameter has been exceeded</source> + <translation>Délka cesty 'basicConstraints'byla překročena</translation> + </message> + <message> + <source>The supplied certificate is unsuitable for this purpose</source> + <translation>Poskytnuté osvědčení nelze v tomto případě použít; není vhodné pro tento účel</translation> + </message> + <message> + <source>The root CA certificate is not trusted for this purpose</source> + <translation>Kořenové osvědčení osvědčovacího místa není pro tento případ důvěryhodné</translation> + </message> + <message> + <source>The root CA certificate is marked to reject the specified purpose</source> + <translation>Kořenové osvědčení osvědčovacího místa odmítá tento případ na základě zvláštního označení</translation> + </message> + <message> + <source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source> + <translation>Osvědčení sledovaného vydavatele bylo odmítnuto, protože jeho předmětný název neodpovídá názvu vydavatele současného osvědčení</translation> + </message> + <message> + <source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source> + <translation>Osvědčení sledovaného vydavatele bylo odmítnuto, protože název vydavatele a sériové číslo jsou přítomny a neodpovídají identifikátoru osvědčovacího místa současného osvědčení</translation> + </message> + <message> + <source>The peer did not present any certificate</source> + <translation>Protější místo neudalo žádné osvědčení</translation> + </message> + <message> + <source>The host name did not match any of the valid hosts for this certificate</source> + <translation>Název hostitelského počítače neodpovídá žádnému z hostitelů platných pro toto osvědčení, kteří jsou na seznamu</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Neznámá chyba</translation> + </message> </context> <context> <name>QStateMachine</name> <message> - <location filename="../src/corelib/statemachine/qstatemachine.cpp" line="+998"/> <source>Missing initial state in compound state '%1'</source> <translation>Chybí počáteční stav složeného stavu '%1'</translation> </message> <message> - <location line="+7"/> <source>Missing default state in history state '%1'</source> <translation>Chybí výchozí stav ve vývoji stavu '%1'</translation> </message> <message> - <location line="+7"/> <source>No common ancestor for targets and source of transition from state '%1'</source> <translation>Cíl a zdroj přechodu ze stavu '%1' nemají žádný společný původ</translation> </message> <message> - <location line="+4"/> <source>Unknown error</source> <translation>Neznámá chyba</translation> </message> @@ -6130,30 +6830,22 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QSystemSemaphore</name> <message> - <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-46"/> <source>%1: does not exist</source> <translation>%1: Neexistuje</translation> </message> <message> - <location line="-4"/> <source>%1: already exists</source> <translation>%1: Již existuje</translation> </message> <message> - <location line="+13"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+73"/> <source>%1: unknown error %2</source> <translation>%1: Neznámá chyba %2</translation> </message> <message> - <location line="-17"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="-3"/> <source>%1: permission denied</source> <translation>%1: Přístup odepřen</translation> </message> <message> - <location line="+13"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="-4"/> <source>%1: out of resources</source> <translation>%1: Nejsou již použitelné zdroje</translation> </message> @@ -6161,12 +6853,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QTDSDriver</name> <message> - <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/> <source>Unable to open connection</source> <translation>Nepodařilo se otevřít spojení s databází</translation> </message> <message> - <location line="+5"/> <source>Unable to use database</source> <translation>Datatbázi se nepodařilo použít</translation> </message> @@ -6174,12 +6864,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QTabBar</name> <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/> <source>Scroll Left</source> <translation>Projíždět doleva</translation> </message> <message> - <location line="+0"/> <source>Scroll Right</source> <translation>Projíždět doprava</translation> </message> @@ -6187,7 +6875,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QTcpServer</name> <message> - <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/> <source>Operation on socket is not supported</source> <translation>Tato zásuvková (socket) operace není podporována</translation> </message> @@ -6195,42 +6882,34 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QTextControl</name> <message> - <location filename="../src/gui/text/qtextcontrol.cpp" line="+2013"/> <source>Cu&t</source> <translation>Vyj&mout</translation> </message> <message> - <location line="+5"/> <source>&Copy</source> <translation>&Kopírovat</translation> </message> <message> - <location line="-9"/> <source>&Redo</source> <translation>&Znovu</translation> </message> <message> - <location line="-2"/> <source>&Undo</source> <translation>&Zpět</translation> </message> <message> - <location line="+24"/> <source>&Paste</source> <translation>&Vložit</translation> </message> <message> - <location line="+3"/> <source>Delete</source> <translation>Smazat</translation> </message> <message> - <location line="+7"/> <source>Select All</source> <translation>Vybrat vše</translation> </message> <message> - <location line="-16"/> <source>Copy &Link Location</source> <translation>&Kopírovat adresu odkazu</translation> </message> @@ -6238,14 +6917,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QToolButton</name> <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+312"/> - <location line="+8"/> <source>Open</source> <translation>Otevřít</translation> </message> <message> - <location line="-10"/> - <location line="+6"/> <source>Press</source> <translation>Stisknout</translation> </message> @@ -6253,7 +6928,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QUdpSocket</name> <message> - <location filename="../src/network/socket/qudpsocket.cpp" line="+179"/> <source>This platform does not support IPv6</source> <translation>Tato patforma nepodpotuje IPv6</translation> </message> @@ -6261,12 +6935,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QUndoGroup</name> <message> - <location filename="../src/gui/util/qundogroup.cpp" line="+413"/> <source>Redo</source> <translation>Znovu</translation> </message> <message> - <location line="-28"/> <source>Undo</source> <translation>Zpět</translation> </message> @@ -6274,7 +6946,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QUndoModel</name> <message> - <location filename="../src/gui/util/qundoview.cpp" line="+101"/> <source><empty></source> <translation><prázdný></translation> </message> @@ -6282,12 +6953,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QUndoStack</name> <message> - <location filename="../src/gui/util/qundostack.cpp" line="+859"/> <source>Redo</source> <translation>Znovu</translation> </message> <message> - <location line="-27"/> <source>Undo</source> <translation>Zpět</translation> </message> @@ -6295,57 +6964,46 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QUnicodeControlCharacterMenu</name> <message> - <location filename="../src/gui/text/qtextcontrol.cpp" line="+906"/> <source>RLE Start of right-to-left embedding</source> <translation>RLE Začátek zapuštění zprava doleva (right-to-left embedding)</translation> </message> <message> - <location line="-2"/> <source>ZWSP Zero width space</source> <translation>ZWSP Prostor s nulovou šířkou (Zero width space)</translation> </message> <message> - <location line="+11"/> <source>Insert Unicode control character</source> <translation>Vložit kontrolní znak Unicode</translation> </message> <message> - <location line="-8"/> <source>LRO Start of left-to-right override</source> <translation>LRO Začátek zrušení zleva doprava (left-to-right override)</translation> </message> <message> - <location line="-2"/> <source>LRE Start of left-to-right embedding</source> <translation>LRE Začátek zapuštění zleva doprava (right-to-left embedding)</translation> </message> <message> - <location line="-4"/> <source>RLM Right-to-left mark</source> <translation>RLM Značka zprava doleva (Right-to-left mark)</translation> </message> <message> - <location line="+8"/> <source>PDF Pop directional formatting</source> <translation>PDF Vsunout směrové formátování (Pop directional formatting)</translation> </message> <message> - <location line="-6"/> <source>ZWNJ Zero width non-joiner</source> <translation>ZWNJ Nespojovač s nulovou šířkou (Zero width non-joiner)</translation> </message> <message> - <location line="+5"/> <source>RLO Start of right-to-left override</source> <translation>RLO Začátek zrušení zprava doleva (right-to-left override)</translation> </message> <message> - <location line="-6"/> <source>ZWJ Zero width joiner</source> <translation>ZWJ Spojovač s nulovou šířkou (Zero width joiner)</translation> </message> <message> - <location line="-2"/> <source>LRM Left-to-right mark</source> <translation>LRM Značka zleva doprava (Left-to-right mark)</translation> </message> @@ -6353,22 +7011,18 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QWebFrame</name> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+730"/> <source>Request blocked</source> <translation>Požadavek byl odmítnut</translation> </message> <message> - <location line="-19"/> <source>Request cancelled</source> <translation>Požadavek byl zrušen</translation> </message> <message> - <location line="+26"/> <source>Cannot show URL</source> <translation>Adresu (URL) nelze ukázat</translation> </message> <message> - <location line="+6"/> <source>Frame load interrupted by policy change</source> <translation>Nahrání rámce bylo přerušeno změnou směrnice</translation> </message> @@ -6377,12 +7031,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Nahrání rámce bylo přerušeno změnou směrnice</translation> </message> <message> - <location line="+12"/> <source>File does not exist</source> <translation>Soubor neexistuje</translation> </message> <message> - <location line="-6"/> <source>Cannot show mimetype</source> <translation>Tento mime typ nelze ukázat</translation> </message> @@ -6402,7 +7054,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Zprava doleva</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+61"/> <source>Top</source> <translation>Začátek</translation> </message> @@ -6443,122 +7094,98 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Provést prohlídku</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+2213"/> <source>Select to the start of the block</source> <translation>Vybrat až po začátek bloku</translation> </message> <message> - <location line="-36"/> <source>Move the cursor to the end of the block</source> <translation>Ukazatel polohy posunout až na konec bloku</translation> </message> <message> - <location line="-469"/> <source>JavaScript Alert - %1</source> <translation>Upozornění od JavaScriptu - %1</translation> </message> <message> - <location line="+16"/> <source>JavaScript Confirm - %1</source> <translation>Potvrzení od JavaScriptu - %1</translation> </message> <message> - <location line="+18"/> <source>JavaScript Prompt - %1</source> <translation>Výzva od JavaScriptu - %1</translation> </message> <message> - <location line="+25"/> <source>JavaScript Problem - %1</source> <translation>Potíže s JavaScriptem - %1</translation> </message> <message> - <location line="+0"/> <source>The script on this page appears to have a problem. Do you want to stop the script?</source> <translation>Vypadá to na to, že skript na této straně má potíže. Chcete tento skript zastavit?</translation> </message> <message> - <location line="+419"/> <source>Select all</source> <translation>Vybrat vše</translation> </message> <message> - <location line="+21"/> <source>Select to the start of the line</source> <translation>Vybrat až po začátek řádku</translation> </message> <message> - <location line="+54"/> <source>Insert a new paragraph</source> <translation>Vložit nový odstavec</translation> </message> <message> - <location line="+3"/> <source>Insert a new line</source> <translation>Vložit nový řádek</translation> </message> <message> - <location line="+4"/> <source>Paste and Match Style</source> <translation>Vložit a odpovídat stylu</translation> </message> <message> - <location line="+3"/> <source>Remove formatting</source> <translation>Odstranit formátování</translation> </message> <message> - <location line="+4"/> <source>Strikethrough</source> <translation>Přeškrtnuto</translation> </message> <message> - <location line="+4"/> <source>Subscript</source> <translation>Dolní index</translation> </message> <message> - <location line="+4"/> <source>Superscript</source> <translation>Horní index</translation> </message> <message> - <location line="+4"/> <source>Insert Bulleted List</source> <translation>Vložit seznam s odrážkami</translation> </message> <message> - <location line="+4"/> <source>Insert Numbered List</source> <translation>Vložit číslovaný seznam</translation> </message> <message> - <location line="+4"/> <source>Indent</source> <translation>Odsadit</translation> </message> <message> - <location line="+3"/> <source>Outdent</source> <translation>Zrušit odsazení</translation> </message> <message> - <location line="+3"/> <source>Center</source> <translation>Na střed</translation> </message> <message> - <location line="+3"/> <source>Justify</source> <translation>Do bloku</translation> </message> <message> - <location line="+3"/> <source>Align Left</source> <translation>Zarovnat vlevo</translation> </message> <message> - <location line="+3"/> <source>Align Right</source> <translation>Zarovnat vpravo</translation> </message> @@ -6579,7 +7206,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Přidat do slovníku</translation> </message> <message> - <location line="-85"/> <source>Delete to the start of the word</source> <translation>Smazat až po začátek slova</translation> </message> @@ -6588,32 +7214,26 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Dosavadní hledané výrazy</translation> </message> <message> - <location line="-69"/> <source>Move the cursor to the next word</source> <translation>Ukazatel polohy posunout k následujícímu slovu</translation> </message> <message> - <location line="+6"/> <source>Move the cursor to the next line</source> <translation>Ukazatel polohy posunout k následujícímu řádku</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+9"/> <source>Scroll down</source> <translation>Projíždět dolů</translation> </message> <message> - <location line="-12"/> <source>Scroll here</source> <translation>Projíždět až sem</translation> </message> <message> - <location line="+11"/> <source>Scroll left</source> <translation>Projíždět doleva</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+12"/> <source>Move the cursor to the start of the block</source> <translation>Ukazatel polohy posunout na začátek bloku</translation> </message> @@ -6622,7 +7242,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Směr psaní</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="-7"/> <source>Bottom</source> <translation>Konec</translation> </message> @@ -6635,12 +7254,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Kurzívní</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="-3"/> <source>Move the cursor to the end of the line</source> <translation>Ukazatel polohy posunout na konec řádku</translation> </message> <message> - <location line="-3"/> <source>Move the cursor to the start of the line</source> <translation>Ukazatel polohy posunout na začátek řádku</translation> </message> @@ -6653,12 +7270,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Poslat</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+167"/> <source>Web Inspector - %2</source> <translation>Web Inspektor - %2</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+3"/> <source>Page up</source> <translation>O stranu nahoru</translation> </message> @@ -6679,487 +7294,411 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Nebyl vybrán žádný soubor</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/> <source>Submit</source> <comment>default label for Submit buttons in forms on web pages</comment> <translation>Poslat</translation> </message> <message> - <location line="+10"/> <source>Reset</source> <comment>default label for Reset buttons in forms on web pages</comment> <translation>Vrátit</translation> </message> <message> - <location line="+11"/> <source>This is a searchable index. Enter search keywords: </source> <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> <translation>Tento rejstřík má funkci hledání. Zadejte nějaký hledaný výraz:</translation> </message> <message> - <location line="+5"/> <source>Choose File</source> <comment>title for file button used in HTML forms</comment> <translation>Vybrat soubor</translation> </message> <message> - <location line="+5"/> <source>No file selected</source> <comment>text to display in file button used in HTML forms when no file is selected</comment> <translation>Nebyl vybrán žádný soubor</translation> </message> <message> - <location line="+5"/> <source>Open in New Window</source> <comment>Open in New Window context menu item</comment> <translation>Otevřít v novém okně</translation> </message> <message> - <location line="+5"/> <source>Save Link...</source> <comment>Download Linked File context menu item</comment> <translation>Uložit odkaz...</translation> </message> <message> - <location line="+5"/> <source>Copy Link</source> <comment>Copy Link context menu item</comment> <translation>Kopírovat adresu odkazu</translation> </message> <message> - <location line="+5"/> <source>Open Image</source> <comment>Open Image in New Window context menu item</comment> <translation>Vyobrazení otevřít v novém okně</translation> </message> <message> - <location line="+5"/> <source>Save Image</source> <comment>Download Image context menu item</comment> <translation>Uložit vyobrazení</translation> </message> <message> - <location line="+5"/> <source>Copy Image</source> <comment>Copy Link context menu item</comment> <translation>Kopírovat vyobrazení</translation> </message> <message> - <location line="+5"/> <source>Open Frame</source> <comment>Open Frame in New Window context menu item</comment> <translation>Otevřít rámec</translation> </message> <message> - <location line="+5"/> <source>Copy</source> <comment>Copy context menu item</comment> <translation>Kopírovat</translation> </message> <message> - <location line="+5"/> <source>Go Back</source> <comment>Back context menu item</comment> <translation>Jít zpět</translation> </message> <message> - <location line="+5"/> <source>Go Forward</source> <comment>Forward context menu item</comment> <translation>Jít dopředu</translation> </message> <message> - <location line="+5"/> <source>Stop</source> <comment>Stop context menu item</comment> <translation>Zastavit</translation> </message> <message> - <location line="+5"/> <source>Reload</source> <comment>Reload context menu item</comment> <translation>Nahrát znovu</translation> </message> <message> - <location line="+5"/> <source>Cut</source> <comment>Cut context menu item</comment> <translation>Vyjmout</translation> </message> <message> - <location line="+5"/> <source>Paste</source> <comment>Paste context menu item</comment> <translation>Vložit</translation> </message> <message> - <location line="+5"/> <source>No Guesses Found</source> <comment>No Guesses Found context menu item</comment> <translation>Nebyly nalezeny žádné návrhy</translation> </message> <message> - <location line="+5"/> <source>Ignore</source> <comment>Ignore Spelling context menu item</comment> <translation>Přehlížet</translation> </message> <message> - <location line="+5"/> <source>Add To Dictionary</source> <comment>Learn Spelling context menu item</comment> <translation>Přidat do slovníku</translation> </message> <message> - <location line="+5"/> <source>Search The Web</source> <comment>Search The Web context menu item</comment> <translation>Hledat na síti</translation> </message> <message> - <location line="+5"/> <source>Look Up In Dictionary</source> <comment>Look Up in Dictionary context menu item</comment> <translation>Podívat se do slovníku</translation> </message> <message> - <location line="+5"/> <source>Open Link</source> <comment>Open Link context menu item</comment> <translation>Otevřít adresu odkazu</translation> </message> <message> - <location line="+5"/> <source>Ignore</source> <comment>Ignore Grammar context menu item</comment> <translation>Přehlížet</translation> </message> <message> - <location line="+5"/> <source>Spelling</source> <comment>Spelling and Grammar context sub-menu item</comment> <translation>Pravopis</translation> </message> <message> - <location line="+5"/> <source>Show Spelling and Grammar</source> <comment>menu item title</comment> <translation>Ukázat pravopis a mluvnici</translation> </message> <message> - <location line="+1"/> <source>Hide Spelling and Grammar</source> <comment>menu item title</comment> <translation>Skrýt pravopis a mluvnici</translation> </message> <message> - <location line="+5"/> <source>Check Spelling</source> <comment>Check spelling context menu item</comment> <translation>Ověření pravopisu</translation> </message> <message> - <location line="+5"/> <source>Check Spelling While Typing</source> <comment>Check spelling while typing context menu item</comment> <translation>Ověřovat pravopis během psaní</translation> </message> <message> - <location line="+5"/> <source>Check Grammar With Spelling</source> <comment>Check grammar with spelling context menu item</comment> <translation>Ověřovat mluvnici společně s pravopisem</translation> </message> <message> - <location line="+5"/> <source>Fonts</source> <comment>Font context sub-menu item</comment> <translation>Písma</translation> </message> <message> - <location line="+5"/> <source>Bold</source> <comment>Bold context menu item</comment> <translation>Tučné</translation> </message> <message> - <location line="+5"/> <source>Italic</source> <comment>Italic context menu item</comment> <translation>Kurzíva</translation> </message> <message> - <location line="+5"/> <source>Underline</source> <comment>Underline context menu item</comment> <translation>Podtržení</translation> </message> <message> - <location line="+5"/> <source>Outline</source> <comment>Outline context menu item</comment> <translation>Obrys</translation> </message> <message> - <location line="+5"/> <source>Direction</source> <comment>Writing direction context sub-menu item</comment> <translation>Směr</translation> </message> <message> - <location line="+5"/> <source>Text Direction</source> <comment>Text direction context sub-menu item</comment> <translation>Směr psaní</translation> </message> <message> - <location line="+5"/> <source>Default</source> <comment>Default writing direction context menu item</comment> <translation>Výchozí</translation> </message> <message> - <location line="+5"/> <source>Left to Right</source> <comment>Left to Right context menu item</comment> <translation>Zleva doprava</translation> </message> <message> - <location line="+5"/> <source>Right to Left</source> <comment>Right to Left context menu item</comment> <translation>Zprava doleva</translation> </message> <message> - <location line="+105"/> + <source>Missing Plug-in</source> + <comment>Label text to be used when a plug-in is missing</comment> + <translation>Chybějící přídavný modul</translation> + </message> + <message> <source>Loading...</source> <comment>Media controller status message when the media is loading</comment> <translation>Nahrává se...</translation> </message> <message> - <location line="+5"/> <source>Live Broadcast</source> <comment>Media controller status message when watching a live broadcast</comment> <translation>Živý přenos</translation> </message> <message> - <location line="+8"/> <source>Audio Element</source> <comment>Media controller element</comment> <translation>Zvukový prvek</translation> </message> <message> - <location line="+2"/> <source>Video Element</source> <comment>Media controller element</comment> <translation>Videoprvek</translation> </message> <message> - <location line="+2"/> <source>Mute Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro ztlumení</translation> </message> <message> - <location line="+2"/> <source>Unmute Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro zrušení ztlumení</translation> </message> <message> - <location line="+2"/> <source>Play Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro přehrávání</translation> </message> <message> - <location line="+2"/> <source>Pause Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro pozastavení</translation> </message> <message> - <location line="+2"/> <source>Slider</source> <comment>Media controller element</comment> <translation>Posuvník</translation> </message> <message> - <location line="+2"/> <source>Slider Thumb</source> <comment>Media controller element</comment> <translation>Palec posuvníku</translation> </message> <message> - <location line="+2"/> <source>Rewind Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro přetočení</translation> </message> <message> - <location line="+2"/> <source>Return to Real-time Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro návrat ke skutečnému času</translation> </message> <message> - <location line="+2"/> <source>Elapsed Time</source> <comment>Media controller element</comment> <translation>Uplynulý čas</translation> </message> <message> - <location line="+2"/> <source>Remaining Time</source> <comment>Media controller element</comment> <translation>Zbývající čas</translation> </message> <message> - <location line="+2"/> <source>Status Display</source> <comment>Media controller element</comment> <translation>Údaj o stavu</translation> </message> <message> - <location line="+2"/> <source>Fullscreen Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro zobrazení na celou obrazovku</translation> </message> <message> - <location line="+2"/> <source>Seek Forward Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro hledání dopředu</translation> </message> <message> - <location line="+2"/> <source>Seek Back Button</source> <comment>Media controller element</comment> <translation>Tlačítko pro hledání dozadu</translation> </message> <message> - <location line="+8"/> <source>Audio element playback controls and status display</source> <comment>Media controller element</comment> <translation>Řízení přehrávání zvuku a zobrazení stavu</translation> </message> <message> - <location line="+2"/> <source>Video element playback controls and status display</source> <comment>Media controller element</comment> <translation>Řízení přehrávání videa a zobrazení stavu</translation> </message> <message> - <location line="+2"/> <source>Mute audio tracks</source> <comment>Media controller element</comment> <translation>Ztlumit zvukové stopy</translation> </message> <message> - <location line="+2"/> <source>Unmute audio tracks</source> <comment>Media controller element</comment> <translation>Zrušit ztlumení zvukových stop</translation> </message> <message> - <location line="+2"/> <source>Begin playback</source> <comment>Media controller element</comment> <translation>Začít přehrávání</translation> </message> <message> - <location line="+2"/> <source>Pause playback</source> <comment>Media controller element</comment> <translation>Pozastavit přehrávání</translation> </message> <message> - <location line="+2"/> <source>Movie time scrubber</source> <comment>Media controller element</comment> <translation>Čas přehrávání</translation> </message> <message> - <location line="+2"/> <source>Movie time scrubber thumb</source> <comment>Media controller element</comment> <translation>Palec pro nastavení času přehrávání</translation> </message> <message> - <location line="+2"/> <source>Rewind movie</source> <comment>Media controller element</comment> <translation>Přetočit film zpět</translation> </message> <message> - <location line="+2"/> <source>Return streaming movie to real-time</source> <comment>Media controller element</comment> <translation>Vrátit film na skutečný čas</translation> </message> <message> - <location line="+2"/> <source>Current movie time</source> <comment>Media controller element</comment> <translation>Čas přehrávání filmu</translation> </message> <message> - <location line="+2"/> <source>Remaining movie time</source> <comment>Media controller element</comment> <translation>Zbývající čas z přehrávání filmu</translation> </message> <message> - <location line="+2"/> <source>Current movie status</source> <comment>Media controller element</comment> <translation>Stav filmu</translation> </message> <message> - <location line="+2"/> <source>Play movie in full-screen mode</source> <comment>Media controller element</comment> <translation>Přehrávat film v režimu zobrazení na celou obrazovku</translation> </message> <message> - <location line="+2"/> <source>Seek quickly back</source> <comment>Media controller element</comment> <translation>Rychlé zpětné hledání</translation> </message> <message> - <location line="+2"/> <source>Seek quickly forward</source> <comment>Media controller element</comment> <translation>Rychlé dopředné hledání</translation> </message> <message> - <location line="+9"/> <source>Indefinite time</source> <comment>Media time description</comment> <translation>Neomezený čas</translation> </message> <message> - <location line="+9"/> <source>%1 days %2 hours %3 minutes %4 seconds</source> <comment>Media time description</comment> <translation>%1 dny %2 hodiny %3 minuty %4 sekundy</translation> </message> <message> - <location line="+4"/> <source>%1 hours %2 minutes %3 seconds</source> <comment>Media time description</comment> <translation>%1 hodiny %2 minuty %3 sekundy</translation> </message> <message> - <location line="+4"/> <source>%1 minutes %2 seconds</source> <comment>Media time description</comment> <translation>%1 minuty %2 sekundy</translation> </message> <message> - <location line="+3"/> <source>%1 seconds</source> <comment>Media time description</comment> <translation>%1 sekundy</translation> @@ -7175,37 +7714,31 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Zprava doleva</translation> </message> <message> - <location line="-210"/> <source>Inspect</source> <comment>Inspect Element context menu item</comment> <translation>Provést prohlídku</translation> </message> <message> - <location line="+5"/> <source>No recent searches</source> <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> <translation>Neexistují žádné naposledy hledané výrazy</translation> </message> <message> - <location line="+5"/> <source>Recent searches</source> <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> <translation>Dosavadní hledané výrazy</translation> </message> <message> - <location line="+5"/> <source>Clear recent searches</source> <comment>menu item in Recent Searches menu that empties menu's contents</comment> <translation>Smazat naposledy hledané výrazy</translation> </message> <message> - <location line="+75"/> <source>Unknown</source> <comment>Unknown filesize FTP directory listing item</comment> <translation>Neznámý</translation> </message> <message> - <location line="+5"/> <source>%1 (%2x%3 pixels)</source> <comment>Title string for images</comment> <translation>%1 (%2x%3 pixelů)</translation> @@ -7223,17 +7756,14 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Neexistují žádné naposledy hledané výrazy</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+1"/> <source>Page right</source> <translation>O stranu doprava</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+12"/> <source>Move the cursor to the start of the document</source> <translation>Ukazatel polohy posunout na začátek dokumentu</translation> </message> <message> - <location line="-30"/> <source>Move the cursor to the next character</source> <translation>Ukazatel polohy posunout k následujícímu znaku</translation> </message> @@ -7242,12 +7772,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Kopírovat adresu odkazu</translation> </message> <message> - <location line="+54"/> <source>Select to the previous line</source> <translation>Vybrat až po předchozí řádek</translation> </message> <message> - <location line="-6"/> <source>Select to the previous word</source> <translation>Vybrat až po předchozí slovo</translation> </message> @@ -7256,7 +7784,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Kontrola pravopisu</translation> </message> <message> - <location line="-9"/> <source>Select to the next character</source> <translation>Vybrat až po následující znak</translation> </message> @@ -7265,7 +7792,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Ukázat pravopis a mluvnici</translation> </message> <message> - <location line="+39"/> <source>Delete to the end of the word</source> <translation>Smazat až po konec slova</translation> </message> @@ -7274,12 +7800,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Směr</translation> </message> <message> - <location line="-18"/> <source>Select to the end of the line</source> <translation>Vybrat až po začátek řádku</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="-307"/> <source>Submit</source> <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment> <translation>Poslat</translation> @@ -7289,7 +7813,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Vybrat soubor</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+3"/> <source>Scroll up</source> <translation>Projíždět nahoru</translation> </message> @@ -7298,7 +7821,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Smazat naposledy hledané výrazy</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+9"/> <source>Select to the start of the document</source> <translation>Vybrat až po začátek dokumentu</translation> </message> @@ -7311,7 +7833,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Podtrhnout</translation> </message> <message> - <location line="-66"/> <source>Move the cursor to the previous character</source> <translation>Ukazatel polohy posunout k předchozímu znaku</translation> </message> @@ -7320,17 +7841,14 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Kopírovat vyobrazení</translation> </message> <message> - <location line="+69"/> <source>Select to the end of the document</source> <translation>Vybrat až po konec dokumentu</translation> </message> <message> - <location line="-6"/> <source>Select to the end of the block</source> <translation>Vybrat až po konec bloku</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+1"/> <source>Scroll right</source> <translation>Projíždět doprava</translation> </message> @@ -7343,7 +7861,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Otevřít adresu odkazu</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+406"/> + <source>Redirection limit reached</source> + <translation>Dosaženo krajní meze pro přesměrování</translation> + </message> + <message> <source>Bad HTTP request</source> <translation>Neplatný požadavek HTTP</translation> </message> @@ -7352,12 +7873,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Neznámý</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="-57"/> <source>Move the cursor to the previous word</source> <translation>Ukazatel polohy posunout k předchozímu slovu</translation> </message> <message> - <location line="+6"/> <source>Move the cursor to the previous line</source> <translation>Ukazatel polohy posunout na předchozí řádku</translation> </message> @@ -7366,7 +7885,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">%n soubor(ů)</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="-9"/> <source>Left edge</source> <translation>Levý okraj</translation> </message> @@ -7375,12 +7893,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Jít dopředu</translation> </message> <message> - <location line="+5"/> <source>Page down</source> <translation>O stranu dolů</translation> </message> <message> - <location line="-1"/> <source>Page left</source> <translation>O stranu doleva</translation> </message> @@ -7389,7 +7905,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Tento index má funkci hledání. Zadejte nějaký hledaný výraz:</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+27"/> <source>Select to the previous character</source> <translation>Vybrat až po předchozí znak</translation> </message> @@ -7402,12 +7917,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Otevřít v novém okně</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="-3"/> <source>Right edge</source> <translation>Pravý okraj</translation> </message> <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="-9"/> <source>Move the cursor to the end of the document</source> <translation>Ukazatel polohy posunout na konec dokumentu</translation> </message> @@ -7420,30 +7933,26 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">%1 (%2x%3 pixelů)</translation> </message> <message> - <location line="+12"/> <source>Select to the next word</source> <translation>Vybrat až po následující slovo</translation> </message> <message> - <location line="+6"/> <source>Select to the next line</source> <translation>Vybrat až po následující řádek</translation> </message> <message numerus="yes"> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/> <source>%n file(s)</source> <comment>number of chosen file</comment> <translation> - <numerusform>%n soubor(ů)</numerusform> - <numerusform></numerusform> - <numerusform></numerusform> + <numerusform>jeden soubor</numerusform> + <numerusform>%n soubory</numerusform> + <numerusform>%n souborů</numerusform> </translation> </message> </context> <context> <name>QWhatsThisAction</name> <message> - <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+527"/> <source>What's This?</source> <translation>Co je toto?</translation> </message> @@ -7451,7 +7960,6 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QWidget</name> <message> - <location filename="../src/gui/kernel/qwidget.cpp" line="+5672"/> <source>*</source> <translation>*</translation> </message> @@ -7459,57 +7967,46 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QWizard</name> <message> - <location filename="../src/gui/dialogs/qwizard.cpp" line="+659"/> <source>Done</source> <translation>Hotovo</translation> </message> <message> - <location line="+4"/> <source>Help</source> <translation>Nápověda</translation> </message> <message> - <location line="+0"/> <source>&Help</source> <translation>&Nápověda</translation> </message> <message> - <location line="-8"/> <source>&Next</source> <translation>&Další</translation> </message> <message> - <location line="+6"/> <source>Cancel</source> <translation>Zrušit</translation> </message> <message> - <location line="-4"/> <source>Commit</source> <translation>Použít</translation> </message> <message> - <location line="-5"/> <source>Continue</source> <translation>Pokračovat</translation> </message> <message> - <location line="+7"/> <source>&Finish</source> <translation>Do&končit</translation> </message> <message> - <location line="-4"/> <source>&Next ></source> <translation>&Další ></translation> </message> <message> - <location line="-6"/> <source>Go Back</source> <translation>Jít zpět</translation> </message> <message> - <location line="+0"/> <source>< &Back</source> <translation>< &Zpět</translation> </message> @@ -7517,69 +8014,54 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QWorkspace</name> <message> - <location filename="../src/gui/widgets/qworkspace.cpp" line="+1090"/> <source>&Move</source> <translation>Po&sunout</translation> </message> <message> - <location line="+1"/> <source>&Size</source> <translation>Změnit &velikost</translation> </message> <message> - <location line="-978"/> <source>Close</source> <translation>Zavřít</translation> </message> <message> - <location line="+2"/> <source>Minimize</source> <translation>Zmenšit</translation> </message> <message> - <location line="+988"/> <source>Stay on &Top</source> <translation>Zůstat v &popředí</translation> </message> <message> - <location line="-6"/> <source>&Close</source> <translation>&Zavřít</translation> </message> <message> - <location line="+790"/> - <location line="+60"/> <source>%1 - [%2]</source> <translation>%1 - [%2]</translation> </message> <message> - <location line="-841"/> - <location line="+1059"/> <source>Sh&ade</source> <translation>&Navinout</translation> </message> <message> - <location line="-1076"/> <source>&Restore</source> <translation>&Obnovit</translation> </message> <message> - <location line="+1072"/> <source>&Unshade</source> <translation>&Odvinout</translation> </message> <message> - <location line="-1068"/> <source>Mi&nimize</source> <translation>&Zmenšit</translation> </message> <message> - <location line="+2"/> <source>Ma&ximize</source> <translation>Zvě&tšit</translation> </message> <message> - <location line="-978"/> <source>Restore Down</source> <translation>Obnovit</translation> </message> @@ -7587,302 +8069,260 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QXml</name> <message> - <location filename="../src/xml/sax/qxml.cpp" line="+78"/> <source>unparsed entity reference in wrong context</source> <translation>používán nevyhodnocený odkaz na entitu v nesprávné souvislosti</translation> </message> <message> - <location line="-1"/> <source>external parsed general entity reference not allowed in DTD</source> <translation>v DTD nejsou dovoleny žádné odkazy na vnější obecnou entitu</translation> </message> <message> - <location line="-9"/> <source>wrong value for standalone declaration</source> <translation>nesprávná hodnota pro samostatné prohlášení</translation> </message> <message> - <location line="+1"/> <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> <translation>chybějící prohlášení kódování nebo prohlášení samostatnosti při čtení prohlášení XML</translation> </message> <message> - <location line="-11"/> <source>no error occurred</source> <translation>žádná chyba</translation> </message> <message> - <location line="+16"/> <source>error occurred while parsing reference</source> <translation>při vyhodnocení odkazu se vyskytla chyba</translation> </message> <message> - <location line="-4"/> <source>standalone declaration expected while reading the XML declaration</source> <translation>chybějící prohlášení samostatnosti při čtení prohlášení XML</translation> </message> <message> - <location line="-4"/> <source>invalid name for processing instruction</source> <translation>neplatný název pro pokyn pro zpracování</translation> </message> <message> - <location line="-7"/> <source>error triggered by consumer</source> <translation>chyba spuštěná spotřebitelem</translation> </message> <message> - <location line="+3"/> <source>error occurred while parsing element</source> <translation>při vyhodnocení prvku se vyskytla chyba</translation> </message> <message> - <location line="+3"/> <source>unexpected character</source> <translation>neočekávaný znak</translation> </message> <message> - <location line="-2"/> <source>tag mismatch</source> <translation>Značky prvků nejsou vkládány správně</translation> </message> <message> - <location line="+1"/> <source>error occurred while parsing content</source> <translation>při vyhodnocení obsahu se vyskytla chyba</translation> </message> <message> - <location line="+9"/> <source>error occurred while parsing comment</source> <translation>při vyhodnocení poznámky se vyskytla chyba</translation> </message> <message> - <location line="+2"/> <source>internal general entity reference not allowed in DTD</source> <translation>v DTD nejsou dovoleny žádné odkazy na vnitřní obecnou entitu</translation> </message> <message> - <location line="+4"/> <source>recursive entities</source> <translation>rekurzivní entity</translation> </message> <message> - <location line="-18"/> <source>more than one document type definition</source> <translation>více definicí typu dokumentu</translation> </message> <message> - <location line="+6"/> <source>version expected while reading the XML declaration</source> <translation>chybějící verze při čtení prohlášení XML</translation> </message> <message> - <location line="+5"/> <source>letter is expected</source> <translation>na tomto místě je potřeba písmeno</translation> </message> <message> - <location line="-12"/> <source>unexpected end of file</source> <translation>neočekávaný konec souboru</translation> </message> <message> - <location line="+16"/> <source>external parsed general entity reference not allowed in attribute value</source> <translation>v hodnotě vlastnosti nejsou dovoleny žádné odkazy na vnější obecnou entitu</translation> </message> <message> - <location line="+4"/> <source>error in the text declaration of an external entity</source> <translation>Chyba v prohlášení textu vnější entity</translation> </message> <message> - <location line="-9"/> <source>error occurred while parsing document type definition</source> <translation>při vyhodnocení definice typu dokumentu se vyskytla chyba</translation> </message> </context> <context> + <name>QXmlPatternistCLI</name> + <message> + <source>Warning in %1, at line %2, column %3: %4</source> + <translation>Varování v %1, na řádku %2, sloupec %3: %4</translation> + </message> + <message> + <source>Warning in %1: %2</source> + <translation>Varování v %1: %2</translation> + </message> + <message> + <source>Unknown location</source> + <translation>Neznámé umístění</translation> + </message> + <message> + <source>Error %1 in %2, at line %3, column %4: %5</source> + <translation>Chyba %1 v %2, na řádku %3, sloupec %4: %5</translation> + </message> + <message> + <source>Error %1 in %2: %3</source> + <translation>Chyba %1 v %2: %3</translation> + </message> +</context> +<context> <name>QXmlStream</name> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1800"/> <source>Reference to unparsed entity '%1'.</source> <translation>Odkaz na nevyhodnocenou entitu '%1'.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="+1752"/> <source>Unexpected character '%1' in public id literal.</source> <translation>'%1' není platným znakem v údaji veřejného id, který je tvořen písmeny.</translation> </message> <message> - <location line="-160"/> - <location line="+12"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-109"/> - <location line="+53"/> <source>Illegal namespace declaration.</source> <translation>Neplatné prohlášení jmenného prostoru.</translation> </message> <message> - <location line="-613"/> <source>Invalid XML character.</source> <translation>Neplatný znak XML.</translation> </message> <message> - <location line="+1137"/> <source>Expected character data.</source> <translation>Byly očekávány údaje o znacích.</translation> </message> <message> - <location line="-300"/> <source>Standalone accepts only yes or no.</source> <translation>Hodnota pro samostatnou vlastnost může být pouze "ano" nebo "ne".</translation> </message> <message> - <location line="-48"/> <source>Invalid XML version string.</source> <translation>Neplatný údaj o verzi XML.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-217"/> <source>Invalid processing instruction name.</source> <translation>Název pokynu pro zpracování je neplatný.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-221"/> <source>Namespace prefix '%1' not declared</source> <translation>Předpona jmenného prostoru '%1' nebyla prohlášena</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+260"/> - <location line="+61"/> - <location line="+40"/> <source>Entity '%1' not declared.</source> <translation>Entita '%1' není prohlášena.</translation> </message> <message> - <location line="-372"/> <source>%1 is an invalid processing instruction name.</source> <translation>%1 není platným názvem pokynu pro zpracování.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="+244"/> <source>The standalone pseudo attribute must appear after the encoding.</source> <translation>Samostatná pseudovlastnost musí následovat bezprostředně po kódování.</translation> </message> <message> - <location line="-553"/> <source>Sequence ']]>' not allowed in content.</source> <translation>Sled znaků ']]>' není v obsahu povolen.</translation> </message> <message> - <location line="+555"/> <source>%1 is an invalid encoding name.</source> <translation>%1 není platným názvem pro kódování.</translation> </message> <message> - <location line="+94"/> <source>, but got '</source> <translation>očekáváno, namísto toho obdrženo '</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-225"/> <source>Start tag expected.</source> <translation>Očekáván otevírající prvek.</translation> </message> <message> - <location line="+611"/> <source>Invalid character reference.</source> <translation>Odkaz na neplatný znak.</translation> </message> <message> - <location line="-40"/> <source>Reference to external entity '%1' in attribute value.</source> <translation>V hodnotě vlastnosti byla odkazována entita '%1'.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-11"/> <source>Expected </source> <translation>Bylo </translation> </message> <message> - <location line="-40"/> <source>Invalid document.</source> <translation>Neplatný dokument.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-80"/> <source>Opening and ending tag mismatch.</source> <translation>Počet otevírajících prvků neodpovídá neodpovídá počtu zavírajících prvků.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-319"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-703"/> <source>Encountered incorrectly encoded content.</source> <translation>Byl nalezen obsah s neplatným kódováním.</translation> </message> <message> - <location line="+301"/> <source>Invalid attribute in XML declaration.</source> <translation>Prohlášení XML obsahuje neplatnou vlastnost.</translation> </message> <message> - <location line="-193"/> <source>Attribute redefined.</source> <translation>Vlastnost byla nově vymezena.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/> <source>%1 is an invalid PUBLIC identifier.</source> <translation>%1 není platným údajem VEŘEJNÉHO identifikátoru (id).</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-1026"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+129"/> <source>Extra content at end of document.</source> <translation>Přebytečný obsah za koncem dokumentu.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-11"/> <source>Invalid XML name.</source> <translation>Neplatný název XML.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="+1235"/> <source>Premature end of document.</source> <translation>Předčasný konec dokumentu.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-246"/> <source>XML declaration not at start of document.</source> <translation>Prohlášení XML se nenachází na začátku dokumentu.</translation> </message> <message> - <location line="-738"/> <source>Recursive entity detected.</source> <translation>Byla zjištěna rekurzivní entita.</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-64"/> <source>Unsupported XML version.</source> <translation>Tato verze XML není podporována.</translation> </message> <message> - <location line="+121"/> <source>Unexpected '</source> <translation>Na tomto místě neplatný ' </translation> </message> <message> - <location line="-1021"/> <source>Invalid entity value.</source> <translation>neplatná hodnota entity.</translation> </message> <message> - <location line="+930"/> <source>Encoding %1 is unsupported</source> <translation>Kódování %1 není podporováno</translation> </message> <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+707"/> <source>NDATA in parameter entity declaration.</source> <translation>Parametrické prohlášení entitynesmí obsahovat žádné NDATA.</translation> </message> @@ -7890,62 +8330,50 @@ Zvolte, prosím, pro soubor jiný název.</translation> <context> <name>QtXmlPatterns</name> <message> - <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/> <source>A comment cannot contain %1</source> <translation>Poznámka nesmí obsahovat %1</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+3726"/> <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> <translation>Verze %1 není podporována. Podporovanou verzí XQuery je 1.0.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/> <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> <translation>Nadřízený uzel druhého agumentu funkce %1 musí být uzlem dokumentu, což není případ %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/> <source>The parameter %1 is required, but no corresponding %2 is supplied.</source> <translation>Nebyl zadán žádný odpovídající %2 pro potřebný parametr %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+163"/> <source>Namespace declarations must occur before function, variable, and option declarations.</source> <translation>Prohlášení jmenných prostorů musí stát před prohlášeními funkcí-, proměnných- nebo prohlášeními voleb.</translation> </message> <message> - <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/> <source>empty</source> <translation>prázdný</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2895"/> <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> <translation>Jmenný prostor-URI nesmí být prázdný, když je spojen s prefixem %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+6"/> <source>A comment cannot end with a %1.</source> <translation>Poznámka nesmí končit na %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+2437"/> <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> <translation>Úplně nahoře stojící prvky prováděcího listu se nesmí nacházet v nulovém jmenném prostoru, což je případ %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/> <source>Integer division (%1) by zero (%2) is undefined.</source> <translation>Celočíselné dělení (%1) nulou (%2) není stanoveno.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+162"/> <source>A library module cannot be evaluated directly. It must be imported from a main module.</source> <translation>Knihovní modul nemůže být posouzen přímo, musí být zaveden z hlavního modulu.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+187"/> <source>Time %1:%2:%3.%4 is invalid.</source> <translation>Časový údaj %1:%2:%3.%4 je neplatný.</translation> </message> @@ -7954,37 +8382,30 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Prvek %2 může mít pouze obvyklé vlastnosti, ne však %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/> <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source> <translation>Počet míst hodnoty typu %1 musí být stejný. To není případ %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+14"/> <source>Modulus division (%1) by zero (%2) is undefined.</source> <translation>Dělení absolutní hodnoty (%1) nulou(%2) není stanoveno.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2987"/> <source>No function with signature %1 is available</source> <translation>Neexistuje žádná funkce označená jako %1</translation> </message> <message> - <location line="+2154"/> <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> <translation>Musí být přítomen záložní výraz, neboť nejsou podporovány žádné věcné výrazy</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+159"/> <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> <translation>V nahrazení může být použit pouze %1, aby se chránil sám, nebo %2, ne však pro %3</translation> </message> <message> - <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+378"/> <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> <translation>Kódovací bod %1 z %2 s kódováním %3 není platným znakem XML.</translation> </message> <message> - <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/> <source>Network timeout.</source> <translation>Časový limit síťové operace byl překročen.</translation> </message> @@ -7993,33 +8414,26 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Nelze provádět žádné výběrové ("cast") operace s typem %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-1567"/> <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> <translation>Prohlášení %1 je nepřípustné, protože není podporováno zavedení schémat.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-1676"/> <source>Attribute %1 and %2 are mutually exclusive.</source> <translation>Vlastnosti %1 a %2 se vzájemně vylučující.</translation> </message> <message> - <location line="-213"/> <source>Parse error: %1</source> <translation>Chyba vyhodnocení: %1</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+86"/> <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> <translation>Nelze zadat žádnou předponu, jestliže je první argument prázdný nebo je prázdný řetězec znaků (žádný jmenný prostor). Byla zadána předpona %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+497"/> <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> <translation>V XSL-T vyhledávacím vzoru musí být první argument k funkci %1 při použití k hledání odkaz tvořený písmeny nebo proměnný.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/> - <location line="+15"/> <source>At least one component must be present.</source> <translation>Alespoň jedna součást musí být přítomna.</translation> </message> @@ -8028,67 +8442,54 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Ve staviteli jmenného prostoru nesmí mýt hodnota jmenného prostoru prázdným řetězcem.</translation> </message> <message> - <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+93"/> <source>An attribute by name %1 has already been created.</source> <translation>Již byla vytvořena jedna vlastnost s názvem %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-204"/> <source>An argument by name %1 has already been declared. Every argument name must be unique.</source> - <translation>Již existuje jeden argument s názvem %1. Názvy argumentů musí být jednoznačné.</translation> + <translation type="obsolete">Již existuje jeden argument s názvem %1. Názvy argumentů musí být jednoznačné.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+236"/> <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> <translation>%1 není pro regulérní výrazy platným příznakem. Platnými příznaky jsou:</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+673"/> <source>At least one %1-element must occur inside %2.</source> <translation>V %2 se musí vyskytovat alespoň jeden %1-prvek.</translation> </message> <message> - <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/> <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> <translation>Je podporován pouze Unicode Codepoint Collation (%1). %2 není podporován.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="-134"/> <source>Matches are case insensitive</source> <translation>Na psaní velkých/malých písmen není brán zřetel</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+3057"/> <source>The name of an extension expression must be in a namespace.</source> <translation>Název výrazu rozšíření se musí nacházet ve jmenném prostoru.</translation> </message> <message> - <location line="-1514"/> <source>Each name of a template parameter must be unique; %1 is duplicated.</source> <translation>Názvy parametrů předloh musí být jednoznačné, %1 již existuje.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-185"/> <source>At least one mode must be specified in the %1-attribute on element %2.</source> <translation>Ve %1-vlastnosti prvku %2 musí být zadán alespoň jeden způsob.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="-10"/> <source>%1 matches newline characters</source> <translation>Výraz '%1' odpovídá znakům pro nový řádek</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="-107"/> <source>Year %1 is invalid because it begins with %2.</source> <translation>%1 není platným údajem pro rok, protože začíná %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+285"/> <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> <translation>Druhý argument %1 nemůže být typ %2. Musí to být typ %3, %4 nebo %5.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+651"/> <source>Element %1 cannot have children.</source> <translation>Prvek %1 nemůže mít podprvky.</translation> </message> @@ -8097,42 +8498,34 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Prvek %2 může mít jen vlastnost %3 nebo vlastnosti, které jsou obvyklé, ne však %1.</translation> </message> <message> - <location line="-497"/> <source>Only one %1-element can appear.</source> <translation>Může být jen jeden jediný %1-prvek.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+75"/> <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source> <translation>Název počítané vlastnosti nesmí mít jmenný prostor-URI %1 s místním názvem %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+138"/> <source>A positional predicate must evaluate to a single numeric value.</source> <translation>Poziční přísudek se musí vyhodnotit jako jednoduchá, číselná hodnota.</translation> </message> <message> - <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/> <source>Element %1 can't be serialized because it appears outside the document element.</source> <translation>Prvek %1 nemůže být vydáván na pokračování, protože se objevuje mimo prvky dokumentu.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+4"/> <source>%1 and %2 match the start and end of a line.</source> <translation>Výrazy %1 a %2 vždy odpovídají začátku nebo konci libovolného řádku.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-560"/> <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> <translation>Je zpracováván jeden XSL-T 1.0 stylový list jedním procesorem verze 2.0.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-1667"/> <source>A stylesheet function must have a prefixed name.</source> <translation>Název funkce stylového listu musí mít předponu.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/> <source>%1 cannot be retrieved</source> <translation>%1 nelze určit</translation> </message> @@ -8141,42 +8534,34 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Nelze provést operaci předvedení hodnoty %1 typu %2 k %3</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-20"/> <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> <translation>Hodnota XSL-T vlastnosti verze musí být hodnotou typu %1, což není případ %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/> <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> <translation>Ve staviteli jmenného prostoru nesmí mýt hodnota jmenného prostoru prázdným řetězcem.</translation> </message> <message> - <location line="+25"/> <source>The prefix %1 cannot be bound.</source> <translation>Předponu %1 nelze spojit.</translation> </message> <message> - <location line="-14"/> <source>The prefix must be a valid %1, which %2 is not.</source> <translation>Předpona musí být platný %1, což není případ %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-551"/> <source>The keyword %1 cannot occur with any other mode name.</source> <translation>Klíčové slovo %1 se nemůže používat dohromady s jiným názvem způsobu.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/> <source>Type error in cast, expected %1, received %2.</source> <translation>Chyba psaní u operace předvedení, bylo očekáváno %1, ale přijato %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-3555"/> <source>%1 is not a valid numeric literal.</source> <translation>%1 není platný číselný údaj tvořený písmeny.</translation> </message> <message numerus="yes"> - <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/> <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source> <translation> <numerusform>%1 má jen %n argument; údaj %2 z tohoto důvodu neplatný.</numerusform> @@ -8189,36 +8574,30 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">byla zjištěna cirkulární závislost</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+3971"/> <source>A variable by name %1 has already been declared.</source> - <translation>Proměnná s názvem %1 již byla prohlášena.</translation> + <translation type="obsolete">Proměnná s názvem %1 již byla prohlášena.</translation> </message> <message> - <location line="-312"/> <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source> - <translation>Předpona %1 nemůže být spojena. Ve výchozím nastavení je již spojena se jmenným prostorem %2.</translation> + <translation type="obsolete">Předpona %1 nemůže být spojena. Ve výchozím nastavení je již spojena se jmenným prostorem %2.</translation> </message> <message> <source>An %1-attribute must have a valid %2 as value, which %3 isn't.</source> <translation type="obsolete">Vlastnost s názvem %1 musí mít platnou %2-hodnotu. %3 není platnou hodnotou.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+389"/> <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> <translation>Prvek %1 nesmí mít vlastnost %3 nebo %4, pokud nemá vlastnost %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+511"/> <source>A function already exists with the signature %1.</source> <translation>Již existuje funkce s podpisem %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/> <source>When casting to %1 from %2, the source value cannot be %3.</source> <translation>U operace předvedení z %1 do %2 nesmí být zdrojová hodnota %3.</translation> </message> <message> - <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+60"/> <source>Attribute %1 can't be serialized because it appears at the top level.</source> <translation>Vlastnost %1 nemůže být vydáván na pokračování, protože se objevuje na nejvyšší rovině.</translation> </message> @@ -8227,42 +8606,34 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">S typem %1 nemohou být prováděny žádné srovnávací operace.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-160"/> <source>No value is available for the external variable by name %1.</source> - <translation>Pro vnější proměnnou s názvem %1 není dostupná žádná hodnota.</translation> + <translation type="obsolete">Pro vnější proměnnou s názvem %1 není dostupná žádná hodnota.</translation> </message> <message> - <location line="-426"/> <source>The value of attribute %1 must of type %2, which %3 isn't.</source> - <translation>Hodnota vlastnosti %1 musí být typu %2. %3 není platnou hodnotou.</translation> + <translation type="obsolete">Hodnota vlastnosti %1 musí být typu %2. %3 není platnou hodnotou.</translation> </message> <message> - <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/> <source>The item %1 did not match the required type %2.</source> <translation>Prvek %1 neodpovídá požadovanému typu %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+1122"/> <source>Element %1 cannot have a sequence constructor.</source> <translation>Prvek %1 nemůže mít stavitele posloupnosti.</translation> </message> <message> - <location line="-842"/> <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> <translation>Nelze používat žádného stavitele posloupnosti, když %2 má vlastnost %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+6"/> <source>one or more</source> <translation>jeden nebo více</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-289"/> <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> <translation>Kódování %1 je neplatné; smí sestávat pouze z latinských písmen a musí odpovídat pravidelnéu výrazu %2.</translation> </message> <message numerus="yes"> - <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+11"/> <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source> <translation> <numerusform>%1 vyžaduje alespoň %n argument; údaj %2 je z toho důvodu neplatný.</numerusform> @@ -8271,38 +8642,30 @@ Zvolte, prosím, pro soubor jiný název.</translation> </translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/> <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source> - <translation>%2 není platným cílovým názvem pokynu pro zpracování, protože tento nesmí být %1 (nehledě na psaní velkých/malých písmen).</translation> + <translation type="obsolete">%2 není platným cílovým názvem pokynu pro zpracování, protože tento nesmí být %1 (nehledě na psaní velkých/malých písmen).</translation> </message> <message> - <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+156"/> <source>The focus is undefined.</source> <translation>Není stanoveno ohnisko.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-3390"/> - <location line="+7323"/> <source>%1 is an unknown schema type.</source> <translation>%1 je neznámým typem schematu.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+1206"/> <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> <translation>Hodnota vlastnosti %1 prvku %2 může být jen %3 nebo %4, ne však %5.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="-26"/> <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> <translation>V nahrazovacím řetězci musí po %1 následovat alespoň jedna číslice, když není chráněn znakem Escape.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2712"/> <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> <translation>V XSL-T vyhledávacím vzoru se smějí používat jen osy %2 nebo %3, ne však %1.</translation> </message> <message> - <location line="-401"/> <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> <translation>Jmenný prostor uživatelem stanovené funkce nesmí být prázdný (pro tento účel je předstanovená předpona %1)</translation> </message> @@ -8311,67 +8674,66 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">První veličina, operand, celočíselného dělení %1 nesmí být nekonečno (%2).</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/> <source>%1 is not a valid value of type %2.</source> <translation>%1 není platnou hodnotou typu %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+166"/> <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source> <translation>Násobení hodnoty typu %1 s %2 nebo %3 (kladné nebo záporné nekonečno) není přípustné.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/> <source>The variable %1 is unused</source> <translation>Proměnná %1 se nepoužívá</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+1787"/> <source>The %1-axis is unsupported in XQuery</source> <translation>Osa %1 není v XQuery podporována</translation> </message> <message> - <location line="+644"/> + <source>No function with name %1 is available.</source> + <translation>Neexistuje žádná funkce s názvem %1.</translation> + </message> + <message> + <source>An attribute with name %1 has already appeared on this element.</source> + <translation>Prvek má již vlastnost s názvem %1.</translation> + </message> + <message> <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> <translation>Byl nalezen chybný stavitel přímého prvku. %1 končí %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="-32"/> <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source> <translation>Dělení hodnoty typu %1 prostřednictvím %2 nebo %3 (kladná nebo záporná nula) není přípustné.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+20"/> <source>Attribute %1 cannot have the value %2.</source> <translation>Vlastnost %1 nesmí mít hodnotu %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+346"/> <source>It will not be possible to retrieve %1.</source> <translation>%1 nelze určit.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2103"/> <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> <translation>V XSL-T vyhledávacím vzoru nesmí mít funkce %1 třetí argument.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="-9"/> <source>The namespace URI in the name for a computed attribute cannot be %1.</source> <translation>URI jmenného prostoru v názvu vypočítané vlastnosti nesmí být %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+24"/> + <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source> + <translation>Cílový název příkazu pro zpracování nemůže být %1 (nezávisle na psaní velkých/malých písmen). %2 je z toho důvodu neplatný.</translation> + </message> + <message> <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> <translation>%1 není platným cílovým názvem pokynu pro zpracování. Musí to být hodnota %2 jakou je například %3.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2571"/> <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> <translation>%1 je složeným typem. Operace předvedení u složených typů není možná. Mohou se ovšem provádět operace obsazení u atomárních typů jako %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="-4"/> <source>zero or one</source> <translation>žádný nebo jeden</translation> </message> @@ -8384,33 +8746,26 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">V XSL-T neexistuje žádný prvek s místním názvem %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-634"/> <source>Two namespace declaration attributes have the same name: %1.</source> <translation>Byly nalezeny dvě vlastnosti prohlášení jmenného prostoru se stejným názvem (%1).</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/> <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> <translation>Skutečná Booleanská hodnota nemůže být vypočítána pro posloupnost ze dvou nebo více atomárních hodnot.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+168"/> - <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="-17"/> <source>%1 is an invalid %2</source> <translation>%1 je neplatný %2</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="-165"/> <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source> <translation>První argument k %1 nesmí být typu %2; musí to být číselný typ, xs:yearMonthDuration nebo xs:dayTimeDuration.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="-141"/> <source>Division (%1) by zero (%2) is undefined.</source> <translation>Dělení (%1) nulou (%2) není stanoveno.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+40"/> <source>No template by name %1 exists.</source> <translation>Neexistuje žádná předloha s názvem %1.</translation> </message> @@ -8419,27 +8774,22 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Prvek %2 musí mít vlastnost %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+105"/> <source>An attribute by name %1 has already appeared on this element.</source> - <translation>Prvek má již vlastnost s názvem %1.</translation> + <translation type="obsolete">Prvek má již vlastnost s názvem %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="-13"/> <source>The default collection is undefined</source> <translation>Pro sbírku není stanovena žádná předloha</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+24"/> <source>Only the prefix %1 can be bound to %2 and vice versa.</source> <translation>S %2 může být spojena pouze předpona %1 (a obráceně).</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/> <source>Value %1 of type %2 exceeds maximum (%3).</source> <translation>Hodnota %1 typu %2 překračuje maximum (%3).</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+10"/> <source>Whitespace characters are removed, except when they appear in character classes</source> <translation>Prázdné znaky jsou odstraněny v případě, že se neobjeví ve znakových třídách</translation> </message> @@ -8448,113 +8798,90 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Nemohou se provádět žádné operace předvedení k typu %1, protože je to abstraktní typ ist a nelze je doložit příkladem.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/> <source>Operator %1 cannot be used on type %2.</source> <translation>Operátor %1 nelze použít na typ %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2361"/> <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> <translation>Jmenný prostor %1 je vyhrazen a z toho důvodu jej nemohou používat uživatelem stanovené funkce (pro tento účel je tu předstanovená předpona %2).</translation> </message> <message> - <location line="-174"/> <source>The target namespace of a %1 cannot be empty.</source> <translation>Cílový jmenný prostor %1 nesmí být prázdný.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="-39"/> <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> <translation>Po %1 musí následovat %2 nebo %3; nesmí se objevit na konci nahrazovacího řetězce.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2394"/> <source>%1 is an invalid namespace URI.</source> <translation>%1 není platným jmenným prostorem-URI.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-298"/> - <location line="+9"/> <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> <translation>%2 nesmí mít vlastnost %1 v případě, že je potomkem %3.</translation> </message> <message> - <location line="+347"/> <source>The attribute %1 can only appear on the first %2 element.</source> <translation>Pouze první %2-prvek smí mít vlastnost %1.</translation> </message> <message> - <location line="-1271"/> <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> <translation>Prvek %1 musí mít buď jednu %2-vlastnost nebo se musí používat stavitel posloupnosti.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2891"/> <source>Module imports must occur before function, variable, and option declarations.</source> <translation>Zavedení modulů musí nastat před prohlášeními funkcí, proměnných a voleb.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+19"/> <source>Day %1 is outside the range %2..%3.</source> <translation>Údaj dne %1 je mimo rozsah %2..%3.</translation> </message> <message> - <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="-18"/> <source>%1 contains octets which are disallowed in the requested encoding %2.</source> <translation>%1 obsahuje oktety, které v kódování %2 nejsou přípustné.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+125"/> <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> <translation>Výchozí hodnota požadovaného parametru nemůže být zadána ani prostřednictvím %1-vlastnosti ani přes stavitele posloupnosti.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+967"/> <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> <translation>V XSL-T vyhledávacím vzoru musí být první argument k funkci %1 při použití k hledání řetězec tvořený písmeny.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-889"/> <source>Text nodes are not allowed at this location.</source> <translation>Na tomto místě nesmí stát žádné textové uzly.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="-32"/> <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> <translation>Hodnoty typu %1 nesmí ýt přísudkem. Pro přísudky jsou přípustné pouze typ číselný nebo účinný booleánský.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2679"/> <source>%1 is not a valid name for a processing-instruction.</source> <translation>%1 není platným názvem pokynu pro zpracování.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/> <source>%1 was called.</source> <translation>%1 byl volán.</translation> </message> <message> - <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="-7"/> <source>It's not possible to add attributes after any other kind of node.</source> <translation>Vlastnosti nesmí následovat za jinými druhy uzlů.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+655"/> <source>At least one %1-element must occur before %2.</source> <translation>Před %2 musí stát alespoň jeden %1-prvek.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/> <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> <translation>Tato forma normalizování %1 není podporována. Podporovanými formami normalizování jsou %2, %3, %4 a %5, a "žádný" (prázdný znakový řetězec zastupuje "žádné normalizování").</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+29"/> <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source> <translation>U operace představení k typu %1 nebo odvozených typů musí být zdrojovou hodnotou řetězec znaků tvořený písmeny nebo hodnota stejného typu. Typ %2 je neplatný.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+1048"/> <source>A parameter in a function cannot be declared to be a tunnel.</source> <translation>Parameter funkce nelze prohlásit za tunel.</translation> </message> @@ -8563,62 +8890,50 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">XSL-T vlastnosti XSL-T prvku musí být v nulovém jmenném prostoru, nikoli v XSL-T jmenném prostoru, jako %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2963"/> <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> <translation>Jmenný prostor uživatelem stanovené funkce v modulu knihovny musí odpovídat jmennému prostoru modulu (Jinými slovy by měl být %1 namísto %2) </translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+26"/> <source>Day %1 is invalid for month %2.</source> <translation>Ǔdaj o dni %1 je neplatným pro měsíc %2.</translation> </message> <message> - <location line="-9"/> <source>Overflow: Can't represent date %1.</source> <translation>Nelze představit datum %1 (Přetečení).</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-1304"/> <source>In a simplified stylesheet module, attribute %1 must be present.</source> <translation>Ve zjednodušeném modulu stylového listu musí být přítomna vlastnost %1.</translation> </message> <message> - <location line="-189"/> <source>Unknown XSL-T attribute %1.</source> <translation>Neznámá XSL-T vlastnost: %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-483"/> <source>It is not possible to redeclare prefix %1.</source> <translation>Předponu %1 nelze prohlásit.</translation> </message> <message> - <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+2"/> <source>exactly one</source> <translation>přesně jeden</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+100"/> <source>%1 is an invalid regular expression pattern: %2</source> <translation>%1 není platným pravidelným výrazem: %2</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-219"/> <source>Element %1 is not allowed at this location.</source> <translation>Prvek %1 nesmí stát na tomto místě.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+1811"/> <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> <translation>%1-výrazy se nemohou používat, protože funkce prohlášení schématu platným není podporována.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+2143"/> <source>At least one %1 element must appear as child of %2.</source> <translation>Alespoň jeden %1-prvek musí být potomkem %2.</translation> </message> <message> - <location line="-282"/> <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> <translation>%1 se nemůže používat, protože tento procesor nepodporuje žádné schéma.</translation> </message> @@ -8627,13 +8942,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Prvek %2 může mít jen %3 nebo obvyklé vlastnosti, ne však %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+129"/> - <location line="+32"/> <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> <translation>Dělení hodnoty typu %1 prostřednictvím %2 (není číselnou hodnotou) není přípustné.</translation> </message> <message> - <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/> <source>Required cardinality is %1; got cardinality %2.</source> <translation>Požadované kardinální číslo (mohutnost množiny) je %1 (v současnosti %2).</translation> </message> @@ -8642,17 +8954,14 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Tento výtvor je přípustný pouze v XQuery.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+771"/> <source>No function by name %1 is available.</source> - <translation>Neexistuje žádná funkce s názvem %1.</translation> + <translation type="obsolete">Neexistuje žádná funkce s názvem %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/> <source>The URI cannot have a fragment</source> <translation>URI nesmí obsahovat kousek</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+788"/> <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> <translation>%1 není atomárním typem. Operace představení se dají provádět pouze s atomárními typy.</translation> </message> @@ -8661,98 +8970,78 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">První argument %1 nemůže být typu %2.</translation> </message> <message> - <location line="-554"/> <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> <translation>Jmenný prostor-URI musí být konstantou a nesmí používat vložené výrazy.</translation> </message> <message> - <location line="-2798"/> <source>Prefix %1 is already declared in the prolog.</source> <translation>Předpona %1 byla prohlášena již v předmluvě (prologu).</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/> <source>Ambiguous rule match.</source> <translation>Víceznačné pravidlo.</translation> </message> <message> - <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="-49"/> <source>Promoting %1 to %2 may cause loss of precision.</source> <translation>Postoupení od %1 k %2 může vést ke ztrátě přesnosti.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+782"/> <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> <translation>V XSL-T vyhledávacím vzoru se smějí pro srovnávání používat jen funkce %1 a %2, ne však %3.</translation> </message> <message> - <location line="-1031"/> - <location line="+10"/> <source>A default namespace declaration must occur before function, variable, and option declarations.</source> <translation>Prohlášení výchozích jmenných prostorů musí stát před prohlášeními funkcí-, proměnných- nebo prohlášeními voleb.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+17"/> <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source> <translation>Operátor %1 se nemůže používat u atomárních hodnot typů %2 a %3.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+526"/> <source>The module import feature is not supported</source> <translation>Funkce zavedení modulu není podporována</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="-71"/> <source>The parameter %1 is passed, but no corresponding %2 exists.</source> <translation>Neexistuje žádný odpovídající %2 pro předaný parameter %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/> <source>A value of type %1 cannot have an Effective Boolean Value.</source> <translation>Hodnota typu %1 nemůže mít žádnou účinnou booleánskou hodnotu.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/> <source>The data of a processing instruction cannot contain the string %1</source> <translation>Data pokynu pro zpracování nesmí obsahovat řetězec znaků %1</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+58"/> <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source> <translation>Časový údaj 24:%1:%2.%3 je neplatný. U hodinového údaje je 24, ale minuty, sekundy a milisekundy musí být všechny 0; </translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-3984"/> <source>A template by name %1 has already been declared.</source> - <translation>Předloha s názvem %1 už byla prohlášena.</translation> + <translation type="obsolete">Předloha s názvem %1 už byla prohlášena.</translation> </message> <message> - <location line="+6376"/> <source>It is not possible to bind to the prefix %1</source> <translation>Předponu %1 nelze spojit</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+9"/> <source>Value %1 of type %2 is below minimum (%3).</source> <translation>Hodnota %1 typu %2 zůstává pod minimem (%3).</translation> </message> <message> - <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="-44"/> <source>Required type is %1, but %2 was found.</source> <translation>Požadovaný typ je %1, byl ale zadán %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="-16"/> <source>%1 is an unsupported encoding.</source> <translation>Kódování %1 není podporováno.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-2584"/> <source>The name of an option must have a prefix. There is no default namespace for options.</source> <translation>Název volby musí mít předponu. Pro volby není žádná předloha pro jmenný prostor.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-1221"/> <source>Element %1 must come last.</source> <translation>Prvek %1 musí stát jako poslední.</translation> </message> @@ -8761,57 +9050,50 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Prvek %2 může mít jen vlastnost %3, %4 nebo vlastnosti, které jsou obvyklé, ne však %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="-12"/> <source>No namespace binding exists for the prefix %1 in %2</source> <translation>Neexistuje žádné svázání jmenného prostoru pro předponu %1 v %2</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+3238"/> <source>The name %1 does not refer to any schema type.</source> <translation>Název %1 nemá žádnou spojitost s jakýmkoli typem schématu.</translation> </message> <message> - <location line="-639"/> <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> <translation>Předponu %1 lze spojit pouze s %2. Toto je prohlášeno již dopředu..</translation> </message> <message> - <location line="-6517"/> <source>W3C XML Schema identity constraint selector</source> <translation>Přepínač omezení totožnosti W3C XML schéma</translation> </message> <message> - <location line="+3"/> <source>W3C XML Schema identity constraint field</source> <translation>Pole omezení totožnosti W3C XML schéma</translation> </message> <message> - <location line="+4"/> <source>A construct was encountered which is disallowed in the current language(%1).</source> <translation>Narazilo se na výtvor, který v nynějším jazyce není povolen (%1).</translation> </message> <message> - <location line="+520"/> + <source>A template with name %1 has already been declared.</source> + <translation>Předloha s názvem %1 již existuje.</translation> + </message> + <message> <source>The initialization of variable %1 depends on itself</source> <translation>Inicializace proměnné %1 je závislá na její vlastní hodnotě</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/> <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source> <translation>Uzel vlastnosti se nesmí objevit jako potomek uzlu dokumentu. Objevil se uzel vlastnosti s názvem %1, který je proto nevhodný.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="-68"/> <source>Month %1 is outside the range %2..%3.</source> <translation>Údaj o měsíci %1 je mimo rozsah %2..%3.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+4311"/> <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> <translation>Název proměnné úzce spojené s pro-výrazem se musí lišit od poziční proměnné. Dvě proměnné s názvem %1 se z tohoto důvodu střetávají.</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/> <source>No namespace binding exists for the prefix %1</source> <translation>Neexistuje žádné svázání jmenného prostoru pro předponu %1</translation> </message> @@ -8820,38 +9102,54 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Prvek má již jednu vlastnost s názvem %1 s hodnotou %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+19"/> <source>%1 is not valid as a value of type %2.</source> <translation>%1 není platný jako hodnota typu %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+4"/> <source>zero or more</source> <translation>žádný nebo více</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2482"/> - <location line="+71"/> <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> <translation>%1 se nenachází v oblasti pod prohlášením vlastností. Všimněte si, že funkce zavedení schématu není podporována.</translation> </message> <message> - <location line="-2830"/> <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> <translation>Při použití funkce %1 k vyhodnocování uvnitř vyhledávacího vzoru musí být argumentem odkaz na proměnnou nebo řetězec tvořený písmeny.</translation> </message> <message> - <location line="+233"/> + <source>No variable with name %1 exists</source> + <translation>Neexistuje žádná proměnná s názvem %1</translation> + </message> + <message> + <source>The value of attribute %1 must be of type %2, which %3 isn't.</source> + <translation>Hodnota vlastnosti %1 musí být typu %2. %3 není platnou hodnotou.</translation> + </message> + <message> + <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source> + <translation>Předpona %1 nemůže být spojena. Ve výchozím nastavení je již spojena se jmenným prostorem %2.</translation> + </message> + <message> + <source>A variable with name %1 has already been declared.</source> + <translation>Proměnná s názvem %1 již byla prohlášena.</translation> + </message> + <message> + <source>No value is available for the external variable with name %1.</source> + <translation>Pro vnější proměnnou s názvem %1 není dostupná žádná hodnota.</translation> + </message> + <message> + <source>An argument with name %1 has already been declared. Every argument name must be unique.</source> + <translation>Již byl prohlášen jeden argument s názvem %1. Názvy argumentů musí být jednoznačné.</translation> + </message> + <message> <source>%1 is an invalid template mode name.</source> <translation>%1 není platným názvem pro řežim předlohy.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="-7"/> <source>At least one time component must appear after the %1-delimiter.</source> <translation>Po %1-oddělovači se musí objevit alespoň jedna složka času.</translation> </message> <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+196"/> <source>Overflow: Date can't be represented.</source> <translation>Nelze představit datum (Přetečení).</translation> </message> @@ -8860,22 +9158,18 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Operátor %1 se nemůže používat u atomárních hodnot typů %2 a %3.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/> <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> <translation>Rozdíl v časové zóně musí ležet v oblasti %1..%2 (včetně). %3 leží mimo oblast.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/> <source>%1 is not a valid XML 1.0 character.</source> <translation>%1 není platný znak XML 1.0.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+74"/> <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> <translation>První argument %1 nemůže být typu %2. Musí to být typ %3, %4 nebo %5.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+12"/> <source>%1 is not a whole number of minutes.</source> <translation>%1 není celočíselným údajem o minutách.</translation> </message> @@ -8888,12 +9182,10 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Nelze provádět žádnou operaci předvedení od %1 do %2.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-4204"/> <source>No variable by name %1 exists</source> - <translation>Neexistuje žádná proměnná s názvem %1</translation> + <translation type="obsolete">Neexistuje žádná proměnná s názvem %1</translation> </message> <message> - <location line="+5919"/> <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> <translation>Jmenný prostor %1 lze spojit pouze s %2. Toto je stanoveno již dopředu.</translation> </message> @@ -8902,1448 +9194,1110 @@ Zvolte, prosím, pro soubor jiný název.</translation> <translation type="obsolete">Druhá veličina, operand, dělení %1 nesmí být nula (%2).</translation> </message> <message> - <location line="-6170"/> <source>Only one %1 declaration can occur in the query prolog.</source> <translation>Předmluva k dotazu (prolog) smí obsahovat pouze jedno %1-prohlášení.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="-151"/> <source>Element %1 must have at least one of the attributes %2 or %3.</source> <translation>Prvek %1 musí mít alespoň jednu z vlastností %2 nebo %3.</translation> </message> <message> - <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/> <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source> <translation>Když jsou zadány obě hodnoty s časovými zónami, musí mít ten samý rozdíl v časové zóně. %1 a %2 nejsou to samé a jsou tím pádem nepřípustné.</translation> </message> <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+4006"/> <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> <translation>Nejsou podporovány vnější funkce. Všechny podporované funkce se dají používat přímo, bez toho, že by byly nejprve prohlášeny za vnější</translation> </message> <message> - <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/> <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> <translation>Poslední krok cesty musí obsahovat buď jen uzly nebo jen atomární hodnoty. Nesmí se vyskytovat společně.</translation> </message> <message> - <location filename="../src/xmlpatterns/schema/qxsdparticlechecker.cpp" line="+165"/> <source>Empty particle cannot be derived from non-empty particle.</source> <translation>Prázdnou částici nelze odvodit z částice, která není prázdná.</translation> </message> <message> - <location line="+15"/> <source>Derived particle is missing element %1.</source> <translation>V odvozené částici chybí prvek %1.</translation> </message> <message> - <location line="+7"/> <source>Derived element %1 is missing value constraint as defined in base particle.</source> <translation>V odvozeném prvku %1 chybí omezení hodnoty, jak je to stanoveno v základní částici.</translation> </message> <message> - <location line="+5"/> <source>Derived element %1 has weaker value constraint than base particle.</source> <translation>Odvozený prvek %1 má slabší omezení hodnoty než má základní částice.</translation> </message> <message> - <location line="+7"/> <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source> <translation>Pevné omezení hodnoty prvku %1 se liší od omezení hodnoty základní částici.</translation> </message> <message> - <location line="+7"/> <source>Derived element %1 cannot be nillable as base element is not nillable.</source> <translation>Odvozený prvek %1 nemůže mít žádnou vlastnost 'nillable', neboť základní prvek žádnou nestanovuje.</translation> </message> <message> - <location line="+10"/> <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source> <translation>Omezení bloku odvozeného prvku %1 nesmí být slabší než v základním prvku.</translation> </message> <message> - <location line="+11"/> <source>Simple type of derived element %1 cannot be validly derived from base element.</source> <translation>Jednoduchý typ odvozeného prvku %1 nemůže být platně odvozen ze základního prvku.</translation> </message> <message> - <location line="+5"/> <source>Complex type of derived element %1 cannot be validly derived from base element.</source> <translation>Složitý typ odvozeného prvku %1 nemůže být platně odvozen ze základního prvku.</translation> </message> <message> - <location line="+24"/> <source>Element %1 is missing in derived particle.</source> <translation>Prvek %1 chybí v odvozené částici.</translation> </message> <message> - <location line="+18"/> <source>Element %1 does not match namespace constraint of wildcard in base particle.</source> <translation>Prvek %1 neodpovídá omezení jmenného prostoru zástupného symbolu (vzor hledání) v základní částici.</translation> </message> <message> - <location line="+11"/> <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source> <translation>Zástupný symbol (vzor hledání) v odvozené částici není platnou dílčí množinou zástupného symbolu v základní částici.</translation> </message> <message> - <location line="+5"/> <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source> <translation>Vlastnost processContent zástupného symbolu (vzor hledání) odvozené částice je slabší než zástupný symbol (vzor hledání) v základní částici.</translation> </message> <message> - <location line="+240"/> <source>Derived particle allows content that is not allowed in the base particle.</source> <translation>Odvozená částice dovoluje obsah, který není přípustný pro základní částici.</translation> </message> <message> - <location filename="../src/xmlpatterns/schema/qxsdschemachecker.cpp" line="+227"/> <source>%1 has inheritance loop in its base type %2.</source> <translation>%1 má ve svém základním typu %2 v kruzích prováděnou dědičnost.</translation> </message> <message> - <location line="+5"/> - <location line="+24"/> <source>Circular inheritance of base type %1.</source> <translation>V kruzích prováděná dědičnost v základním typu %1.</translation> </message> <message> - <location line="+11"/> <source>Circular inheritance of union %1.</source> <translation>V kruzích prováděná dědičnost při sjednocení %1.</translation> </message> <message> - <location line="+25"/> <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source> <translation>%1 není dovoleno odvodit z %2 pomocí omezení, neboť posledně uvedený ji určuje jako konečnou.</translation> </message> <message> - <location line="+5"/> <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source> <translation>%1 není dovoleno odvodit z %2 pomocí rozšíření, neboť posledně uvedený ji určuje jako konečnou.</translation> </message> <message> - <location line="+31"/> <source>Base type of simple type %1 cannot be complex type %2.</source> <translation>Složitý typ %2 nemůže být základním typem jednoduchého typu %1.</translation> </message> <message> - <location line="+9"/> <source>Simple type %1 cannot have direct base type %2.</source> <translation>Jednoduchý typ %1 nemůže mít přímý základní typ %2.</translation> </message> <message> - <location line="+33"/> - <location line="+9"/> <source>Simple type %1 is not allowed to have base type %2.</source> <translation>Jednoduchý typ %1 nesmí mít základní typ %2.</translation> </message> <message> - <location line="+12"/> <source>Simple type %1 can only have simple atomic type as base type.</source> <translation>Jednoduchý typ %1 může mít jen jednoduchý malinký základní typ.</translation> </message> <message> - <location line="+6"/> <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source> <translation>Jednoduchý typ %1 nesmí být odvozen z %2 , neboť poslední určuje omezení jako konečné.</translation> </message> <message> - <location line="+13"/> - <location line="+484"/> <source>Variety of item type of %1 must be either atomic or union.</source> <translation>Rozmanitost složkových typů %1 musí být buď malinká nebo sjednocení.</translation> </message> <message> - <location line="-474"/> - <location line="+483"/> <source>Variety of member types of %1 must be atomic.</source> <translation>Rozmanitost členských typů %1 musí být malinká.</translation> </message> <message> - <location line="-470"/> - <location line="+451"/> <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source> <translation>%1 není dovoleno odvodit z %2 pomocí seznamu, neboť posledně uvedený ji určuje jako konečnou.</translation> </message> <message> - <location line="-431"/> <source>Simple type %1 is only allowed to have %2 facet.</source> <translation>Jednoduchý typ %1 může mít jen stránky %2.</translation> </message> <message> - <location line="+10"/> <source>Base type of simple type %1 must have variety of type list.</source> <translation>Základní typ jednoduchého typu %1 musí mít rozmanitost seznamu typů.</translation> </message> <message> - <location line="+6"/> <source>Base type of simple type %1 has defined derivation by restriction as final.</source> <translation>Základní typ jednoduchého typu %1 určuje sjednocení pomocí omezení jako konečné.</translation> </message> <message> - <location line="+6"/> <source>Item type of base type does not match item type of %1.</source> <translation>Složkový typ základního typu neodpovídá složkovému typu %1.</translation> </message> <message> - <location line="+26"/> - <location line="+93"/> <source>Simple type %1 contains not allowed facet type %2.</source> <translation>Jednoduchý typ %1 obsahuje nedovolený typ stránky %2.</translation> </message> <message> - <location line="-72"/> - <location line="+413"/> <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source> <translation>%1 není dovoleno odvodit z %2 pomocí sjednocení, neboť posledně uvedený ji určuje jako konečnou.</translation> </message> <message> - <location line="-404"/> <source>%1 is not allowed to have any facets.</source> <translation>%1 nesmí mít žádné stránky.</translation> </message> <message> - <location line="+8"/> <source>Base type %1 of simple type %2 must have variety of union.</source> <translation>Základní typ %1 jednoduchého typu %2 musí mít rozmanitost sjednocení typů.</translation> </message> <message> - <location line="+9"/> <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source> <translation>Základní typ %1 jednoduchého typu %2 nesmí mít žádné omezení vlastnosti %3.</translation> </message> <message> - <location line="+18"/> <source>Member type %1 cannot be derived from member type %2 of %3's base type %4.</source> <translation>Členský typ %1 nemůže být odvozen z členského typu %2 ze základního typu %4 %3.</translation> </message> <message> - <location line="+65"/> <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source> <translation>Rozšíření s musí používat jako způsob dědičnosti (odvození) pro %1, neboť základní typ %2 je jednoduchým typem.</translation> </message> <message> - <location line="+30"/> <source>Complex type %1 has duplicated element %2 in its content model.</source> <translation>Složitý typ %1 má zdvojený prvek %2 ve svém modelu obsahu.</translation> </message> <message> - <location line="+8"/> <source>Complex type %1 has non-deterministic content.</source> <translation>Složitý typ %1 má ne-neměnný obsah.</translation> </message> <message> - <location line="+21"/> <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source> <translation>Vlastnosti složitého typu %1 nejsou žádným platným rozšířením vlastností základního typu %2: %3.</translation> </message> <message> - <location line="+37"/> <source>Content model of complex type %1 is not a valid extension of content model of %2.</source> <translation>Model obsahu složitého typu %1 není žádným platným rozšířením modelu obsahu %2.</translation> </message> <message> - <location line="+10"/> <source>Complex type %1 must have simple content.</source> <translation>Složitý typ %1 musí mít jednoduchý obsah.</translation> </message> <message> - <location line="+7"/> <source>Complex type %1 must have the same simple type as its base class %2.</source> <translation>Složitý typ %1 musí mít jednoduchý obsah.</translation> </message> <message> - <location line="+67"/> <source>Complex type %1 cannot be derived from base type %2%3.</source> <translation>Složitý typ %2 nemůže být odvozen ze základního typu %2%3.</translation> </message> <message> - <location line="+14"/> <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source> <translation>Vlastnosti složitého typu %1 nejsou žádným platným omezením vlastností základního typu %2: %3.</translation> </message> <message> - <location line="+14"/> <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source> <translation>Složitý typ %1 s jednoduchým obsahem nemůže být odvozen ze složitého základního typu %2.</translation> </message> <message> - <location line="+35"/> <source>Item type of simple type %1 cannot be a complex type.</source> <translation>Složkový typ jednoduchého typu %1 nemůže být složitým typem.</translation> </message> <message> - <location line="+44"/> <source>Member type of simple type %1 cannot be a complex type.</source> <translation>Členský typ jednoduchého typu %1 nemůže být složitým typem.</translation> </message> <message> - <location line="+8"/> <source>%1 is not allowed to have a member type with the same name as itself.</source> <translation>%1 nesmí mít členský typ se stejným názvem, jaký má sám.</translation> </message> <message> - <location line="+83"/> - <location line="+29"/> - <location line="+34"/> <source>%1 facet collides with %2 facet.</source> <translation>Stránka %1 se střetává se stránkou %2.</translation> </message> <message> - <location line="-20"/> <source>%1 facet must have the same value as %2 facet of base type.</source> <translation>Stránka %1 musí mít tutéž hodnotu, jakou má stránka %2 základního typu.</translation> </message> <message> - <location line="+37"/> <source>%1 facet must be equal or greater than %2 facet of base type.</source> <translation>Stránka %1 musí být stejná nebo větší než stránka %2 základního typu.</translation> </message> <message> - <location line="+19"/> - <location line="+125"/> - <location line="+55"/> - <location line="+12"/> - <location line="+91"/> - <location line="+58"/> - <location line="+34"/> - <location line="+35"/> <source>%1 facet must be less than or equal to %2 facet of base type.</source> <translation>Stránka %1 musí být menší nebo stejná jako stránka %2 základního typu.</translation> </message> <message> - <location line="-389"/> <source>%1 facet contains invalid regular expression</source> <translation>Stránka %1 obsahuje neplatný pravidelný výraz</translation> </message> <message> - <location line="+15"/> <source>Unknown notation %1 used in %2 facet.</source> <translation>Stránka %2 obsahuje neplatné zaznamenání %1.</translation> </message> <message> - <location line="+20"/> <source>%1 facet contains invalid value %2: %3.</source> <translation>Stránka %1 obsahuje neplatnou hodnotu %2: %3.</translation> </message> <message> - <location line="+22"/> <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source> <translation>Stránka %1 nesmí být %2 nebo %3, pokud je stránka %4 základního typu %5.</translation> </message> <message> - <location line="+11"/> <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source> <translation>Stránka %1 nesmí být %2, pokud je stránka %3 základního typu %4.</translation> </message> <message> - <location line="+20"/> - <location line="+55"/> - <location line="+230"/> <source>%1 facet must be less than or equal to %2 facet.</source> <translation>Stránka %1 musí být menší nebo stejná jako stránka %2.</translation> </message> <message> - <location line="-257"/> - <location line="+134"/> - <location line="+82"/> <source>%1 facet must be less than %2 facet of base type.</source> <translation>Stránka %1 musí být menší než stránka %2 základního typu.</translation> </message> <message> - <location line="-201"/> - <location line="+79"/> <source>%1 facet and %2 facet cannot appear together.</source> <translation>Stránky %1 a %2 se nemohou objevit spolu.</translation> </message> <message> - <location line="-27"/> - <location line="+12"/> - <location line="+113"/> <source>%1 facet must be greater than %2 facet of base type.</source> <translation>Stránka %1 musí být větší než stránka %2 základního typu.</translation> </message> <message> - <location line="-86"/> - <location line="+58"/> <source>%1 facet must be less than %2 facet.</source> <translation>Stránka %1 musí být menší než stránka %2.</translation> </message> <message> - <location line="-42"/> - <location line="+58"/> <source>%1 facet must be greater than or equal to %2 facet of base type.</source> <translation>Stránka %1 musí být větší nebo stejná jako stránka %2 základního typu.</translation> </message> <message> - <location line="+113"/> <source>Simple type contains not allowed facet %1.</source> <translation>Jednoduchý typ obsahuje nedovolenou stránku %1.</translation> </message> <message> - <location line="+12"/> <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source> <translation>Stránky %1, %2, %3, %4, %5 a %6 nejsou při odvození (dědičnosti) pomocí seznamu dovoleny.</translation> </message> <message> - <location line="+16"/> <source>Only %1 and %2 facets are allowed when derived by union.</source> <translation>Při odvození (dědičnosti) pomocí sjednocení jsou dovoleny pouze stránky %1 a %2.</translation> </message> <message> - <location line="+23"/> - <location line="+16"/> <source>%1 contains %2 facet with invalid data: %3.</source> <translation>%1 obsahuje stránku %2 s neplatnými daty: %3.</translation> </message> <message> - <location line="+24"/> <source>Attribute group %1 contains attribute %2 twice.</source> <translation>Skupina vlastností %1 obsahuje vlastnost %2 dvakrát.</translation> </message> <message> - <location line="+9"/> <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source> <translation>Skupina vlastností %1 obsahuje dvě rozdílné vlastnosti, obě s typy, které jsou odvozeny z %2.</translation> </message> <message> - <location line="+8"/> <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> <translation>Skupina vlastností %1 obsahuje vlastnost %2 s omezením hodnoty, typ je ale odvozen z %3.</translation> </message> <message> - <location line="+23"/> <source>Complex type %1 contains attribute %2 twice.</source> <translation>Složitý typ %1 obsahuje vlastnost %2 dvakrát.</translation> </message> <message> - <location line="+9"/> <source>Complex type %1 contains two different attributes that both have types derived from %2.</source> <translation>Složitý typ %1 obsahuje dvě rozdílné vlastnosti, obě s typy, které jsou odvozeny z %2.</translation> </message> <message> - <location line="+8"/> <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> <translation>Složitý typ %1 obsahuje vlastnost %2 s omezením hodnoty, typ je ale odvozen z %3.</translation> </message> <message> - <location line="+43"/> <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source> <translation>Prvek %1 nesmí mít omezení hodnoty, když je základní typ složitý.</translation> </message> <message> - <location line="+7"/> <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source> <translation>Prvek %1 nesmí mít omezení hodnoty, když je jeho typ odvozen z %2.</translation> </message> <message> - <location line="+10"/> - <location line="+11"/> <source>Value constraint of element %1 is not of elements type: %2.</source> <translation>Omezení hodnoty prvku %1 není z typu prvku: %2.</translation> </message> <message> - <location line="+13"/> <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source> <translation>Prvek %1 nesmí patřit k skupině nahrazení, neboť není celkovým prvkem.</translation> </message> <message> - <location line="+28"/> <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source> <translation>Typ prvku %1 nemůže být odvozen z typu příslušné skupiny nahrazení.</translation> </message> <message> - <location line="+41"/> <source>Value constraint of attribute %1 is not of attributes type: %2.</source> <translation>Omezení hodnoty vlastnosti %1 není z typu vlastnosti: %2.</translation> </message> <message> - <location line="+9"/> <source>Attribute %1 has value constraint but has type derived from %2.</source> <translation>Vlastnost %1 má mezení hodnoty, ale její typ je odvozen z %2.</translation> </message> <message> - <location line="+56"/> <source>%1 attribute in derived complex type must be %2 like in base type.</source> <translation>Vlastnost %1 v odvozeném složitém typu musí být jako v základním typu %2.</translation> </message> <message> - <location line="+11"/> <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source> <translation>Vlastnost %1 v odvozeném složitém typu musí mít omezení hodnoty jako v základním typu %2.</translation> </message> <message> - <location line="+9"/> <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source> <translation>Vlastnost %1 v odvozeném složitém typu musí mít stejné omezení hodnoty %2 jako v základním typu.</translation> </message> <message> - <location line="+7"/> <source>Attribute %1 in derived complex type must have %2 value constraint.</source> <translation>Vlastnost %1 v odvozeném složitém typu musí omezení hodnoty %2.</translation> </message> <message> - <location line="+18"/> <source>processContent of base wildcard must be weaker than derived wildcard.</source> <translation>Vlastnost 'processContent' základního zástupného symbolu (vzor hledání) musí být slabší než odvozený zástupný symbol (vzor hledání).</translation> </message> <message> - <location line="+39"/> - <location line="+15"/> <source>Element %1 exists twice with different types.</source> <translation>Prvek %1 existuje dvakrát s rozdílnými typy.</translation> </message> <message> - <location line="+28"/> <source>Particle contains non-deterministic wildcards.</source> <translation>Částice obsahuje ne-neměnné zástupné symboly (vzory hledání).</translation> </message> <message> - <location filename="../src/xmlpatterns/schema/qxsdschemahelper.cpp" line="+691"/> - <location line="+63"/> <source>Base attribute %1 is required but derived attribute is not.</source> <translation>Základní vlastnost %1 je vyžadována, ale odvozená vlastnost není.</translation> </message> <message> - <location line="-57"/> <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source> <translation>Typ odvozené vlastnosti %1 nemůže být platně odvozen z typu základní vlastnosti.</translation> </message> <message> - <location line="+28"/> <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source> <translation>Omezení hodnoty odvozené vlastnosti %1 neodpovídá omezení hodnoty základní vlastnosti.</translation> </message> <message> - <location line="+5"/> <source>Derived attribute %1 does not exists in the base definition.</source> + <translation type="obsolete">Odvozená vlastnost %1 neexistuje v základním vymezení.</translation> + </message> + <message> + <source>Derived attribute %1 does not exist in the base definition.</source> <translation>Odvozená vlastnost %1 neexistuje v základním vymezení.</translation> </message> <message> - <location line="+11"/> <source>Derived attribute %1 does not match the wildcard in the base definition.</source> <translation>Odvozená vlastnost %1 neodpovídá zástupnému symbolu (vzoru hledání) v základním vymezení.</translation> </message> <message> - <location line="+17"/> <source>Base attribute %1 is required but missing in derived definition.</source> <translation>Základní vlastnost %1 je vyžadována, ale chybí v odvozeném vymezení.</translation> </message> <message> - <location line="+9"/> <source>Derived definition contains an %1 element that does not exists in the base definition</source> <translation>Odvozené vymezení obsahuje prvek %1, který v základním vymezení neexistuje</translation> </message> <message> - <location line="+5"/> <source>Derived wildcard is not a subset of the base wildcard.</source> <translation>Odvozený zástupný symbol (vzor hledání) není žádnou dílčí množinou základního zástupného symbolu (vzoru hledání).</translation> </message> <message> - <location line="+5"/> <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source> <translation>Vlastnost %1 odvozeného zástupného symbolu (vzoru hledání) není platným omezením %2 základního zástupného symbolu (vzoru hledání)</translation> </message> <message> - <location line="+23"/> <source>Attribute %1 from base type is missing in derived type.</source> <translation>Vlastnost %1 základního typu chybí v odvozeném typu.</translation> </message> <message> - <location line="+5"/> <source>Type of derived attribute %1 differs from type of base attribute.</source> <translation>Typ odvozené vlastnosti %1 se liší od typu základní vlastnosti.</translation> </message> <message> - <location line="+8"/> <source>Base definition contains an %1 element that is missing in the derived definition</source> <translation>Základní vymezení obsahuje prvek %1, který v odvozeném vymezení chybí</translation> </message> <message> - <location filename="../src/xmlpatterns/schema/qxsdschemaparser.cpp" line="+170"/> <source>Can not process unknown element %1, expected elements are: %2.</source> <translation>Nelze zpracovat neznámý prvek %1, očekávanými prvky jsou: %2.</translation> </message> <message> - <location line="+13"/> <source>Element %1 is not allowed in this scope, possible elements are: %2.</source> <translation>Prvek %1 není v této oblasti dovolen; možnými prvky jsou: %2.</translation> </message> <message> - <location line="+16"/> <source>Child element is missing in that scope, possible child elements are: %1.</source> <translation>Podprvek v oblasti chybí; možnými podprvky jsou: %1.</translation> </message> <message> - <location line="+127"/> <source>Document is not a XML schema.</source> <translation>Dokument není schématem XML.</translation> </message> <message> - <location line="+22"/> <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source> <translation>Vlastnost %1 prvku %2 obsahuje neplatný obsah: {%3} není hodnotou typu %4.</translation> </message> <message> - <location line="+6"/> <source>%1 attribute of %2 element contains invalid content: {%3}.</source> <translation>Vlastnost %1 prvku %2 obsahuje neplatný obsah: {%3}.</translation> </message> <message> - <location line="+26"/> <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source> <translation>Cílový jmenný prostor %1 zahrnutého schématu se liší od jím vymezeného cílového jmenného prostoru %2.</translation> </message> <message> - <location line="+14"/> - <location line="+11"/> <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source> <translation>Cílový jmenný prostor %1 zavedeného schématu se liší od jím vymezeného cílového jmenného prostoru %2.</translation> </message> <message> - <location line="+237"/> <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source> <translation>Prvek %1 nemůže stanovit cílový jmenný prostor %3 jako hodnotu vlastnosti %2.</translation> </message> <message> - <location line="+8"/> <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source> <translation>Ve schématu bez jmenného prostoru musí mít prvek %1 vlastnost %2.</translation> </message> <message> - <location line="+833"/> - <location line="+158"/> <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source> <translation>Když je přítomna vlastnost %3, nesmí se vyskytovat prvek %1 v prvku %2.</translation> </message> <message> - <location line="-97"/> - <location line="+119"/> - <location line="+92"/> <source>%1 element has neither %2 attribute nor %3 child element.</source> <translation>Prvek %1 nemá ani vlastnost %2 ani podprvek %3.</translation> </message> <message> - <location line="+835"/> - <location line="+1474"/> - <location line="+232"/> - <location line="+7"/> - <location line="+260"/> - <location line="+17"/> - <location line="+258"/> - <location line="+6"/> - <location line="+17"/> - <location line="+6"/> - <location line="+17"/> - <location line="+11"/> - <location line="+11"/> - <location line="+11"/> <source>%1 element with %2 child element must not have a %3 attribute.</source> <translation>Prvek %1 nesmí mít vlastnost %3, když existuje podprvek %2.</translation> </message> <message> - <location line="-1325"/> <source>%1 attribute of %2 element must be %3 or %4.</source> <translation>Vlastnost %1 prvku %2 může být jen %3 nebo %4.</translation> </message> <message> - <location line="+36"/> <source>%1 attribute of %2 element must have a value of %3.</source> <translation>Vlastnost %1 prvku %2 musí mít hodnotu %3.</translation> </message> <message> - <location line="+7"/> - <location line="+34"/> <source>%1 attribute of %2 element must have a value of %3 or %4.</source> <translation>Vlastnost %1 prvku %2 může mít jen jednu z hodnot %3 nebo %4.</translation> </message> <message> - <location line="+319"/> - <location line="+129"/> - <location line="+9"/> - <location line="+7"/> - <location line="+7"/> - <location line="+327"/> - <location line="+203"/> - <location line="+6"/> - <location line="+6"/> - <location line="+6"/> - <location line="+6"/> - <location line="+6"/> - <location line="+6"/> - <location line="+77"/> <source>%1 element must not have %2 and %3 attribute together.</source> <translation>Vlastnosti %2 a %3 se v prvku %1 nemohou objevit společně.</translation> </message> <message> - <location line="-768"/> - <location line="+222"/> <source>Content of %1 attribute of %2 element must not be from namespace %3.</source> <translation>Obsah vlastnosti %1 prvku %2 nemůže pocházet ze jmenného prostoru %3.</translation> </message> <message> - <location line="-215"/> - <location line="+222"/> <source>%1 attribute of %2 element must not be %3.</source> <translation>Vlastnost %1 prvku %2 nemůže být %3.</translation> </message> <message> - <location line="-64"/> <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source> <translation>Vlastnost %1 prvku %2 musí mít hodnotu %3, protože je nastavena vlastnost %4.</translation> </message> <message> - <location line="+187"/> <source>Specifying use='prohibited' inside an attribute group has no effect.</source> <translation>Zadání use='prohibited' ve skupině vlastností nemá naprosto žádný účinek.</translation> </message> <message> - <location line="+353"/> <source>%1 element must have either %2 or %3 attribute.</source> <translation>Prvek %1 musí mít buď vlastnost %2 nebo %3.</translation> </message> <message> - <location line="+554"/> <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source> <translation>Prvek %1 musí mít buď vlastnost %2, nebo mít %3 nebo %4 jako podprvek.</translation> </message> <message> - <location line="+55"/> <source>%1 element requires either %2 or %3 attribute.</source> <translation>Prvek %1 vyžaduje buď vlastnost %2 nebo %3.</translation> </message> <message> - <location line="+19"/> <source>Text or entity references not allowed inside %1 element</source> <translation>Text nebo odkazy na entitu nejsou v prvku %1 dovoleny</translation> </message> <message> - <location line="+41"/> - <location line="+112"/> <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source> <translation>Vlastnost %1 prvku %2 musí obsahovat %3, %4 nebo seznam adres (URL).</translation> </message> <message> - <location line="+126"/> <source>%1 element is not allowed in this context.</source> <translation>Prvek %1 není v této souvislosti dovolen.</translation> </message> <message> - <location line="+53"/> <source>%1 attribute of %2 element has larger value than %3 attribute.</source> <translation>Hodnota vlastnosti %1 prvku %2 je větší než hodnota vlastnosti %3.</translation> </message> <message> - <location line="+25"/> <source>Prefix of qualified name %1 is not defined.</source> <translation>Předpona způsobilého názvu %1 není stanovena.</translation> </message> <message> - <location line="+65"/> - <location line="+61"/> <source>%1 attribute of %2 element must either contain %3 or the other values.</source> <translation>Hodnota vlastnosti %1 prvku %2 musí obsahovat buď %3 nebo jiné hodnoty.</translation> </message> <message> - <location line="+131"/> - <source>Component with id %1 has been defined previously.</source> + <source>Component with ID %1 has been defined previously.</source> <translation>Součást s ID %1 je již stanovena.</translation> </message> <message> - <location line="+17"/> + <source>Component with id %1 has been defined previously.</source> + <translation type="obsolete">Součást s ID %1 je již stanovena.</translation> + </message> + <message> <source>Element %1 already defined.</source> <translation>Prvek %1 je již stanoven.</translation> </message> <message> - <location line="+11"/> <source>Attribute %1 already defined.</source> <translation>Vlastnost %1 je již stanovena.</translation> </message> <message> - <location line="+15"/> <source>Type %1 already defined.</source> <translation>Typ %1 je již stanoven.</translation> </message> <message> - <location line="+23"/> <source>Attribute group %1 already defined.</source> <translation>Skupina vlastností %1 je již stanovena.</translation> </message> <message> - <location line="+11"/> <source>Element group %1 already defined.</source> <translation>Skupina prvků %1 je již stanovena.</translation> </message> <message> - <location line="+11"/> <source>Notation %1 already defined.</source> <translation>Zápis %1 je již stanoven.</translation> </message> <message> - <location line="+11"/> <source>Identity constraint %1 already defined.</source> <translation>Omezení totožnosti %1 je již stanoveno.</translation> </message> <message> - <location line="+11"/> <source>Duplicated facets in simple type %1.</source> <translation>Zdvojené stránky v jednoduchém typu %1.</translation> </message> <message> - <location filename="../src/xmlpatterns/schema/qxsdschemaresolver.cpp" line="+354"/> <source>%1 references unknown %2 or %3 element %4.</source> <translation>%1 odkazuje na neznámý prvek %4 (%2 nebo %3).</translation> </message> <message> - <location line="+10"/> <source>%1 references identity constraint %2 that is no %3 or %4 element.</source> <translation>%1 odkazuje na omezení totožnosti %2, které není ani prvek '%3' ani '%4'.</translation> </message> <message> - <location line="+10"/> <source>%1 has a different number of fields from the identity constraint %2 that it references.</source> <translation>U %1 se liší počet polí od omezení totožnosti %2, na kterou odkazuje.</translation> </message> <message> - <location line="+23"/> <source>Base type %1 of %2 element cannot be resolved.</source> <translation>Základní typ %1 prvku %2 nemůže být vyřešen.</translation> </message> <message> - <location line="+84"/> <source>Item type %1 of %2 element cannot be resolved.</source> <translation>Složkový typ %1 prvku %2 nemůže být vyřešen.</translation> </message> <message> - <location line="+31"/> <source>Member type %1 of %2 element cannot be resolved.</source> <translation>Členský typ %1 prvku %2 nemůže být vyřešen.</translation> </message> <message> - <location line="+28"/> - <location line="+408"/> - <location line="+30"/> <source>Type %1 of %2 element cannot be resolved.</source> <translation>Typ %1 prvku %2 nemůže být vyřešen.</translation> </message> <message> - <location line="-416"/> <source>Base type %1 of complex type cannot be resolved.</source> <translation>Základní typ %1 složitého typu nemůže být vyřešen.</translation> </message> <message> - <location line="+9"/> <source>%1 cannot have complex base type that has a %2.</source> <translation>%1 nelze mít žádný složitý základní typ, který má %2.</translation> </message> <message> - <location line="+279"/> <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source> <translation>Model obsahu složitého typu %1 obsahuje prvek %2; nelze jej proto odvodit pomocí rozšíření z ne-prázdného typu.</translation> </message> <message> - <location line="+6"/> <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source> <translation>Složitý typ %1 nemůže být odvozen pomocí rozšíření z %2, neboť poslední obsahuje prvek '%3' ve svém modelu obsahu.</translation> </message> <message> - <location line="+101"/> <source>Type of %1 element must be a simple type, %2 is not.</source> <translation>Typ prvku %1 musí být jednoduchým prvkem, což %2 není.</translation> </message> <message> - <location line="+62"/> <source>Substitution group %1 of %2 element cannot be resolved.</source> <translation>Skupina nahrazení %1 prvku %2 nemůže být vyřešena.</translation> </message> <message> - <location line="+9"/> <source>Substitution group %1 has circular definition.</source> <translation>Skupina nahrazení %1 má v kruzích prováděné vymezení.</translation> </message> <message> - <location line="+120"/> - <location line="+7"/> <source>Duplicated element names %1 in %2 element.</source> <translation>Název prvku %1 se vyskytuje v prvku %2 vícekrát.</translation> </message> <message> - <location line="+29"/> - <location line="+52"/> - <location line="+71"/> - <location line="+28"/> <source>Reference %1 of %2 element cannot be resolved.</source> <translation>Odkaz %1 prvku %2 nemůže být vyřešen.</translation> </message> <message> - <location line="-138"/> <source>Circular group reference for %1.</source> <translation>V kruzích prováděný skupinový odkaz pro %1.</translation> </message> <message> - <location line="+16"/> <source>%1 element is not allowed in this scope</source> <translation>Prvek %1 není v této oblasti dovolen</translation> </message> <message> - <location line="+5"/> <source>%1 element cannot have %2 attribute with value other than %3.</source> <translation>Hodnota vlastnosti %2 prvku %1 může být pouze %3.</translation> </message> <message> - <location line="+8"/> <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source> <translation>Hodnota vlastnosti %2 prvku %1 může být pouze %3 nebo %4.</translation> </message> <message> - <location line="+91"/> <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source> <translation>Vlastnost %1 nebo %2 odkazu %3 neodpovídá prohlášení vlastnosti %4.</translation> </message> <message> - <location line="+25"/> <source>Attribute group %1 has circular reference.</source> <translation>Skupina vlastnosti %1 má kruzích prováděný odkaz.</translation> </message> <message> - <location line="+131"/> <source>%1 attribute in %2 must have %3 use like in base type %4.</source> <translation>Vlastnost %1 v %2 musí mít použití '%3' jako v základním typu %4.</translation> </message> <message> - <location line="+52"/> <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source> <translation>Zástupný symbol vlastnosti (vzor hledání) %1není platným omezením zástupného symbolu vlastnosti (vzoru hledání) základního typu %2.</translation> </message> <message> - <location line="+7"/> <source>%1 has attribute wildcard but its base type %2 has not.</source> <translation>%1 má zástupný symbol vlastnosti (vzor hledání), ale jeho základní typ %2 nemá.</translation> </message> <message> - <location line="+26"/> <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source> <translation>Sjednocení zástupného symbolu vlastnosti (vzoru hledání) typu %1 a zástupného symbolu vlastnosti (vzoru hledání) jeho základního typu %2 není vyjádřitelné.</translation> </message> <message> - <location line="+48"/> <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source> <translation>Výčtová stránka obsahuje neplatný obsah: {%1} není hodnotou typu %2.</translation> </message> <message> - <location line="+10"/> <source>Namespace prefix of qualified name %1 is not defined.</source> <translation>Předpona jmenného prostoru způsobilého názvu %1 není stanovena.</translation> </message> <message> - <location line="+51"/> - <location line="+18"/> <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source> <translation>Prvek %2 (%1) není platným omezením přepisovaného prvku (%3): %4.</translation> </message> <message> - <location filename="../src/xmlpatterns/schema/qxsdtypechecker.cpp" line="+233"/> - <location line="+7"/> - <location line="+21"/> <source>%1 is not valid according to %2.</source> <translation>%1 je podle %2 neplatné.</translation> </message> <message> - <location line="+167"/> <source>String content does not match the length facet.</source> <translation>Obsah řetězce znaků neodpovídá stránce délky.</translation> </message> <message> - <location line="+8"/> <source>String content does not match the minLength facet.</source> <translation>Obsah řetězce znaků neodpovídá stránce délky (nejmenší údaj, 'minLength').</translation> </message> <message> - <location line="+8"/> <source>String content does not match the maxLength facet.</source> <translation>Obsah řetězce znaků neodpovídá stránce délky (největší údaj; 'maxLength').</translation> </message> <message> - <location line="+18"/> <source>String content does not match pattern facet.</source> <translation>Obsah řetězce znaků neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+18"/> <source>String content is not listed in the enumeration facet.</source> <translation>Obsah řetězce znaků není obsažen ve výčtové stránce.</translation> </message> <message> - <location line="+17"/> <source>Signed integer content does not match the maxInclusive facet.</source> <translation>Celočíselná hodnota označená znaménkem neodpovídá stránce 'maxInclusive'.</translation> </message> <message> - <location line="+8"/> <source>Signed integer content does not match the maxExclusive facet.</source> <translation>Celočíselná hodnota označená znaménkem neodpovídá stránce 'maxExclusive'.</translation> </message> <message> - <location line="+8"/> <source>Signed integer content does not match the minInclusive facet.</source> <translation>Celočíselná hodnota označená znaménkem neodpovídá stránce 'minInclusive'.</translation> </message> <message> - <location line="+8"/> <source>Signed integer content does not match the minExclusive facet.</source> <translation>Celočíselná hodnota označená znaménkem neodpovídá stránce 'minExclusive'.</translation> </message> <message> - <location line="+18"/> <source>Signed integer content is not listed in the enumeration facet.</source> <translation>Celočíselná hodnota označená znaménkem není obsažena ve výčtové stránce.</translation> </message> <message> - <location line="+18"/> <source>Signed integer content does not match pattern facet.</source> <translation>Celočíselná hodnota označená znaménkem neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+9"/> <source>Signed integer content does not match in the totalDigits facet.</source> <translation>Celočíselná hodnota označená znaménkem neodpovídá stránce 'totalDigits'.</translation> </message> <message> - <location line="+17"/> <source>Unsigned integer content does not match the maxInclusive facet.</source> <translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce 'maxInclusive'.</translation> </message> <message> - <location line="+8"/> <source>Unsigned integer content does not match the maxExclusive facet.</source> <translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce 'maxExclusive'.</translation> </message> <message> - <location line="+8"/> <source>Unsigned integer content does not match the minInclusive facet.</source> <translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce 'minInclusive'.</translation> </message> <message> - <location line="+8"/> <source>Unsigned integer content does not match the minExclusive facet.</source> <translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce 'minExclusive'.</translation> </message> <message> - <location line="+18"/> <source>Unsigned integer content is not listed in the enumeration facet.</source> <translation>Celočíselná hodnota jsoucí bez znaménka není obsažena ve výčtové stránce.</translation> </message> <message> - <location line="+18"/> <source>Unsigned integer content does not match pattern facet.</source> <translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+9"/> <source>Unsigned integer content does not match in the totalDigits facet.</source> <translation>Celočíselná hodnota jsoucí bez znaménka neodpovídá stránce 'totalDigits'.</translation> </message> <message> - <location line="+17"/> <source>Double content does not match the maxInclusive facet.</source> <translation>Číslo s pohyblivou čárkou neodpovídá stránce 'maxInclusive'.</translation> </message> <message> - <location line="+8"/> <source>Double content does not match the maxExclusive facet.</source> <translation>Číslo s pohyblivou čárkou neodpovídá stránce 'maxExclusive'.</translation> </message> <message> - <location line="+8"/> <source>Double content does not match the minInclusive facet.</source> <translation>Číslo s pohyblivou čárkou neodpovídá stránce 'minInclusive'.</translation> </message> <message> - <location line="+8"/> <source>Double content does not match the minExclusive facet.</source> <translation>Číslo s pohyblivou čárkou neodpovídá stránce 'minExclusive'.</translation> </message> <message> - <location line="+18"/> <source>Double content is not listed in the enumeration facet.</source> <translation>Číslo s pohyblivou čárkou není obsaženo ve výčtové stránce.</translation> </message> <message> - <location line="+18"/> <source>Double content does not match pattern facet.</source> <translation>Číslo s pohyblivou čárkou neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+18"/> <source>Decimal content does not match in the fractionDigits facet.</source> <translation>Desetinné číslo neodpovídá stránce 'fractionDigits'.</translation> </message> <message> - <location line="+9"/> <source>Decimal content does not match in the totalDigits facet.</source> <translation>Desetinné číslo neodpovídá stránce 'totalDigits'.</translation> </message> <message> - <location line="+14"/> <source>Date time content does not match the maxInclusive facet.</source> <translation>Údaj o datu neodpovídá stránce 'maxInclusive'.</translation> </message> <message> - <location line="+8"/> <source>Date time content does not match the maxExclusive facet.</source> <translation>Údaj o datu neodpovídá stránce 'maxExclusive'.</translation> </message> <message> - <location line="+8"/> <source>Date time content does not match the minInclusive facet.</source> <translation>Údaj o datu neodpovídá stránce 'minInclusive'.</translation> </message> <message> - <location line="+8"/> <source>Date time content does not match the minExclusive facet.</source> <translation>Údaj o datu neodpovídá stránce 'minExclusive'.</translation> </message> <message> - <location line="+18"/> <source>Date time content is not listed in the enumeration facet.</source> <translation>Údaj o datu není obsažen ve výčtové stránce.</translation> </message> <message> - <location line="+18"/> <source>Date time content does not match pattern facet.</source> <translation>Údaj o datu neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+15"/> <source>Duration content does not match the maxInclusive facet.</source> <translation>Údaj o době trvání neodpovídá stránce 'maxInclusive'.</translation> </message> <message> - <location line="+9"/> <source>Duration content does not match the maxExclusive facet.</source> <translation>Údaj o době trvání neodpovídá stránce 'maxExclusive'.</translation> </message> <message> - <location line="+9"/> <source>Duration content does not match the minInclusive facet.</source> <translation>Údaj o době trvání neodpovídá stránce 'minInclusive'.</translation> </message> <message> - <location line="+9"/> <source>Duration content does not match the minExclusive facet.</source> <translation>Údaj o době trvání neodpovídá stránce 'minExclusive'.</translation> </message> <message> - <location line="+18"/> <source>Duration content is not listed in the enumeration facet.</source> <translation>Údaj o době trvání není obsažen ve výčtové stránce.</translation> </message> <message> - <location line="+18"/> <source>Duration content does not match pattern facet.</source> <translation>Údaj o době trvání neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+27"/> <source>Boolean content does not match pattern facet.</source> <translation>Booleánská hodnota neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+17"/> <source>Binary content does not match the length facet.</source> <translation>Binární obsah neodpovídá stránce délky.</translation> </message> <message> - <location line="+8"/> <source>Binary content does not match the minLength facet.</source> <translation>Binární obsah neodpovídá stránce 'minLength'.</translation> </message> <message> - <location line="+8"/> <source>Binary content does not match the maxLength facet.</source> <translation>Binární obsah neodpovídá stránce 'maxLength'.</translation> </message> <message> - <location line="+18"/> <source>Binary content is not listed in the enumeration facet.</source> <translation>Binární obsah není obsažen ve výčtové stránce.</translation> </message> <message> - <location line="+27"/> <source>Invalid QName content: %1.</source> <translation>Obsah způsobilého názvu ('QName') je neplatný: %1.</translation> </message> <message> - <location line="+17"/> <source>QName content is not listed in the enumeration facet.</source> <translation>Obsah způsobilého názvu ('QName') není obsažen ve výčtové stránce.</translation> </message> <message> - <location line="+18"/> <source>QName content does not match pattern facet.</source> <translation>Obsah způsobilého názvu ('QName') neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+36"/> <source>Notation content is not listed in the enumeration facet.</source> <translation>Obsah zápisu není obsažen ve výčtové stránce.</translation> </message> <message> - <location line="+19"/> <source>List content does not match length facet.</source> <translation>Obsah seznamu neodpovídá stránce délky.</translation> </message> <message> - <location line="+7"/> <source>List content does not match minLength facet.</source> <translation>Obsah seznamu neodpovídá stránce 'minLength'.</translation> </message> <message> - <location line="+7"/> <source>List content does not match maxLength facet.</source> <translation>Obsah seznamu neodpovídá stránce 'maxLength'.</translation> </message> <message> - <location line="+90"/> <source>List content is not listed in the enumeration facet.</source> <translation>Obsah seznamu není obsažen ve výčtové stránce.</translation> </message> <message> - <location line="+18"/> <source>List content does not match pattern facet.</source> <translation>Obsah seznamu neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+39"/> <source>Union content is not listed in the enumeration facet.</source> <translation>Obsah sjednocení není obsažen ve výčtové stránce.</translation> </message> <message> - <location line="+18"/> <source>Union content does not match pattern facet.</source> <translation>Obsah sjednocení neodpovídá stránce vzoru pro hledání.</translation> </message> <message> - <location line="+15"/> <source>Data of type %1 are not allowed to be empty.</source> <translation>Data typu %1 nemohou být prázdná.</translation> </message> <message> - <location filename="../src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp" line="+160"/> <source>Element %1 is missing child element.</source> <translation>U prvku %1 chybí podprvek.</translation> </message> <message> - <location line="+16"/> <source>There is one IDREF value with no corresponding ID: %1.</source> <translation>Existuje hodnota IDREF, pro kterou neexistuje příslušné ID: %1.</translation> </message> <message> - <location line="+27"/> <source>Loaded schema file is invalid.</source> <translation>Nahraný soubor se schématem je neplatný.</translation> </message> <message> - <location line="+16"/> <source>%1 contains invalid data.</source> <translation>%1 obsahuje neplatná data.</translation> </message> <message> - <location line="+13"/> <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source> <translation>Jmenný prostor xsi:schemaLocation %1 byl již dříve v případovém dokumentu stanoven.</translation> </message> <message> - <location line="+22"/> <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source> <translation>xsi:noNamespaceSchemaLocation se nemůže objevit po prvním prvku nebo vlastnosti bez jmenného prostoru.</translation> </message> <message> - <location line="+18"/> <source>No schema defined for validation.</source> <translation>Pro schválení není stanoveno žádné schéma.</translation> </message> <message> - <location line="+10"/> <source>No definition for element %1 available.</source> <translation>Pro prvek %1 není dostupné žádné vymezení.</translation> </message> <message> - <location line="+18"/> - <location line="+49"/> - <location line="+142"/> <source>Specified type %1 is not known to the schema.</source> <translation>Zadaný typ %1 není ve schématu stanoven.</translation> </message> <message> - <location line="-176"/> <source>Element %1 is not defined in this scope.</source> <translation>Prvek %1 není v této oblasti stanoven.</translation> </message> <message> - <location line="+43"/> <source>Declaration for element %1 does not exist.</source> <translation>Pro prvek %1 není dostupné žádné prohlášení.</translation> </message> <message> - <location line="+12"/> <source>Element %1 contains invalid content.</source> <translation>Prvek %1 obsahuje neplatný obsah.</translation> </message> <message> - <location line="+73"/> <source>Element %1 is declared as abstract.</source> <translation>Prvek %1 je prohlášen jako abstraktní.</translation> </message> <message> - <location line="+7"/> <source>Element %1 is not nillable.</source> <translation>Prvek %1 nemá zadánu vlastnost 'nillable'.</translation> </message> <message> - <location line="+8"/> <source>Attribute %1 contains invalid data: %2</source> <translation>Vlastnost %1 obsahuje neplatná data: %2</translation> </message> <message> - <location line="+8"/> <source>Element contains content although it is nillable.</source> <translation>Prvek má obsah, ačkoli je 'nillable'.</translation> </message> <message> - <location line="+6"/> - <source>Fixed value constrained not allowed if element is nillable.</source> + <source>Fixed value constraint not allowed if element is nillable.</source> <translation>Pevné omezení hodnoty není dovoleno, pokud je prvek 'nillable'.</translation> </message> <message> - <location line="+32"/> + <source>Element %1 cannot contain other elements, as it has a fixed content.</source> + <translation>Prvek %1 nesmí obsahovat žádné jiné prvky, protože má pevný obsah.</translation> + </message> + <message> + <source>Fixed value constrained not allowed if element is nillable.</source> + <translation type="obsolete">Pevné omezení hodnoty není dovoleno, pokud je prvek 'nillable'.</translation> + </message> + <message> <source>Specified type %1 is not validly substitutable with element type %2.</source> <translation>Zadaný typ %1 není platně nahraditelný typem prvku %2.</translation> </message> <message> - <location line="+23"/> <source>Complex type %1 is not allowed to be abstract.</source> <translation>Složitý typ %1 nemůže být abstraktní.</translation> </message> <message> - <location line="+21"/> <source>Element %1 contains not allowed attributes.</source> <translation>Prvek %1 obsahuje nepřípustné vlastnosti.</translation> </message> <message> - <location line="+6"/> - <location line="+97"/> <source>Element %1 contains not allowed child element.</source> <translation>Prvek %1 obsahuje nepřípustný podprvek.</translation> </message> <message> - <location line="-76"/> - <location line="+93"/> <source>Content of element %1 does not match its type definition: %2.</source> <translation>Obsah prvku %1 neodpovídá vymezení svého typu: %2.</translation> </message> <message> - <location line="-85"/> - <location line="+92"/> - <location line="+41"/> <source>Content of element %1 does not match defined value constraint.</source> <translation>Obsah prvku %1 neodpovídá stanovenému omezení hodnoty.</translation> </message> <message> - <location line="-73"/> <source>Element %1 contains not allowed child content.</source> <translation>Prvek %1 obsahuje nepřípustný podobsah.</translation> </message> <message> - <location line="+41"/> <source>Element %1 contains not allowed text content.</source> <translation>Prvek %1 obsahuje nepřípustný textový obsah.</translation> </message> <message> - <location line="+18"/> <source>Element %1 can not contain other elements, as it has a fixed content.</source> - <translation>Prvek %1 nesmí obsahovat žádné podprvky, protože má pevný obsah.</translation> + <translation type="obsolete">Prvek %1 nesmí obsahovat žádné podprvky, protože má pevný obsah.</translation> </message> <message> - <location line="+43"/> <source>Element %1 is missing required attribute %2.</source> <translation>U prvkuk %1 chybí vyžadovaná vlastnost %2.</translation> </message> <message> - <location line="+29"/> <source>Attribute %1 does not match the attribute wildcard.</source> <translation>Vlastnost %1 neodpovídá zástupnému symbolu (vzoru hledání) vlastnosti.</translation> </message> <message> - <location line="+9"/> <source>Declaration for attribute %1 does not exist.</source> <translation>Pro vlastnost %1 není dostupné žádné prohlášení.</translation> </message> <message> - <location line="+6"/> <source>Element %1 contains two attributes of type %2.</source> <translation>Prvek %1 obsahuje dvě vlastnosti typu %2.</translation> </message> <message> - <location line="+11"/> <source>Attribute %1 contains invalid content.</source> <translation>Vlastnost %1 obsahuje neplatný obsah.</translation> </message> <message> - <location line="+7"/> <source>Element %1 contains unknown attribute %2.</source> <translation>Prvek %1 obsahuje neznámou vlastnost %2.</translation> </message> <message> - <location line="+40"/> - <location line="+46"/> <source>Content of attribute %1 does not match its type definition: %2.</source> <translation>Obsah vlastnosti %1 neodpovídá vymezení svého typu: %2.</translation> </message> <message> - <location line="-38"/> - <location line="+46"/> <source>Content of attribute %1 does not match defined value constraint.</source> <translation>Obsah vlastnosti %1 neodpovídá stanovenému omezení hodnoty.</translation> </message> <message> - <location line="+88"/> <source>Non-unique value found for constraint %1.</source> <translation>Pro omezení %1 byla nalezena ne jednoznačně stanovená hodnota.</translation> </message> <message> - <location line="+20"/> <source>Key constraint %1 contains absent fields.</source> <translation>Omezení klíče %1 obsahuje nepřítomná pole.</translation> </message> <message> - <location line="+18"/> <source>Key constraint %1 contains references nillable element %2.</source> <translation>Omezení klíče %1 obsahuje odkazy na prvek %2, který je 'nillable'.</translation> </message> <message> - <location line="+40"/> <source>No referenced value found for key reference %1.</source> <translation>Odkazovanou hodnotu odkazu na klíč %1 se nepodařilo najít.</translation> </message> <message> - <location line="+64"/> <source>More than one value found for field %1.</source> <translation>Pro pole %1 bylo nalezeno více hodnot.</translation> </message> <message> - <location line="+20"/> <source>Field %1 has no simple type.</source> <translation>Pole %1 nemá žádný jednoduchý typ.</translation> </message> <message> - <location line="+73"/> <source>ID value '%1' is not unique.</source> <translation>Hodnota ID %1 není jednoznačná.</translation> </message> <message> - <location line="+11"/> <source>'%1' attribute contains invalid QName content: %2.</source> <translation>Vlastnost %1 obsahuje neplatný způsobilý název: %2.</translation> </message> diff --git a/translations/qt_help_cs.ts b/translations/qt_help_cs.ts old mode 100644 new mode 100755 index 15836f1..6e425d6 --- a/translations/qt_help_cs.ts +++ b/translations/qt_help_cs.ts @@ -4,80 +4,72 @@ <context> <name>QCLuceneResultWidget</name> <message> - <location filename="../tools/assistant/lib/qhelpsearchresultwidget.cpp" line="+110"/> <source>Search Results</source> <translation>Výsledky hledání</translation> </message> <message> - <location line="+7"/> <source>Note:</source> <translation>Poznámka:</translation> </message> <message> - <location line="+1"/> <source>The search results may not be complete since the documentation is still being indexed!</source> <translation>Nemusí být ukázány všechny výsledky, protože dokumentace je stále ještě rejstříkována!</translation> </message> <message> - <location line="+11"/> <source>Your search did not match any documents.</source> <translation>Nebyly nalezeny žádné dokumenty, které by odpovídaly vašemu hledání.</translation> </message> <message> - <location line="+4"/> <source>(The reason for this might be that the documentation is still being indexed.)</source> <translation>(Důvodem pro to by mohlo být, že dokumentace je stále ještě rejstříkována.)</translation> </message> </context> <context> + <name>QHelp</name> + <message> + <source>Untitled</source> + <translation>Bez názvu</translation> + </message> +</context> +<context> <name>QHelpCollectionHandler</name> <message> <source>The collection file is not set up yet!</source> <translation type="obsolete">Soubor se sbírkou ještě není zřízen!</translation> </message> <message> - <location filename="../tools/assistant/lib/qhelpcollectionhandler.cpp" line="+79"/> <source>The collection file '%1' is not set up yet!</source> <translation>Soubor se sbírkou '%1' ještě není zřízen!</translation> </message> <message> - <location line="+23"/> <source>Cannot load sqlite database driver!</source> <translation>Databázový ovladač pro SQLite nelze nahrát!</translation> </message> <message> - <location line="+11"/> - <location line="+49"/> <source>Cannot open collection file: %1</source> <translation>Nelze otevřít soubor se sbírkou: %1</translation> </message> <message> - <location line="-40"/> <source>Cannot create tables in file %1!</source> <translation>V souboru %1 nelze vytvořit žádné tabulky!</translation> </message> <message> - <location line="+16"/> <source>The collection file '%1' already exists!</source> <translation>Soubor se sbírkou '%1' již existuje!</translation> </message> <message> - <location line="+148"/> <source>Unknown filter '%1'!</source> <translation>Neznámý filtr '%1'!</translation> </message> <message> - <location line="+105"/> <source>Invalid documentation file '%1'!</source> <translation>Neplatný soubor s dokumentací '%1'!</translation> </message> <message> - <location line="+167"/> <source>Cannot register namespace '%1'!</source> <translation>Nelze zapsat jmenný prostor %1!</translation> </message> <message> - <location line="+24"/> <source>Cannot open database '%1' to optimize!</source> <translation>Databázi '%1' nelze otevřít pro vyladění!</translation> </message> @@ -86,12 +78,10 @@ <translation type="obsolete">Zadaný soubor se sbírkou již existuje!</translation> </message> <message> - <location line="-438"/> <source>Cannot create directory: %1</source> <translation>Nelze vytvořit adresář: %1</translation> </message> <message> - <location line="+23"/> <source>Cannot copy collection file: %1</source> <translation>Nelze kopírovat soubor se sbírkou: %1</translation> </message> @@ -100,12 +90,10 @@ <translation type="obsolete">Neznámý filtr!</translation> </message> <message> - <location line="+174"/> <source>Cannot register filter %1!</source> <translation>Nelze zapsat filtr %1!</translation> </message> <message> - <location line="+44"/> <source>Cannot open documentation file %1!</source> <translation>Nelze otevřít soubor s dokumentací: %1!</translation> </message> @@ -114,12 +102,10 @@ <translation type="obsolete">Neplatný soubor s dokumentací!</translation> </message> <message> - <location line="+40"/> <source>The namespace %1 was not registered!</source> <translation>Jmenný prostor %1 nebyl zapsán!</translation> </message> <message> - <location line="+120"/> <source>Namespace %1 already exists!</source> <translation>Jmenný prostor %1 již existuje!</translation> </message> @@ -135,7 +121,6 @@ <context> <name>QHelpDBReader</name> <message> - <location filename="../tools/assistant/lib/qhelpdbreader.cpp" line="+98"/> <source>Cannot open database '%1' '%2': %3</source> <extracomment>The placeholders are: %1 - The name of the database which cannot be opened %2 - The unique id for the connection %3 - The actual error string</extracomment> <translation>Databázi nelze otevřít: '%1' '%2': %3</translation> @@ -144,7 +129,10 @@ <context> <name>QHelpEngineCore</name> <message> - <location filename="../tools/assistant/lib/qhelpenginecore.cpp" line="+524"/> + <source>Cannot open documentation file %1: %2!</source> + <translation>Nelze otevřít soubor s dokumentací %1: %2!</translation> + </message> + <message> <source>The specified namespace does not exist!</source> <translation>Zadaný jmenný prostor neexistuje!</translation> </message> @@ -152,181 +140,210 @@ <context> <name>QHelpEngineCorePrivate</name> <message> - <location line="-402"/> <source>Cannot open documentation file %1: %2!</source> - <translation>Nelze otevřít soubor s dokumentací %1: %2!</translation> + <translation type="obsolete">Nelze otevřít soubor s dokumentací %1: %2!</translation> </message> </context> <context> <name>QHelpGenerator</name> <message> - <location filename="../tools/assistant/lib/qhelpgenerator.cpp" line="+157"/> <source>Invalid help data!</source> <translation>Neplatná data s nápovědou!</translation> </message> <message> - <location line="+6"/> <source>No output file name specified!</source> <translation>Pro výstupní soubor nebyl zadán žádný název!</translation> </message> <message> - <location line="+14"/> <source>Building up file structure...</source> <translation>Vytváří se uspořádání souboru...</translation> </message> <message> - <location line="-7"/> <source>The file %1 cannot be overwritten!</source> <translation>Soubor %1 nelze přepsat!</translation> </message> <message> - <location line="+18"/> <source>Cannot open data base file %1!</source> <translation>Nelze otevřít soubor s databází: %1!</translation> </message> <message> - <location line="+11"/> <source>Cannot register namespace %1!</source> <translation>Nelze zapsat jmenný prostor %1!</translation> </message> <message> - <location line="+6"/> <source>Insert custom filters...</source> <translation>Vložit uživatelsky stanovené filtry...</translation> </message> <message> - <location line="+12"/> <source>Insert help data for filter section (%1 of %2)...</source> <translation>Vložit data s nápovědou pro oddělení s filtrem (%1 von %2) einfügen...</translation> </message> <message> - <location line="+18"/> <source>Documentation successfully generated.</source> <translation>Dokumentace byla úspěšně vytvořena.</translation> </message> <message> - <location line="+76"/> <source>Some tables already exist!</source> <translation>Některé tabulky již existují!</translation> </message> <message> - <location line="+61"/> <source>Cannot create tables!</source> <translation>Tabulky nelze vytvořit!</translation> </message> <message> - <location line="+86"/> <source>Cannot register virtual folder!</source> <translation>Virtuální adresář nelze zapsat!</translation> </message> <message> - <location line="+10"/> <source>Insert files...</source> <translation>Vložit soubory...</translation> </message> <message> - <location line="+42"/> <source>The referenced file %1 must be inside or within a subdirectory of (%2). Skipping it.</source> <translation>Odkazovaný soubor %1 se musí nacházet v adresáři %2 nebo v jeho podadresáři. Přeskakuje se.</translation> </message> <message> - <location line="+7"/> <source>The file %1 does not exist! Skipping it.</source> <translation>Soubor %1 neexistuje! Přeskakuje se.</translation> </message> <message> - <location line="+6"/> <source>Cannot open file %1! Skipping it.</source> <translation>Soubor %1 nelze otevřít! Přeskakuje se.</translation> </message> <message> - <location line="+131"/> <source>The filter %1 is already registered!</source> <translation>Filtr %1 je již zapsán!</translation> </message> <message> - <location line="+5"/> <source>Cannot register filter %1!</source> <translation>Nelze zapsat filtr %1!</translation> </message> <message> - <location line="+24"/> <source>Insert indices...</source> <translation>Vložit rejstříky...</translation> </message> <message> - <location line="+80"/> <source>Insert contents...</source> <translation>Vložit obsah...</translation> </message> <message> - <location line="+8"/> <source>Cannot insert contents!</source> <translation>Obsah nelze vložit!</translation> </message> <message> - <location line="+12"/> <source>Cannot register contents!</source> <translation>Obsah nelze zapsat!</translation> </message> + <message> + <source>File '%1' does not exist.</source> + <translation>Soubor '%1' neexistuje.</translation> + </message> + <message> + <source>File '%1' cannot be opened.</source> + <translation>Soubor '%1' nelze otevřít.</translation> + </message> + <message> + <source>File '%1' contains an invalid link to file '%2'</source> + <translation>Soubor '%1' obsahuje neplatný odkaz na soubor '%2'</translation> + </message> + <message> + <source>Invalid links in HTML files.</source> + <translation>Neplatné odkazy v souborech HTML.</translation> + </message> +</context> +<context> + <name>QHelpProject</name> + <message> + <source>Unknown token.</source> + <translation>Neznámý symbol.</translation> + </message> + <message> + <source>Unknown token. Expected "QtHelpProject"!</source> + <translation>Neznámý symbol. Byl očekáván "QtHelpProject"!</translation> + </message> + <message> + <source>Error in line %1: %2</source> + <translation>Chyba na řádku %1: %2</translation> + </message> + <message> + <source>Virtual folder has invalid syntax.</source> + <translation>Virtuální složka má neplatnou skladbu.</translation> + </message> + <message> + <source>Namespace has invalid syntax.</source> + <translation>Jmenný prostor má neplatnou skladbu.</translation> + </message> + <message> + <source>Missing namespace in QtHelpProject.</source> + <translation>Chybějící jmenný prostor QtHelpProject.</translation> + </message> + <message> + <source>Missing virtual folder in QtHelpProject</source> + <translation>Chybějící virtuální složka v QtHelpProject.</translation> + </message> + <message> + <source>Missing attribute in keyword at line %1.</source> + <translation>Chybějící vlastnost v klíčovém slově na řádku %1.</translation> + </message> + <message> + <source>The input file %1 could not be opened!</source> + <translation>Vstupní soubor %1 se nepodařilo otevřít!</translation> + </message> </context> <context> <name>QHelpSearchQueryWidget</name> <message> - <location filename="../tools/assistant/lib/qhelpsearchquerywidget.cpp" line="+411"/> <source>Search for:</source> <translation>Hledat:</translation> </message> <message> - <location line="+5"/> <source>Previous search</source> <translation>Předchozí hledání</translation> </message> <message> - <location line="+4"/> <source>Next search</source> <translation>Další hledání</translation> </message> <message> - <location line="+2"/> <source>Search</source> <translation>Hledat</translation> </message> <message> - <location line="+20"/> <source>Advanced search</source> <translation>Rozšířené hledání</translation> </message> <message> - <location line="+18"/> <source>words <B>similar</B> to:</source> <translation>Slova <B>podobná</B>:</translation> </message> <message> - <location line="+6"/> <source><B>without</B> the words:</source> <translation><B>beze</B> slov:</translation> </message> <message> - <location line="+6"/> <source>with <B>exact phrase</B>:</source> <translation>s <B>přesnou skupinou slov</B>:</translation> </message> <message> - <location line="+6"/> <source>with <B>all</B> of the words:</source> <translation>se <B>všemi</B> slovy:</translation> </message> <message> - <location line="+6"/> <source>with <B>at least one</B> of the words:</source> <translation>s <B>jakýmkoli</B> ze slov:</translation> </message> </context> <context> <name>QHelpSearchResultWidget</name> + <message numerus="yes"> + <source>%1 - %2 of %n Hits</source> + <translation> + <numerusform>%1 - %2 - jeden zásah</numerusform> + <numerusform>%1 - %2 ze %n zásahů</numerusform> + <numerusform>%1 - %2 z %n zásahů</numerusform> + </translation> + </message> <message> - <location filename="../tools/assistant/lib/qhelpsearchresultwidget.cpp" line="+235"/> <source>0 - 0 of 0 Hits</source> <translation>0 - 0 z 0 zásahů</translation> </message> @@ -334,62 +351,51 @@ <context> <name>QHelpSearchResultWidgetPrivate</name> <message> - <location line="-61"/> <source>%1 - %2 of %3 Hits</source> - <translation>%1 - %2 z %3 zásahů</translation> + <translation type="obsolete">%1 - %2 z %3 zásahů</translation> </message> </context> <context> <name>QObject</name> <message> - <location filename="../tools/assistant/lib/qhelp_global.h" line="+83"/> <source>Untitled</source> - <translation>Bez názvu</translation> + <translation type="obsolete">Bez názvu</translation> </message> <message> - <location filename="../tools/assistant/lib/qhelpprojectdata.cpp" line="+85"/> <source>Unknown token.</source> - <translation>Neznámý symbol.</translation> + <translation type="obsolete">Neznámý symbol.</translation> </message> <message> - <location line="+13"/> <source>Unknown token. Expected "QtHelpProject"!</source> - <translation>Neznámý symbol. Byl očekáván "QtHelpProject"!</translation> + <translation type="obsolete">Neznámý symbol. Byl očekáván "QtHelpProject"!</translation> </message> <message> - <location line="+5"/> <source>Error in line %1: %2</source> - <translation>Chyba na řádku %1: %2</translation> + <translation type="obsolete">Chyba na řádku %1: %2</translation> </message> <message> - <location line="+13"/> <source>A virtual folder must not contain a '/' character!</source> - <translation>Virtuální složka nesmí obsahovat znak '/'!</translation> + <translation type="obsolete">Virtuální složka nesmí obsahovat znak '/'!</translation> </message> <message> - <location line="+4"/> <source>A namespace must not contain a '/' character!</source> - <translation>Jmenný prostor nesmí obsahovat znak '/'!</translation> + <translation type="obsolete">Jmenný prostor nesmí obsahovat znak '/'!</translation> </message> <message> - <location line="+16"/> <source>Missing namespace in QtHelpProject.</source> - <translation>Chybějící jmenný prostor QtHelpProject.</translation> + <translation type="obsolete">Chybějící jmenný prostor QtHelpProject.</translation> </message> <message> - <location line="+2"/> <source>Missing virtual folder in QtHelpProject</source> - <translation>Chybějící virtuální složka v QtHelpProject.</translation> + <translation type="obsolete">Chybějící virtuální složka v QtHelpProject.</translation> </message> <message> - <location line="+88"/> <source>Missing attribute in keyword at line %1.</source> - <translation>Chybějící vlastnost v klíčovém slově na řádku %1.</translation> + <translation type="obsolete">Chybějící vlastnost v klíčovém slově na řádku %1.</translation> </message> <message> - <location line="+123"/> <source>The input file %1 could not be opened!</source> - <translation>Vstupní soubor %1 se nepodařilo otevřít!</translation> + <translation type="obsolete">Vstupní soubor %1 se nepodařilo otevřít!</translation> </message> </context> </TS> -- cgit v0.12 From b668857b3749b39c3a61e0a25e750740b74df552 Mon Sep 17 00:00:00 2001 From: Robert Griebl <robert.griebl@nokia.com> Date: Mon, 24 Jan 2011 23:21:44 +0100 Subject: Fixed spelling. Reviewed-by: TrustMe --- src/gui/util/qscroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp index 815b3d1..d60f44e 100644 --- a/src/gui/util/qscroller.cpp +++ b/src/gui/util/qscroller.cpp @@ -1012,7 +1012,7 @@ QPointF QScrollerPrivate::realDpi(int screen) // as 2 screens in QDesktopWidget, but libXRandR will only see 1 screen. // (although with the combined size of the Xinerama screens). // Additionally, libXrandr will simply crash when calling XRRSizes - // for (the non-existant) screen 1 in this scenario. + // for (the non-existent) screen 1 in this scenario. Window root = RootWindow(X11->display, screen == -1 ? X11->defaultScreen : screen); int randrscreen = (root != XNone) ? X11->ptrXRRRootToScreen(X11->display, root) : -1; -- cgit v0.12 From cfb7c16d738993fc8a594361f4bdf10e24fa754a Mon Sep 17 00:00:00 2001 From: Alessandro Portale <alessandro.portale@nokia.com> Date: Mon, 24 Jan 2011 21:43:03 +0100 Subject: Avoid possible font name collisions on fbserv QTBUG-6611 implemented the long awaited app font support on Symbian. One of the problems with the underlying Symbian Api for font loading is that all fonts go into one system wide font store on fbserv. All fonts are visible to and accessible by every application. And there is no way to find out if a font is an app font and whose process' app font it is. If a font with a certain family name is already loaded on fbserv, no other application can load its font with the same family name. If two applications access the same font, bad things can happen (details: QTBUG-16514). This patch works around naming collisions on the fbserv. It also prevents Qt applications from using other Qt applications' app fonts. It does so by "marking" the name of the temporary ttf file before the file gets loaded by fbserv. All font name strings in the font's 'name' table get a marker string appended. The marker is composed by a "Q", the uid3, and on Symbian^3|PR1&below the pid. The marker length is four characters. When the QFontDatabase is populated, all own app font names are cleand from the marker, so that the Qt app can use the original font name. Other applications' app fonts are detected and filtered out of the own font database. Symbian's font Api supports only 24 characters as names for font families. The name marker reduces the effective characters to 20. The reduced name length is documented for QFontDatabase::addApplication[FontFromData] as a note. Since the app font feature is much safer now, it got re-enabled for Symbian^1 and below by reverting 25ac59fcf1bb03c9af9a2c967218c96c7c77361a . Task-number: QTBUG-16514 --- src/gui/text/qfontdatabase.cpp | 4 + src/gui/text/qfontdatabase_s60.cpp | 357 ++++++++++++++++++++++++++++++++++--- src/gui/text/qfontengine_s60.cpp | 5 +- 3 files changed, 343 insertions(+), 23 deletions(-) diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 637957d..6b612eb 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -2543,6 +2543,8 @@ bool QFontDatabasePrivate::isApplicationFont(const QString &fileName) \note Adding application fonts on Unix/X11 platforms without fontconfig is currently not supported. + \note On Symbian, the font family names get truncated to a length of 20 characters. + \sa addApplicationFontFromData(), applicationFontFamilies(), removeApplicationFont() */ int QFontDatabase::addApplicationFont(const QString &fileName) @@ -2573,6 +2575,8 @@ int QFontDatabase::addApplicationFont(const QString &fileName) \bold{Note:} Adding application fonts on Unix/X11 platforms without fontconfig is currently not supported. + \note On Symbian, the font family names get truncated to a length of 20 characters. + \sa addApplicationFont(), applicationFontFamilies(), removeApplicationFont() */ int QFontDatabase::addApplicationFontFromData(const QByteArray &fontData) diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp index 06462c4..ad67189 100644 --- a/src/gui/text/qfontdatabase_s60.cpp +++ b/src/gui/text/qfontdatabase_s60.cpp @@ -46,6 +46,7 @@ #include "qabstractfileengine.h" #include "qdesktopservices.h" #include "qtemporaryfile.h" +#include "qtextcodec.h" #include <private/qpixmap_s60_p.h> #include <private/qt_s60_p.h> #include "qendian.h" @@ -152,10 +153,11 @@ public: mutable QList<const QSymbianTypeFaceExtras *> m_extras; mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash; + mutable QSet<QString> m_applicationFontFamilies; }; const QString QSymbianFontDatabaseExtrasImplementation::appFontMarkerPrefix = - QLatin1String("qaf"); + QLatin1String("Q"); inline QString QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder() { @@ -166,21 +168,60 @@ QString QSymbianFontDatabaseExtrasImplementation::appFontMarker() { static QString result; if (result.isEmpty()) { - const quint32 uid = RProcess().Type().MostDerived().iUid; - quint16 crossSum = static_cast<quint16>(uid + (uid >> 16)); - if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) { + quint16 id = 0; + if (QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) { + // We are allowed to load app fonts even from previous, crashed runs + // of this application, since we can access the font tables. + const quint32 uid = RProcess().Type().MostDerived().iUid; + id = static_cast<quint16>(uid + (uid >> 16)); + } else { // If no font table Api is available, we must not even load a font // from a previous (crashed) run of this application. Reason: we // won't get the font tables, they are not in the CFontStore. - // So, we add the pid to the uniqueness of the marker. - const quint32 pid = static_cast<quint32>(RProcess().Id().Id()); - crossSum += static_cast<quint16>(pid + (pid >> 16)); + // So, we use the pid, for more uniqueness. + id = static_cast<quint16>(RProcess().Id().Id()); } - result = appFontMarkerPrefix + QString::number(crossSum, 16); + result = appFontMarkerPrefix + QString::fromLatin1("%1").arg(id & 0x7fff, 3, 32, QLatin1Char('0')); + Q_ASSERT(appFontMarkerPrefix.length() == 1 && result.length() == 4); } return result; } +static inline bool qt_symbian_fontNameHasAppFontMarker(const QString &fontName) +{ + const int idLength = 3; // Keep in sync with id length in appFontMarker(). + const QString &prefix = QSymbianFontDatabaseExtrasImplementation::appFontMarkerPrefix; + if (fontName.length() < prefix.length() + idLength + || fontName.mid(fontName.length() - idLength - prefix.length(), prefix.length()) != prefix) + return false; + // Testing if the the id is base32 data + for (int i = fontName.length() - idLength; i < fontName.length(); ++i) { + const QChar &c = fontName.at(i); + if (!(c >= QLatin1Char('0') && c <= QLatin1Char('9') + || c >= QLatin1Char('a') && c <= QLatin1Char('v'))) + return false; + } + return true; +} + +// If fontName is an application font of this app, prepend the app font marker +QString qt_symbian_fontNameWithAppFontMarker(const QString &fontName) +{ + QFontDatabasePrivate *db = privateDb(); + Q_ASSERT(db); + const QSymbianFontDatabaseExtrasImplementation *dbExtras = + static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras); + return dbExtras->m_applicationFontFamilies.contains(fontName) ? + fontName + QSymbianFontDatabaseExtrasImplementation::appFontMarker() + : fontName; +} + +static inline QString qt_symbian_appFontNameWithoutMarker(const QString &markedFontName) +{ + return markedFontName.left(markedFontName.length() + - QSymbianFontDatabaseExtrasImplementation::appFontMarker().length()); +} + QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementation() { if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) { @@ -276,9 +317,10 @@ COpenFont* OpenFontFromBitmapFont(const CBitmapFont* aBitmapFont) } #endif // FNTSTORE_H_INLINES_SUPPORT_FMM -const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(const QString &typeface, +const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(const QString &aTypeface, bool bold, bool italic) const { + const QString typeface = qt_symbian_fontNameWithAppFontMarker(aTypeface); const QString searchKey = typeface + QString::number(int(bold)) + QString::number(int(italic)); if (!m_extrasHash.contains(searchKey)) { TFontSpec searchSpec(qt_QString2TPtrC(typeface), 1); @@ -331,6 +373,8 @@ void QSymbianFontDatabaseExtrasImplementation::removeAppFontData( if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable() && fnt->fontStoreFontFileUid.iUid != 0) m_store->RemoveFile(fnt->fontStoreFontFileUid); + if (!fnt->families.isEmpty()) + m_applicationFontFamilies.remove(fnt->families.first()); if (fnt->screenDeviceFontFileId != 0) S60->screenDevice()->RemoveFile(fnt->screenDeviceFontFileId); QFile::remove(fnt->temporaryFileName); @@ -425,6 +469,18 @@ static bool registerScreenDeviceFont(int screenDeviceFontIndex, { TTypefaceSupport typefaceSupport; S60->screenDevice()->TypefaceSupport(typefaceSupport, screenDeviceFontIndex); + + QString familyName((const QChar*)typefaceSupport.iTypeface.iName.Ptr(), typefaceSupport.iTypeface.iName.Length()); + if (qt_symbian_fontNameHasAppFontMarker(familyName)) { + const QString &marker = QSymbianFontDatabaseExtrasImplementation::appFontMarker(); + if (familyName.endsWith(marker)) { + familyName = qt_symbian_appFontNameWithoutMarker(familyName); + dbExtras->m_applicationFontFamilies.insert(familyName); + } else { + return false; // This was somebody else's application font. Skip it. + } + } + CFont *font; // We have to get a font instance in order to know all the details TFontSpec fontSpec(typefaceSupport.iTypeface.iName, 11); if (S60->screenDevice()->GetNearestFontInPixels(font, fontSpec) != KErrNone) @@ -440,7 +496,6 @@ static bool registerScreenDeviceFont(int screenDeviceFontIndex, styleKey.style = faceAttrib.IsItalic()?QFont::StyleItalic:QFont::StyleNormal; styleKey.weight = faceAttrib.IsBold()?QFont::Bold:QFont::Normal; - QString familyName((const QChar *)typefaceSupport.iTypeface.iName.Ptr(), typefaceSupport.iTypeface.iName.Length()); QtFontFamily *family = privateDb()->family(familyName, true); family->fixedPitch = faceAttrib.IsMonoWidth(); QtFontFoundry *foundry = family->foundry(QString(), true); @@ -515,14 +570,268 @@ static inline void load(const QString &family = QString(), int script = -1) initializeDb(); } -static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) +struct OffsetTable { + quint32 sfntVersion; + quint16 numTables, searchRange, entrySelector, rangeShift; +}; + +struct TableRecord { + quint32 tag, checkSum, offset, length; +}; + +struct NameTableHead { + quint16 format, count, stringOffset; +}; + +struct NameRecord { + quint16 platformID, encodingID, languageID, nameID, length, offset; +}; + +static quint32 ttfCalcChecksum(const char *data, quint32 bytesCount) +{ + quint32 result = 0; + const quint32 *ptr = reinterpret_cast<const quint32*>(data); + const quint32 *endPtr = + ptr + (bytesCount + sizeof(quint32) - 1) / sizeof(quint32); + while (ptr < endPtr) { + const quint32 unit32Value = *ptr++; + result += qFromBigEndian(unit32Value); + } + return result; +} + +static inline quint32 toDWordBoundary(quint32 value) +{ + return (value + 3) & ~3; +} + +static inline quint32 dWordPadding(quint32 value) +{ + return (4 - (value & 3)) & 3; +} + +static inline bool ttfMarkNameTable(QByteArray &table, const QString &marker) +{ + const quint32 tableLength = static_cast<quint32>(table.size()); + + if (tableLength > 50000 // hard limit + || tableLength < sizeof(NameTableHead)) // corrupt name table + return false; + + const NameTableHead *head = reinterpret_cast<const NameTableHead*>(table.constData()); + const quint16 count = qFromBigEndian(head->count); + const quint16 stringOffset = qFromBigEndian(head->stringOffset); + if (count > 200 // hard limit + || stringOffset >= tableLength // corrupt name table + || sizeof(NameTableHead) + count * sizeof(NameRecord) >= tableLength) // corrupt name table + return false; + + QTextEncoder encoder(QTextCodec::codecForName("UTF-16BE"), QTextCodec::IgnoreHeader); + const QByteArray markerUtf16BE = encoder.fromUnicode(marker); + const QByteArray markerAscii = marker.toAscii(); + + QByteArray markedTable; + markedTable.reserve(tableLength + marker.length() * 20); // Original size plus some extra + markedTable.append(table, stringOffset); + QByteArray markedStrings; + quint32 stringDataCount = stringOffset; + for (quint16 i = 0; i < count; ++i) { + const quint32 nameRecordOffset = sizeof(NameTableHead) + sizeof(NameRecord) * i; + NameRecord *nameRecord = + reinterpret_cast<NameRecord*>(markedTable.data() + nameRecordOffset); + const quint16 nameID = qFromBigEndian(nameRecord->nameID); + const quint16 platformID = qFromBigEndian(nameRecord->platformID); + const quint16 encodingID = qFromBigEndian(nameRecord->encodingID); + const quint16 offset = qFromBigEndian(nameRecord->offset); + const quint16 length = qFromBigEndian(nameRecord->length); + stringDataCount += length; + if (stringDataCount > 80000 // hard limit. String data may be > name table size. Multiple records can reference the same string. + || static_cast<quint32>(stringOffset + offset + length) > tableLength) // String outside bounds + return false; + const bool needsMarker = + nameID == 1 || nameID == 3 || nameID == 4 || nameID == 16 || nameID == 21; + const bool isUnicode = + platformID == 0 || platformID == 3 && encodingID == 1; + const QByteArray originalString = + QByteArray::fromRawData(table.constData() + stringOffset + offset, length); + QByteArray markedString; + if (needsMarker) { + const int maxBytesLength = (KMaxTypefaceNameLength - marker.length()) * (isUnicode ? 2 : 1); + markedString = originalString.left(maxBytesLength) + (isUnicode ? markerUtf16BE : markerAscii); + } else { + markedString = originalString; + } + nameRecord->offset = qToBigEndian(static_cast<quint16>(markedStrings.length())); + nameRecord->length = qToBigEndian(static_cast<quint16>(markedString.length())); + markedStrings.append(markedString); + } + markedTable.append(markedStrings); + table = markedTable; + return true; +} + +const quint32 ttfMaxFileSize = 3500000; + +static inline bool ttfMarkAppFont(QByteArray &ttf, const QString &marker) { - if (QSysInfo::symbianVersion() <= QSysInfo::SV_SF_2) - return; // See QTBUG-16514 for what 'font collisions' can cause in Symbian^1 and lower + const quint32 ttfChecksumNumber = 0xb1b0afba; + const quint32 alignment = 4; + const quint32 ttfLength = static_cast<quint32>(ttf.size()); + if (ttfLength > ttfMaxFileSize // hard limit + || ttfLength % alignment != 0 // ttf sizes are always factors of 4 + || ttfLength <= sizeof(OffsetTable) // ttf too short + || ttfCalcChecksum(ttf.constData(), ttf.size()) != ttfChecksumNumber) // ttf checksum is invalid + return false; + + const OffsetTable *offsetTable = reinterpret_cast<const OffsetTable*>(ttf.constData()); + const quint16 numTables = qFromBigEndian(offsetTable->numTables); + const quint32 recordsLength = + toDWordBoundary(sizeof(OffsetTable) + numTables * sizeof(TableRecord)); + if (numTables > 30 // hard limit + || recordsLength + numTables * alignment > ttfLength) // Corrupt ttf. Tables would not fit, even if empty. + return false; + + QByteArray markedTtf; + markedTtf.reserve(ttfLength + marker.length() * 20); // Original size plus some extra + markedTtf.append(ttf.constData(), recordsLength); + + const quint32 ttfCheckSumAdjustmentOffset = 8; // Offset from the start of 'head' + int indexOfHeadTable = -1; + quint32 ttfDataSize = recordsLength; + typedef QPair<quint32, quint32> Range; + QList<Range> memoryRanges; + memoryRanges.reserve(numTables); + for (int i = 0; i < numTables; ++i) { + TableRecord *tableRecord = + reinterpret_cast<TableRecord*>(markedTtf.data() + sizeof(OffsetTable) + i * sizeof(TableRecord)); + const quint32 offset = qFromBigEndian(tableRecord->offset); + const quint32 length = qFromBigEndian(tableRecord->length); + const quint32 lengthAligned = toDWordBoundary(length); + ttfDataSize += lengthAligned; + if (offset < recordsLength // must not intersect ttf header/records + || offset % alignment != 0 // must be aligned + || offset > ttfLength - alignment // table out of bounds + || offset + lengthAligned > ttfLength // table out of bounds + || ttfDataSize > ttfLength) // tables would not fit into the ttf + return false; - if (QSymbianFontDatabaseExtrasImplementation::appFontLimitReached()) + foreach (const Range &range, memoryRanges) + if (offset < range.first + range.second && offset + lengthAligned > range.first) + return false; // Overlaps with another table + memoryRanges.append(Range(offset, lengthAligned)); + + quint32 checkSum = qFromBigEndian(tableRecord->checkSum); + if (tableRecord->tag == qToBigEndian('head')) { + if (length < ttfCheckSumAdjustmentOffset + sizeof(quint32)) + return false; // Invalid 'head' table + const quint32 *checkSumAdjustmentTag = + reinterpret_cast<const quint32*>(ttf.constData() + offset + ttfCheckSumAdjustmentOffset); + const quint32 checkSumAdjustment = qFromBigEndian(*checkSumAdjustmentTag); + checkSum += checkSumAdjustment; + indexOfHeadTable = i; // For the ttf checksum re-calculation, later + } + if (checkSum != ttfCalcChecksum(ttf.constData() + offset, length)) + return false; // Table checksum is invalid + + bool updateTableChecksum = false; + QByteArray table; + if (tableRecord->tag == qToBigEndian('name')) { + table = QByteArray(ttf.constData() + offset, length); + if (!ttfMarkNameTable(table, marker)) + return false; // Name table was not markable. + updateTableChecksum = true; + } else { + table = QByteArray::fromRawData(ttf.constData() + offset, length); + } + + tableRecord->offset = qToBigEndian(markedTtf.size()); + tableRecord->length = qToBigEndian(table.size()); + markedTtf.append(table); + markedTtf.append(QByteArray(dWordPadding(table.size()), 0)); // 0-padding + if (updateTableChecksum) { + TableRecord *tableRecord = // Need to recalculate, since markedTtf changed + reinterpret_cast<TableRecord*>(markedTtf.data() + sizeof(OffsetTable) + i * sizeof(TableRecord)); + const quint32 offset = qFromBigEndian(tableRecord->offset); + const quint32 length = qFromBigEndian(tableRecord->length); + tableRecord->checkSum = qToBigEndian(ttfCalcChecksum(markedTtf.constData() + offset, length)); + } + } + if (indexOfHeadTable == -1 // 'head' table is mandatory + || ttfDataSize != ttfLength) // We do not allow ttf data "holes". Neither does Symbian. + return false; + TableRecord *headRecord = + reinterpret_cast<TableRecord*>(markedTtf.data() + sizeof(OffsetTable) + indexOfHeadTable * sizeof(TableRecord)); + quint32 *checkSumAdjustmentTag = + reinterpret_cast<quint32*>(markedTtf.data() + qFromBigEndian(headRecord->offset) + ttfCheckSumAdjustmentOffset); + *checkSumAdjustmentTag = 0; + const quint32 ttfChecksum = ttfCalcChecksum(markedTtf.constData(), markedTtf.count()); + *checkSumAdjustmentTag = qToBigEndian(ttfChecksumNumber - ttfChecksum); + ttf = markedTtf; + return true; +} + +static inline bool ttfCanSymbianLoadFont(const QByteArray &data, const QString &fileName) +{ + bool result = false; + QString ttfFileName; + QFile tempFileGuard; + QFileInfo info(fileName); + if (!data.isEmpty()) { + QTemporaryFile tempfile(QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder() + + QSymbianFontDatabaseExtrasImplementation::appFontMarker() + + QLatin1String("XXXXXX.ttf")); + if (!tempfile.open() || tempfile.write(data) == -1) + return false; + ttfFileName = QDir::toNativeSeparators(QFileInfo(tempfile).canonicalFilePath()); + tempfile.setAutoRemove(false); + tempfile.close(); + tempFileGuard.setFileName(ttfFileName); + if (!tempFileGuard.open(QIODevice::ReadOnly)) + return false; + } else if (info.isFile()) { + ttfFileName = QDir::toNativeSeparators(info.canonicalFilePath()); + } else { + return false; + } + + CFontStore *store = 0; + RHeap* heap = User::ChunkHeap(NULL, 0x1000, 0x20000); + if (heap) { + QT_TRAP_THROWING( + CleanupClosePushL(*heap); + store = CFontStore::NewL(heap); + CleanupStack::PushL(store); + COpenFontRasterizer *rasterizer = COpenFontRasterizer::NewL(TUid::Uid(0x101F7F5E)); + CleanupStack::PushL(rasterizer); + store->InstallRasterizerL(rasterizer); + CleanupStack::Pop(rasterizer); + TUid fontUid = {-1}; + TRAP_IGNORE(fontUid = store->AddFileL(qt_QString2TPtrC(ttfFileName))); + if (fontUid.iUid != -1) + result = true; + CleanupStack::PopAndDestroy(2, heap); // heap, store + ); + } + + if (tempFileGuard.isOpen()) + tempFileGuard.remove(); + + return result; +} + +static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) +{ + if (QSymbianFontDatabaseExtrasImplementation::appFontLimitReached() + || fnt->data.size() > ttfMaxFileSize // hard limit + || fnt->data.isEmpty() && (!fnt->fileName.endsWith(QLatin1String(".ttf"), Qt::CaseInsensitive) // Only buffer or .ttf + || QFileInfo(fnt->fileName).size() > ttfMaxFileSize)) // hard limit return; +// Using ttfCanSymbianLoadFont() causes crashes on app destruction (Symbian^3|PR1 and lower). +// Therefore, not using it for now, but eventually in a later version. +// if (!ttfCanSymbianLoadFont(fnt->data, fnt->fileName)) +// return; + QFontDatabasePrivate *db = privateDb(); if (!db) return; @@ -530,13 +839,13 @@ static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) if (!db->count) initializeDb(); - if (fnt->data.isEmpty() && !fnt->fileName.endsWith(QLatin1String(".ttf"), Qt::CaseInsensitive)) - return; // Only buffer or .ttf QSymbianFontDatabaseExtrasImplementation *dbExtras = static_cast<QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras); if (!dbExtras) return; + const QString &marker = QSymbianFontDatabaseExtrasImplementation::appFontMarker(); + // The QTemporaryFile object being used in the following section must be // destructed before letting Symbian load the TTF file. Symbian would not // load it otherwise, because QTemporaryFile will still keep some handle @@ -548,8 +857,7 @@ static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) QFile tempFileGuard; { QTemporaryFile tempfile(QSymbianFontDatabaseExtrasImplementation::tempAppFontFolder() - + QSymbianFontDatabaseExtrasImplementation::appFontMarker() - + QLatin1String("XXXXXX.ttf")); + + marker + QLatin1String("XXXXXX.ttf")); if (!tempfile.open()) return; const QString tempFileName = QFileInfo(tempfile).canonicalFilePath(); @@ -559,10 +867,11 @@ static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) return; fnt->data = sourceFile.readAll(); } - if (tempfile.write(fnt->data) == -1) + if (!ttfMarkAppFont(fnt->data, marker) || tempfile.write(fnt->data) == -1) return; tempfile.setAutoRemove(false); tempfile.close(); // Tempfile still keeps a file handle, forbidding write access + fnt->data.clear(); // The TTF data was marked and saved. Not needed in memory, anymore. tempFileGuard.setFileName(tempFileName); if (!tempFileGuard.open(QIODevice::ReadOnly)) return; @@ -593,10 +902,14 @@ static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) fnt->fontStoreFontFileUid = dbExtras->addFontFileToFontStore(QFileInfo(fullFileName)); - fnt->families.append(fontsOnServerAfter.at(fontOnServerIndex)); - if (!registerScreenDeviceFont(fontOnServerIndex, dbExtras)) + const QString &appFontName = fontsOnServerAfter.at(fontOnServerIndex); + fnt->families.append(qt_symbian_appFontNameWithoutMarker(appFontName)); + if (!qt_symbian_fontNameHasAppFontMarker(appFontName) + || !registerScreenDeviceFont(fontOnServerIndex, dbExtras)) dbExtras->removeAppFontData(fnt); } else { + if (fnt->screenDeviceFontFileId > 0) + S60->screenDevice()->RemoveFile(fnt->screenDeviceFontFileId); // May still have the file open! QFile::remove(fnt->temporaryFileName); *fnt = QFontDatabasePrivate::ApplicationFont(); } @@ -669,7 +982,7 @@ QFontEngine *QFontDatabase::findFont(int script, const QFontPrivate *d, const QF QFontDatabasePrivate *db = privateDb(); QtFontDesc desc; QList<int> blacklistedFamilies; - match(script, req, req.family, QString(), -1, &desc, blacklistedFamilies); + match(script, key.def, key.def.family, QString(), -1, &desc, blacklistedFamilies); if (!desc.family) // falling back to application font desc.family = db->family(QApplication::font().defaultFamily()); Q_ASSERT(desc.family); diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp index b572cdd..f2b6f5c 100644 --- a/src/gui/text/qfontengine_s60.cpp +++ b/src/gui/text/qfontengine_s60.cpp @@ -243,10 +243,13 @@ static inline unsigned int getChar(const QChar *str, int &i, const int len) return uc; } +extern QString qt_symbian_fontNameWithAppFontMarker(const QString &fontName); // qfontdatabase_s60.cpp + CFont *QFontEngineS60::fontWithSize(qreal size) const { CFont *result = 0; - TFontSpec fontSpec(qt_QString2TPtrC(QFontEngine::fontDef.family), TInt(size)); + const QString family = qt_symbian_fontNameWithAppFontMarker(QFontEngine::fontDef.family); + TFontSpec fontSpec(qt_QString2TPtrC(family), TInt(size)); fontSpec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap); fontSpec.iFontStyle.SetPosture(QFontEngine::fontDef.style == QFont::StyleNormal?EPostureUpright:EPostureItalic); fontSpec.iFontStyle.SetStrokeWeight(QFontEngine::fontDef.weight > QFont::Normal?EStrokeWeightBold:EStrokeWeightNormal); -- cgit v0.12 From aeac5bf7cebb304eaf68bd7490294fc7021fe4c4 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Tue, 25 Jan 2011 10:35:13 +0100 Subject: Cocoa: disable scroll optimization for certain cases No reason to use the optimization when only scrolling in one direction. In those cases we are better off scrolling immidiatly when requested to minimize the shuffling of scrolls and repaints done by the application --- src/gui/kernel/qcocoaview_mac.mm | 10 ++++++---- src/gui/kernel/qt_cocoa_helpers_mac_p.h | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 1b81699..f0ae886 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -581,26 +581,28 @@ static int qCocoaViewCount = 0; #ifndef QT_NO_WHEELEVENT // ### Qt 5: Send one QWheelEvent with dx, dy and dz - QMacScrollOptimization::initNewScroll(); + if (deltaX != 0 && deltaY != 0) + QMacScrollOptimization::initDelayedScroll(); if (deltaX != 0) { QWheelEvent qwe(qlocal, qglobal, deltaX, buttons, keyMods, Qt::Horizontal); qt_sendSpontaneousEvent(widgetToGetMouse, &qwe); } - if (deltaY) { + if (deltaY != 0) { QWheelEvent qwe(qlocal, qglobal, deltaY, buttons, keyMods, Qt::Vertical); qt_sendSpontaneousEvent(widgetToGetMouse, &qwe); } - if (deltaZ) { + if (deltaZ != 0) { // Qt doesn't explicitly support wheels with a Z component. In a misguided attempt to // try to be ahead of the pack, I'm adding this extra value. QWheelEvent qwe(qlocal, qglobal, deltaZ, buttons, keyMods, (Qt::Orientation)3); qt_sendSpontaneousEvent(widgetToGetMouse, &qwe); } - QMacScrollOptimization::performDelayedScroll(); + if (deltaX != 0 && deltaY != 0) + QMacScrollOptimization::performDelayedScroll(); #endif //QT_NO_WHEELEVENT } diff --git a/src/gui/kernel/qt_cocoa_helpers_mac_p.h b/src/gui/kernel/qt_cocoa_helpers_mac_p.h index 9e09fd3..334d9e8 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac_p.h +++ b/src/gui/kernel/qt_cocoa_helpers_mac_p.h @@ -247,7 +247,7 @@ void qt_cocoaPostMessageAfterEventLoopExit(id target, SEL selector, int argCount #endif class QMacScrollOptimization { - // This class is made optimize for the case when the user + // This class is made to optimize for the case when the user // scrolls both horizontally and vertically at the same // time. This will result in two QWheelEvents (one for each // direction), which will typically result in two calls to @@ -261,7 +261,7 @@ class QMacScrollOptimization { static QRect _scrollRect; public: - static void initNewScroll() + static void initDelayedScroll() { _inWheelEvent = true; } -- cgit v0.12 From 7332dd762a406bb94d37e53a0bdd16045760d956 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko <denis.dzyubenko@nokia.com> Date: Tue, 25 Jan 2011 10:45:41 +0100 Subject: Moved the implementation of mapFromGlobal/mapToGlobal to QWidgetPrivate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: João Abecasis --- src/gui/kernel/qwidget_p.h | 2 ++ src/gui/kernel/qwidget_x11.cpp | 50 +++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index 693984a..3759dd1 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -767,6 +767,8 @@ public: void x11UpdateIsOpaque(); bool isBackgroundInherited() const; void updateX11AcceptFocus(); + QPoint mapToGlobal(const QPoint &pos) const; + QPoint mapFromGlobal(const QPoint &pos) const; #elif defined(Q_WS_WIN) // <--------------------------------------------------------- WIN uint noPaintOnScreen : 1; // see qwidget_win.cpp ::paintEngine() #ifndef QT_NO_GESTURES diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp index a93c545..4b59bfc 100644 --- a/src/gui/kernel/qwidget_x11.cpp +++ b/src/gui/kernel/qwidget_x11.cpp @@ -1280,39 +1280,49 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f) #endif } - -QPoint QWidget::mapToGlobal(const QPoint &pos) const +QPoint QWidgetPrivate::mapToGlobal(const QPoint &pos) const { - Q_D(const QWidget); - if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) { - QPoint p = pos + data->crect.topLeft(); + Q_Q(const QWidget); + if (!q->testAttribute(Qt::WA_WState_Created) || !q->internalWinId()) { + QPoint p = pos + q->data->crect.topLeft(); //cannot trust that !isWindow() implies parentWidget() before create - return (isWindow() || !parentWidget()) ? p : parentWidget()->mapToGlobal(p); + return (q->isWindow() || !q->parentWidget()) ? p : q->parentWidget()->d_func()->mapToGlobal(p); } - int x, y; + int x, y; Window child; - QPoint p = d->mapToWS(pos); - XTranslateCoordinates(X11->display, internalWinId(), - QApplication::desktop()->screen(d->xinfo.screen())->internalWinId(), + QPoint p = mapToWS(pos); + XTranslateCoordinates(X11->display, q->internalWinId(), + QApplication::desktop()->screen(xinfo.screen())->internalWinId(), p.x(), p.y(), &x, &y, &child); return QPoint(x, y); } - -QPoint QWidget::mapFromGlobal(const QPoint &pos) const +QPoint QWidgetPrivate::mapFromGlobal(const QPoint &pos) const { - Q_D(const QWidget); - if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) { + Q_Q(const QWidget); + if (!q->testAttribute(Qt::WA_WState_Created) || !q->internalWinId()) { //cannot trust that !isWindow() implies parentWidget() before create - QPoint p = (isWindow() || !parentWidget()) ? pos : parentWidget()->mapFromGlobal(pos); - return p - data->crect.topLeft(); + QPoint p = (q->isWindow() || !q->parentWidget()) ? pos : q->parentWidget()->d_func()->mapFromGlobal(pos); + return p - q->data->crect.topLeft(); } - int x, y; + int x, y; Window child; XTranslateCoordinates(X11->display, - QApplication::desktop()->screen(d->xinfo.screen())->internalWinId(), - internalWinId(), pos.x(), pos.y(), &x, &y, &child); - return d->mapFromWS(QPoint(x, y)); + QApplication::desktop()->screen(xinfo.screen())->internalWinId(), + q->internalWinId(), pos.x(), pos.y(), &x, &y, &child); + return mapFromWS(QPoint(x, y)); +} + +QPoint QWidget::mapToGlobal(const QPoint &pos) const +{ + Q_D(const QWidget); + return d->mapToGlobal(pos); +} + +QPoint QWidget::mapFromGlobal(const QPoint &pos) const +{ + Q_D(const QWidget); + return d->mapFromGlobal(pos); } void QWidgetPrivate::updateSystemBackground() -- cgit v0.12 From cdd776a91e65bf5c30cea1bab9823134a3f797d0 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko <denis.dzyubenko@nokia.com> Date: Tue, 25 Jan 2011 10:01:56 +0100 Subject: Improved performance of mapFromGlobal/mapToGlobal on X11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We don't call XTranslateCoordinates anymore, but use the toplevel window offset that we already store to convert between screen coordinates and widget coordinates. Reviewed-by: João Abecasis --- src/gui/kernel/qwidget_x11.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp index 4b59bfc..9893478 100644 --- a/src/gui/kernel/qwidget_x11.cpp +++ b/src/gui/kernel/qwidget_x11.cpp @@ -1316,12 +1316,40 @@ QPoint QWidgetPrivate::mapFromGlobal(const QPoint &pos) const QPoint QWidget::mapToGlobal(const QPoint &pos) const { Q_D(const QWidget); + QPoint offset = data->crect.topLeft(); + const QWidget *w = this; + const QWidget *p = w->parentWidget(); + while (!w->isWindow() && p) { + w = p; + p = p->parentWidget(); + offset += w->data->crect.topLeft(); + } + + const QWidgetPrivate *wd = w->d_func(); + QTLWExtra *tlw = wd->topData(); + if (!tlw->embedded) + return pos + offset; + return d->mapToGlobal(pos); } QPoint QWidget::mapFromGlobal(const QPoint &pos) const { Q_D(const QWidget); + QPoint offset = data->crect.topLeft(); + const QWidget *w = this; + const QWidget *p = w->parentWidget(); + while (!w->isWindow() && p) { + w = p; + p = p->parentWidget(); + offset += w->data->crect.topLeft(); + } + + const QWidgetPrivate *wd = w->d_func(); + QTLWExtra *tlw = wd->topData(); + if (!tlw->embedded) + return pos - offset; + return d->mapFromGlobal(pos); } -- cgit v0.12 From 7db489a0de073a2a56fe32d16f1cbe1bebdfd06d Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Tue, 25 Jan 2011 11:39:37 +0100 Subject: QtScript/JSC on Symbian: Enhanced memory allocator for Collector heap Cherry-picked from http://trac.webkit.org/changeset/56370 The old allocator caused QML to crash in MCL (TB10.1, week 1). Task-number: QTBUG-14293 Reviewed-by: Simon Hausmann --- .../javascriptcore/JavaScriptCore/ChangeLog | 28 +++++ .../JavaScriptCore/JavaScriptCore.pri | 3 + .../JavaScriptCore/runtime/Collector.cpp | 46 ++----- .../JavaScriptCore/runtime/Collector.h | 9 ++ .../JavaScriptCore/runtime/CollectorHeapIterator.h | 10 +- .../wtf/symbian/BlockAllocatorSymbian.cpp | 132 +++++++++++++++++++++ .../wtf/symbian/BlockAllocatorSymbian.h | 120 +++++++++++++++++++ src/3rdparty/javascriptcore/VERSION | 4 +- src/script/script.pro | 1 - 9 files changed, 309 insertions(+), 44 deletions(-) create mode 100644 src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp create mode 100644 src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog index fd6c3f7..c2b1155 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog +++ b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog @@ -232,6 +232,34 @@ without using doubles, but the code would be much more complicated, and there is no important reason to stick to integers here. +2010-03-22 Siddharth Mathur <siddharth.mathur@nokia.com> + + Reviewed by Laszlo Gombos. + + [Symbian] More efficient aligned memory allocation for JSC Collector + https://bugs.webkit.org/show_bug.cgi?id=34350 + + * JavaScriptCore.pri: Added 2 new Symbian source files and HAL linkage + + * runtime/Collector.cpp: Reduced port-specific code and added private data member + (JSC::Heap::Heap): + (JSC::Heap::~Heap): + (JSC::Heap::destroy): + (JSC::Heap::allocateBlock): + (JSC::Heap::freeBlockPtr): + + * runtime/Collector.h: Added private data member + + * wtf/symbian: Added. + * wtf/symbian/BlockAllocatorSymbian.cpp: Added. + (WTF::AlignedBlockAllocator::AlignedBlockAllocator): Helper class to allocate + aligned blocks more efficiently as required by Collector + (WTF::AlignedBlockAllocator::alloc): + (WTF::AlignedBlockAllocator::free): + (WTF::AlignedBlockAllocator::destroy): + (WTF::AlignedBlockAllocator::~AlignedBlockAllocator): + * wtf/symbian/BlockAllocatorSymbian.h: Added. + 2010-03-22 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri index d75bd31..b061321 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri +++ b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri @@ -16,6 +16,7 @@ CONFIG(debug, debug|release) { symbian: { # Need to guarantee this comes before system includes of /epoc32/include MMP_RULES += "USERINCLUDE ../JavaScriptCore/profiler" + LIBS += -lhal } INCLUDEPATH = \ @@ -33,6 +34,7 @@ INCLUDEPATH = \ $$PWD/runtime \ $$PWD/wrec \ $$PWD/wtf \ + $$PWD/wtf/symbian \ $$PWD/wtf/unicode \ $$PWD/yarr \ $$PWD/API \ @@ -211,6 +213,7 @@ SOURCES += \ wtf/qt/ThreadingQt.cpp \ wtf/RandomNumber.cpp \ wtf/RefCountedLeakCounter.cpp \ + wtf/symbian/BlockAllocatorSymbian.cpp \ wtf/symbian/RegisterFileAllocatorSymbian.cpp \ wtf/ThreadingNone.cpp \ wtf/Threading.cpp \ diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp index 24873c8..42e2a35 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp @@ -53,11 +53,6 @@ #include <mach/thread_act.h> #include <mach/vm_map.h> -#elif OS(SYMBIAN) -#include <e32std.h> -#include <e32cmn.h> -#include <unistd.h> - #elif OS(WINDOWS) #include <windows.h> @@ -109,11 +104,6 @@ const size_t ALLOCATIONS_PER_COLLECTION = 3600; // a PIC branch in Mach-O binaries, see <rdar://problem/5971391>. #define MIN_ARRAY_SIZE (static_cast<size_t>(14)) -#if OS(SYMBIAN) -const size_t MAX_NUM_BLOCKS = 256; // Max size of collector heap set to 16 MB -static RHeap* userChunk = 0; -#endif - #if ENABLE(JSC_MULTIPLE_THREADS) #if OS(DARWIN) @@ -146,29 +136,11 @@ Heap::Heap(JSGlobalData* globalData) , m_currentThreadRegistrar(0) #endif , m_globalData(globalData) +#if OS(SYMBIAN) + , m_blockallocator(JSCCOLLECTOR_VIRTUALMEM_RESERVATION, BLOCK_SIZE) +#endif { ASSERT(globalData); - -#if OS(SYMBIAN) - // Symbian OpenC supports mmap but currently not the MAP_ANON flag. - // Using fastMalloc() does not properly align blocks on 64k boundaries - // and previous implementation was flawed/incomplete. - // UserHeap::ChunkHeap allows allocation of continuous memory and specification - // of alignment value for (symbian) cells within that heap. - // - // Clarification and mapping of terminology: - // RHeap (created by UserHeap::ChunkHeap below) is continuos memory chunk, - // which can dynamically grow up to 8 MB, - // that holds all CollectorBlocks of this session (static). - // Each symbian cell within RHeap maps to a 64kb aligned CollectorBlock. - // JSCell objects are maintained as usual within CollectorBlocks. - if (!userChunk) { - userChunk = UserHeap::ChunkHeap(0, 0, MAX_NUM_BLOCKS * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); - if (!userChunk) - CRASH(); - } -#endif // OS(SYMBIAN) - memset(&m_heap, 0, sizeof(CollectorHeap)); allocateBlock(); } @@ -211,7 +183,9 @@ void Heap::destroy() t = next; } #endif - +#if OS(SYMBIAN) + m_blockallocator.destroy(); +#endif m_globalData = 0; } @@ -221,11 +195,9 @@ NEVER_INLINE CollectorBlock* Heap::allocateBlock() vm_address_t address = 0; vm_map(current_task(), &address, BLOCK_SIZE, BLOCK_OFFSET_MASK, VM_FLAGS_ANYWHERE | VM_TAG_FOR_COLLECTOR_MEMORY, MEMORY_OBJECT_NULL, 0, FALSE, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT); #elif OS(SYMBIAN) - // Allocate a 64 kb aligned CollectorBlock - unsigned char* mask = reinterpret_cast<unsigned char*>(userChunk->Alloc(BLOCK_SIZE)); - if (!mask) + void* address = m_blockallocator.alloc(); + if (!address) CRASH(); - uintptr_t address = reinterpret_cast<uintptr_t>(mask); #elif OS(WINCE) void* address = VirtualAlloc(NULL, BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); #elif OS(WINDOWS) @@ -316,7 +288,7 @@ NEVER_INLINE void Heap::freeBlockPtr(CollectorBlock* block) #if OS(DARWIN) vm_deallocate(current_task(), reinterpret_cast<vm_address_t>(block), BLOCK_SIZE); #elif OS(SYMBIAN) - userChunk->Free(reinterpret_cast<TAny*>(block)); + m_blockallocator.free(reinterpret_cast<void*>(block)); #elif OS(WINCE) VirtualFree(block, 0, MEM_RELEASE); #elif OS(WINDOWS) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h index 7f7a679..d3616dc 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h @@ -35,6 +35,10 @@ #include <pthread.h> #endif +#if OS(SYMBIAN) +#include <wtf/symbian/BlockAllocatorSymbian.h> +#endif + #define ASSERT_CLASS_FITS_IN_CELL(class) COMPILE_ASSERT(sizeof(class) <= CELL_SIZE, class_fits_in_cell) namespace JSC { @@ -167,6 +171,11 @@ namespace JSC { pthread_key_t m_currentThreadRegistrar; #endif +#if OS(SYMBIAN) + // Allocates collector blocks with correct alignment + WTF::AlignedBlockAllocator m_blockallocator; +#endif + JSGlobalData* m_globalData; }; diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/CollectorHeapIterator.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/CollectorHeapIterator.h index 4a38df9..e4f2f91 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/CollectorHeapIterator.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/CollectorHeapIterator.h @@ -97,12 +97,14 @@ namespace JSC { inline LiveObjectIterator& LiveObjectIterator::operator++() { - advance(HeapConstants::cellsPerBlock - 1); - if (m_block < m_heap.nextBlock || (m_block == m_heap.nextBlock && m_cell < m_heap.nextCell)) + if (m_block < m_heap.nextBlock || m_cell < m_heap.nextCell) { + advance(HeapConstants::cellsPerBlock); return *this; + } - while (m_block < m_heap.usedBlocks && !m_heap.blocks[m_block]->marked.get(m_cell)) - advance(HeapConstants::cellsPerBlock - 1); + do { + advance(HeapConstants::cellsPerBlock); + } while (m_block < m_heap.usedBlocks && !m_heap.blocks[m_block]->marked.get(m_cell)); return *this; } diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp new file mode 100644 index 0000000..6a28e9e --- /dev/null +++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON 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. + */ + +#include "config.h" + +#if OS(SYMBIAN) + +#include "BlockAllocatorSymbian.h" + + +namespace WTF { + +/** Efficiently allocates blocks of size blockSize with blockSize alignment. + * Primarly designed for JSC Collector's needs. + * Not thread-safe. + */ +AlignedBlockAllocator::AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize ) + : m_reservation(reservationSize), + m_blockSize(blockSize) +{ + + // Get system's page size value. + SYMBIAN_PAGESIZE(m_pageSize); + + // We only accept multiples of system page size for both initial reservation and the alignment/block size + m_reservation = SYMBIAN_ROUNDUPTOMULTIPLE(m_reservation, m_pageSize); + __ASSERT_ALWAYS(SYMBIAN_ROUNDUPTOMULTIPLE(m_blockSize, m_pageSize), User::Panic(_L("AlignedBlockAllocator1"), KErrArgument)); + + // Calculate max. bit flags we need to carve a reservationSize range into blockSize-sized blocks + m_map.numBits = m_reservation / m_blockSize; + const TUint32 bitsPerWord = 8*sizeof(TUint32); + const TUint32 numWords = (m_map.numBits + bitsPerWord -1) / bitsPerWord; + + m_map.bits = new TUint32[numWords]; + __ASSERT_ALWAYS(m_map.bits, User::Panic(_L("AlignedBlockAllocator2"), KErrNoMemory)); + m_map.clearAll(); + + // Open a Symbian RChunk, and reserve requested virtual address range + // Any thread in this process can operate this rchunk due to EOwnerProcess access rights. + TInt ret = m_chunk.CreateDisconnectedLocal(0 , 0, (TInt)m_reservation , EOwnerProcess); + if (ret != KErrNone) + User::Panic(_L("AlignedBlockAllocator3"), ret); + + // This is the offset to m_chunk.Base() required to make it m_blockSize-aligned + m_offset = SYMBIAN_ROUNDUPTOMULTIPLE(TUint32(m_chunk.Base()), m_blockSize) - TUint(m_chunk.Base()); + +} + +void* AlignedBlockAllocator::alloc() +{ + + TInt freeRam = 0; + void* address = 0; + + // Look up first free slot in bit map + const TInt freeIdx = m_map.findFree(); + + // Pseudo OOM: We ate up the address space we reserved.. + // ..even though the device may have free RAM left + if (freeIdx < 0) + return 0; + + TInt ret = m_chunk.Commit(m_offset + (m_blockSize * freeIdx), m_blockSize); + if (ret != KErrNone) + return 0; // True OOM: Device didn't have physical RAM to spare + + // Updated bit to mark region as in use. + m_map.set(freeIdx); + + // Calculate address of committed region (block) + address = (void*)( (m_chunk.Base() + m_offset) + (TUint)(m_blockSize * freeIdx) ); + + return address; +} + +void AlignedBlockAllocator::free(void* block) +{ + // Calculate index of block to be freed + TInt idx = TUint(static_cast<TUint8*>(block) - m_chunk.Base() - m_offset) / m_blockSize; + + __ASSERT_DEBUG(idx >= 0 && idx < m_map.numBits, User::Panic(_L("AlignedBlockAllocator4"), KErrCorrupt)); // valid index check + __ASSERT_DEBUG(m_map.get(idx), User::Panic(_L("AlignedBlockAllocator5"), KErrCorrupt)); // in-use flag check + + // Return committed region to system RAM pool (the physical RAM becomes usable by others) + TInt ret = m_chunk.Decommit(m_offset + m_blockSize * idx, m_blockSize); + + // mark this available again + m_map.clear(idx); +} + +void AlignedBlockAllocator::destroy() +{ + // release everything! + m_chunk.Decommit(0, m_chunk.MaxSize()); + m_map.clearAll(); +} + +AlignedBlockAllocator::~AlignedBlockAllocator() +{ + destroy(); + m_chunk.Close(); + delete [] m_map.bits; +} + +} // end of namespace + +#endif // SYMBIAN diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h new file mode 100644 index 0000000..21422f6 --- /dev/null +++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON 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. + */ + +#ifndef BlockAllocatorSymbian_h +#define BlockAllocatorSymbian_h + +#include <e32cmn.h> +#include <e32std.h> +#include <hal.h> + + +#define SYMBIAN_PAGESIZE(x) (HAL::Get(HALData::EMemoryPageSize, x)); +#define SYMBIAN_FREERAM(x) (HAL::Get(HALData::EMemoryRAMFree, x)); +#define SYMBIAN_ROUNDUPTOMULTIPLE(x, multipleof) ( (x + multipleof - 1) & ~(multipleof - 1) ) + +// Set sane defaults if -D<flagname=value> wasn't provided via compiler args +#ifndef JSCCOLLECTOR_VIRTUALMEM_RESERVATION +#if defined(__WINS__) + // Emulator has limited virtual address space + #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (4*1024*1024) +#else + // HW has plenty of virtual addresses + #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (128*1024*1024) +#endif +#endif + +namespace WTF { + +/** + * Allocates contiguous region of size blockSize with blockSize-aligned address. + * blockSize must be a multiple of system page size (typically 4K on Symbian/ARM) + * + * @param reservationSize Virtual address range to be reserved upon creation of chunk (bytes). + * @param blockSize Size of a single allocation. Returned address will also be blockSize-aligned. + */ +class AlignedBlockAllocator { + public: + AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize); + ~AlignedBlockAllocator(); + void destroy(); + void* alloc(); + void free(void* data); + + private: + RChunk m_chunk; // Symbian chunk that lets us reserve/commit/decommit + TUint m_offset; // offset of first committed region from base + TInt m_pageSize; // cached value of system page size, typically 4K on Symbian + TUint32 m_reservation; + TUint32 m_blockSize; + + // Tracks comitted/decommitted state of a blockSize region + struct { + + TUint32 *bits; // array of bit flags + TUint32 numBits; // number of regions to keep track of + + bool get(TUint32 n) const + { + return !!(bits[n >> 5] & (1 << (n & 0x1F))); + } + + void set(TUint32 n) + { + bits[n >> 5] |= (1 << (n & 0x1F)); + } + + void clear(TUint32 n) + { + bits[n >> 5] &= ~(1 << (n & 0x1F)); + } + + void clearAll() + { + for (TUint32 i = 0; i < numBits; i++) + clear(i); + } + + TInt findFree() const + { + for (TUint32 i = 0; i < numBits; i++) { + if (!get(i)) + return i; + } + return -1; + } + + } m_map; + +}; + +} + +#endif // end of BlockAllocatorSymbian_h + + diff --git a/src/3rdparty/javascriptcore/VERSION b/src/3rdparty/javascriptcore/VERSION index 9991ac0..b4744b7 100644 --- a/src/3rdparty/javascriptcore/VERSION +++ b/src/3rdparty/javascriptcore/VERSION @@ -4,8 +4,8 @@ This is a snapshot of JavaScriptCore from The commit imported was from the - javascriptcore-snapshot-05102010 branch/tag + javascriptcore-snapshot-24012011 branch/tag and has the sha1 checksum - 82ead85cfea5859044eeb25b33314dcc0fa5eea1 + d143bde5ae8cff229aebd43487a2fce5e713e990 diff --git a/src/script/script.pro b/src/script/script.pro index d1633d8..63917b1 100644 --- a/src/script/script.pro +++ b/src/script/script.pro @@ -81,7 +81,6 @@ include(script.pri) symbian { TARGET.UID3=0x2001B2E1 - LIBS += -lhal } symbian { -- cgit v0.12 From 41297f2d592ef21327b5c7523c52c1ecd3c727f4 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Tue, 25 Jan 2011 13:49:46 +0200 Subject: Fix QMAKE_POST_LINK in Symbian for targets with special characters. Proper fixed targets was not used to generate the dependency for QMAKE_POST_LINK in symbian-sbsv2, causing post linking to happen before actual linking. Task-number: QTBUG-16881 Reviewed-by: axis --- qmake/generators/symbian/symmake_sbsv2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp index 6d01523..9eccd46 100644 --- a/qmake/generators/symbian/symmake_sbsv2.cpp +++ b/qmake/generators/symbian/symmake_sbsv2.cpp @@ -686,7 +686,7 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t fixFlmCmd(&postLinkCmd, commandsToReplace); t << "START EXTENSION qt/qmake_post_link" << endl; t << "OPTION POST_LINK_CMD " << postLinkCmd << endl; - t << "OPTION LINK_TARGET " << removePathSeparators(escapeFilePath(fileFixify(project->first("TARGET"))).append(".").append(getTargetExtension())) << endl; + t << "OPTION LINK_TARGET " << fixedTarget << QLatin1String(".") << getTargetExtension() << endl; t << "END" << endl; t << endl; } -- cgit v0.12 From 34c297faca93e1286573b2a01127e4e7af00aff2 Mon Sep 17 00:00:00 2001 From: Jiang Jiang <jiang.jiang@nokia.com> Date: Mon, 24 Jan 2011 19:09:38 +0100 Subject: Fix cursor position adjustment when removing strings Commit 0ba1b4d0 introduced a regression to QTextDocument: it postponed cursor position adjustment until the move operation is done, but contentsChanged will be triggered by finishEdit() in this move operation, thus cursor positions in this signal handler will be in inconsistent states (normally we should first update cursor position then trigger contentsChanged). In this case we should also postpone finishEdit() handling after cursor positions have been adjusted, then the states expose to applications will be consistent. Task-number: QTBUG-15857 Reviewed-by: Eskil --- src/gui/text/qtextdocument_p.cpp | 4 +++- tests/auto/qtextcursor/tst_qtextcursor.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp index 498a432..2172f74 100644 --- a/src/gui/text/qtextdocument_p.cpp +++ b/src/gui/text/qtextdocument_p.cpp @@ -663,7 +663,8 @@ void QTextDocumentPrivate::move(int pos, int to, int length, QTextUndoCommand::O Q_ASSERT(blocks.length() == fragments.length()); - finishEdit(); + if (!blockCursorAdjustment) + finishEdit(); } void QTextDocumentPrivate::remove(int pos, int length, QTextUndoCommand::Operation op) @@ -678,6 +679,7 @@ void QTextDocumentPrivate::remove(int pos, int length, QTextUndoCommand::Operati curs->changed = true; } } + finishEdit(); } void QTextDocumentPrivate::setCharFormat(int pos, int length, const QTextCharFormat &newFormat, FormatChangeMode mode) diff --git a/tests/auto/qtextcursor/tst_qtextcursor.cpp b/tests/auto/qtextcursor/tst_qtextcursor.cpp index ee2baef..4d52dd7 100644 --- a/tests/auto/qtextcursor/tst_qtextcursor.cpp +++ b/tests/auto/qtextcursor/tst_qtextcursor.cpp @@ -134,6 +134,7 @@ private slots: void endOfLine(); void editBlocksDuringRemove(); + void selectAllDuringRemove(); void update_data(); void update(); @@ -1388,6 +1389,17 @@ public slots: ++recordingCount; } + void selectAllContents() + { + // Only test the first time + if (!recordingCount) { + recordingCount++; + cursor->select(QTextCursor::Document); + lastRecordedPosition = cursor->position(); + lastRecordedAnchor = cursor->anchor(); + } + } + private: QTextCursor *cursor; }; @@ -1411,6 +1423,22 @@ void tst_QTextCursor::editBlocksDuringRemove() QVERIFY(doc->toPlainText().isEmpty()); } +void tst_QTextCursor::selectAllDuringRemove() +{ + CursorListener listener(&cursor); + + cursor.insertText("Hello World"); + cursor.movePosition(QTextCursor::End); + + connect(doc, SIGNAL(contentsChanged()), &listener, SLOT(selectAllContents())); + listener.recordingCount = 0; + QTextCursor localCursor = cursor; + localCursor.deletePreviousChar(); + + QCOMPARE(listener.lastRecordedPosition, 10); + QCOMPARE(listener.lastRecordedAnchor, 0); +} + void tst_QTextCursor::update_data() { QTest::addColumn<QString>("text"); -- cgit v0.12 From c6a6448272168f0105c973bef5e531114533fc90 Mon Sep 17 00:00:00 2001 From: Peter Hartmann <peter.hartmann@nokia.com> Date: Mon, 24 Jan 2011 14:22:57 +0100 Subject: add autotest for digest authentication Reviewed-by: Markus Goetz Task-number: QTBUG-15070 --- tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 30 +++++++++++++++++--------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index bd22837..8274140 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -212,6 +212,7 @@ private Q_SLOTS: void ioGetFromBuiltinHttp(); void ioGetFromHttpWithReuseParallel(); void ioGetFromHttpWithReuseSequential(); + void ioGetFromHttpWithAuth_data(); void ioGetFromHttpWithAuth(); void ioGetFromHttpWithAuthSynchronous(); void ioGetFromHttpWithProxyAuth(); @@ -2163,15 +2164,27 @@ void tst_QNetworkReply::ioGetFromHttpWithReuseSequential() } } +void tst_QNetworkReply::ioGetFromHttpWithAuth_data() +{ + QTest::addColumn<QUrl>("url"); + QTest::addColumn<QByteArray>("expectedData"); + + QFile reference(SRCDIR "/rfc3252.txt"); + reference.open(QIODevice::ReadOnly); + QByteArray referenceData = reference.readAll(); + QTest::newRow("basic") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt") << referenceData; + QTest::newRow("digest") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/auth-digest/") << QByteArray("digest authentication successful\n"); +} + void tst_QNetworkReply::ioGetFromHttpWithAuth() { // This test sends three requests // The first two in parallel // The third after the first two finished - QFile reference(SRCDIR "/rfc3252.txt"); - QVERIFY(reference.open(QIODevice::ReadOnly)); - QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt")); + QFETCH(QUrl, url); + QFETCH(QByteArray, expectedData); + QNetworkRequest request(url); { QNetworkReplyPtr reply1 = manager.get(request); QNetworkReplyPtr reply2 = manager.get(request); @@ -2196,14 +2209,12 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth() QCOMPARE(reply1->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); QCOMPARE(reply2->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); - QByteArray referenceData = reference.readAll(); - QCOMPARE(reader1.data, referenceData); - QCOMPARE(reader2.data, referenceData); + QCOMPARE(reader1.data, expectedData); + QCOMPARE(reader2.data, expectedData); QCOMPARE(authspy.count(), 1); } - reference.seek(0); // rinse and repeat: { QNetworkReplyPtr reply = manager.get(request); @@ -2219,13 +2230,12 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth() this, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*))); QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); - QCOMPARE(reader.data, reference.readAll()); + QCOMPARE(reader.data, expectedData); QCOMPARE(authspy.count(), 0); } // now check with synchronous calls: - reference.seek(0); { request.setAttribute( static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute), @@ -2241,7 +2251,7 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth() // the only thing we check here is that the auth cache was used when using synchronous requests QCOMPARE(replySync->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); - QCOMPARE(replySync->readAll(), reference.readAll()); + QCOMPARE(replySync->readAll(), expectedData); } } -- cgit v0.12 From 7fd7454805ea091688339111e544cb70f7a24739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com> Date: Tue, 25 Jan 2011 11:02:16 +0100 Subject: Fixed QPainterPath::pointAtPercent(t) for one-element paths. Return the MoveTo element instead of QPointF(0, 0). Task-number: QTBUG-16788 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/painting/qpainterpath.cpp | 5 ++++- tests/auto/qpainterpath/tst_qpainterpath.cpp | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp index 7d6ea12..1b69234 100644 --- a/src/gui/painting/qpainterpath.cpp +++ b/src/gui/painting/qpainterpath.cpp @@ -2894,9 +2894,12 @@ QPointF QPainterPath::pointAtPercent(qreal t) const return QPointF(); } - if (isEmpty()) + if (!d_ptr || d_ptr->elements.size() == 0) return QPointF(); + if (d_ptr->elements.size() == 1) + return d_ptr->elements.at(0); + qreal totalLength = length(); qreal curLen = 0; qreal bezierLen = 0; diff --git a/tests/auto/qpainterpath/tst_qpainterpath.cpp b/tests/auto/qpainterpath/tst_qpainterpath.cpp index 19b3156..ad5a968 100644 --- a/tests/auto/qpainterpath/tst_qpainterpath.cpp +++ b/tests/auto/qpainterpath/tst_qpainterpath.cpp @@ -1041,6 +1041,11 @@ void tst_QPainterPath::pointAtPercent_data() QRectF rect(241, 273, 185, 228); path.addEllipse(rect); QTest::newRow("Case 17") << path << qreal(1.0) << QPointF(rect.right(), qreal(0.5) * (rect.top() + rect.bottom())); + + path = QPainterPath(); + path.moveTo(100, 100); + QTest::newRow("Case 18") << path << qreal(0.0) << QPointF(100, 100); + QTest::newRow("Case 19") << path << qreal(1.0) << QPointF(100, 100); } void tst_QPainterPath::pointAtPercent() -- cgit v0.12 From cb38007cd3b253fb2e3a8587ae9e64080e707a31 Mon Sep 17 00:00:00 2001 From: Eckhart Koppen <eckhart.koppen@nokia.com> Date: Tue, 25 Jan 2011 15:11:33 +0200 Subject: Temporary fix for ambiguous cast from four letter char constant --- src/gui/text/qfontdatabase_s60.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp index ad67189..97426a8 100644 --- a/src/gui/text/qfontdatabase_s60.cpp +++ b/src/gui/text/qfontdatabase_s60.cpp @@ -721,7 +721,7 @@ static inline bool ttfMarkAppFont(QByteArray &ttf, const QString &marker) memoryRanges.append(Range(offset, lengthAligned)); quint32 checkSum = qFromBigEndian(tableRecord->checkSum); - if (tableRecord->tag == qToBigEndian('head')) { + if (tableRecord->tag == qToBigEndian(static_cast<quint32>('head'))) { if (length < ttfCheckSumAdjustmentOffset + sizeof(quint32)) return false; // Invalid 'head' table const quint32 *checkSumAdjustmentTag = @@ -735,7 +735,7 @@ static inline bool ttfMarkAppFont(QByteArray &ttf, const QString &marker) bool updateTableChecksum = false; QByteArray table; - if (tableRecord->tag == qToBigEndian('name')) { + if (tableRecord->tag == qToBigEndian(static_cast<quint32>('name'))) { table = QByteArray(ttf.constData() + offset, length); if (!ttfMarkNameTable(table, marker)) return false; // Name table was not markable. -- cgit v0.12 From f0667b4b439f87f8bd613add148e94d520e77be1 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Tue, 25 Jan 2011 16:50:22 +0100 Subject: Revert "QtScript/JSC on Symbian: Enhanced memory allocator for Collector heap" This reverts commit 7db489a0de073a2a56fe32d16f1cbe1bebdfd06d. The change to CollectorHeapIterator.h is not Symbian-specific and it introduced test failures on all platforms (tst_QScriptEngineAgent::positionChange_3()). --- .../javascriptcore/JavaScriptCore/ChangeLog | 28 ----- .../JavaScriptCore/JavaScriptCore.pri | 3 - .../JavaScriptCore/runtime/Collector.cpp | 46 +++++-- .../JavaScriptCore/runtime/Collector.h | 9 -- .../JavaScriptCore/runtime/CollectorHeapIterator.h | 10 +- .../wtf/symbian/BlockAllocatorSymbian.cpp | 132 --------------------- .../wtf/symbian/BlockAllocatorSymbian.h | 120 ------------------- src/3rdparty/javascriptcore/VERSION | 4 +- src/script/script.pro | 1 + 9 files changed, 44 insertions(+), 309 deletions(-) delete mode 100644 src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp delete mode 100644 src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog index c2b1155..fd6c3f7 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog +++ b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog @@ -232,34 +232,6 @@ without using doubles, but the code would be much more complicated, and there is no important reason to stick to integers here. -2010-03-22 Siddharth Mathur <siddharth.mathur@nokia.com> - - Reviewed by Laszlo Gombos. - - [Symbian] More efficient aligned memory allocation for JSC Collector - https://bugs.webkit.org/show_bug.cgi?id=34350 - - * JavaScriptCore.pri: Added 2 new Symbian source files and HAL linkage - - * runtime/Collector.cpp: Reduced port-specific code and added private data member - (JSC::Heap::Heap): - (JSC::Heap::~Heap): - (JSC::Heap::destroy): - (JSC::Heap::allocateBlock): - (JSC::Heap::freeBlockPtr): - - * runtime/Collector.h: Added private data member - - * wtf/symbian: Added. - * wtf/symbian/BlockAllocatorSymbian.cpp: Added. - (WTF::AlignedBlockAllocator::AlignedBlockAllocator): Helper class to allocate - aligned blocks more efficiently as required by Collector - (WTF::AlignedBlockAllocator::alloc): - (WTF::AlignedBlockAllocator::free): - (WTF::AlignedBlockAllocator::destroy): - (WTF::AlignedBlockAllocator::~AlignedBlockAllocator): - * wtf/symbian/BlockAllocatorSymbian.h: Added. - 2010-03-22 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri index b061321..d75bd31 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri +++ b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri @@ -16,7 +16,6 @@ CONFIG(debug, debug|release) { symbian: { # Need to guarantee this comes before system includes of /epoc32/include MMP_RULES += "USERINCLUDE ../JavaScriptCore/profiler" - LIBS += -lhal } INCLUDEPATH = \ @@ -34,7 +33,6 @@ INCLUDEPATH = \ $$PWD/runtime \ $$PWD/wrec \ $$PWD/wtf \ - $$PWD/wtf/symbian \ $$PWD/wtf/unicode \ $$PWD/yarr \ $$PWD/API \ @@ -213,7 +211,6 @@ SOURCES += \ wtf/qt/ThreadingQt.cpp \ wtf/RandomNumber.cpp \ wtf/RefCountedLeakCounter.cpp \ - wtf/symbian/BlockAllocatorSymbian.cpp \ wtf/symbian/RegisterFileAllocatorSymbian.cpp \ wtf/ThreadingNone.cpp \ wtf/Threading.cpp \ diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp index 42e2a35..24873c8 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp @@ -53,6 +53,11 @@ #include <mach/thread_act.h> #include <mach/vm_map.h> +#elif OS(SYMBIAN) +#include <e32std.h> +#include <e32cmn.h> +#include <unistd.h> + #elif OS(WINDOWS) #include <windows.h> @@ -104,6 +109,11 @@ const size_t ALLOCATIONS_PER_COLLECTION = 3600; // a PIC branch in Mach-O binaries, see <rdar://problem/5971391>. #define MIN_ARRAY_SIZE (static_cast<size_t>(14)) +#if OS(SYMBIAN) +const size_t MAX_NUM_BLOCKS = 256; // Max size of collector heap set to 16 MB +static RHeap* userChunk = 0; +#endif + #if ENABLE(JSC_MULTIPLE_THREADS) #if OS(DARWIN) @@ -136,11 +146,29 @@ Heap::Heap(JSGlobalData* globalData) , m_currentThreadRegistrar(0) #endif , m_globalData(globalData) -#if OS(SYMBIAN) - , m_blockallocator(JSCCOLLECTOR_VIRTUALMEM_RESERVATION, BLOCK_SIZE) -#endif { ASSERT(globalData); + +#if OS(SYMBIAN) + // Symbian OpenC supports mmap but currently not the MAP_ANON flag. + // Using fastMalloc() does not properly align blocks on 64k boundaries + // and previous implementation was flawed/incomplete. + // UserHeap::ChunkHeap allows allocation of continuous memory and specification + // of alignment value for (symbian) cells within that heap. + // + // Clarification and mapping of terminology: + // RHeap (created by UserHeap::ChunkHeap below) is continuos memory chunk, + // which can dynamically grow up to 8 MB, + // that holds all CollectorBlocks of this session (static). + // Each symbian cell within RHeap maps to a 64kb aligned CollectorBlock. + // JSCell objects are maintained as usual within CollectorBlocks. + if (!userChunk) { + userChunk = UserHeap::ChunkHeap(0, 0, MAX_NUM_BLOCKS * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); + if (!userChunk) + CRASH(); + } +#endif // OS(SYMBIAN) + memset(&m_heap, 0, sizeof(CollectorHeap)); allocateBlock(); } @@ -183,9 +211,7 @@ void Heap::destroy() t = next; } #endif -#if OS(SYMBIAN) - m_blockallocator.destroy(); -#endif + m_globalData = 0; } @@ -195,9 +221,11 @@ NEVER_INLINE CollectorBlock* Heap::allocateBlock() vm_address_t address = 0; vm_map(current_task(), &address, BLOCK_SIZE, BLOCK_OFFSET_MASK, VM_FLAGS_ANYWHERE | VM_TAG_FOR_COLLECTOR_MEMORY, MEMORY_OBJECT_NULL, 0, FALSE, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT); #elif OS(SYMBIAN) - void* address = m_blockallocator.alloc(); - if (!address) + // Allocate a 64 kb aligned CollectorBlock + unsigned char* mask = reinterpret_cast<unsigned char*>(userChunk->Alloc(BLOCK_SIZE)); + if (!mask) CRASH(); + uintptr_t address = reinterpret_cast<uintptr_t>(mask); #elif OS(WINCE) void* address = VirtualAlloc(NULL, BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); #elif OS(WINDOWS) @@ -288,7 +316,7 @@ NEVER_INLINE void Heap::freeBlockPtr(CollectorBlock* block) #if OS(DARWIN) vm_deallocate(current_task(), reinterpret_cast<vm_address_t>(block), BLOCK_SIZE); #elif OS(SYMBIAN) - m_blockallocator.free(reinterpret_cast<void*>(block)); + userChunk->Free(reinterpret_cast<TAny*>(block)); #elif OS(WINCE) VirtualFree(block, 0, MEM_RELEASE); #elif OS(WINDOWS) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h index d3616dc..7f7a679 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h @@ -35,10 +35,6 @@ #include <pthread.h> #endif -#if OS(SYMBIAN) -#include <wtf/symbian/BlockAllocatorSymbian.h> -#endif - #define ASSERT_CLASS_FITS_IN_CELL(class) COMPILE_ASSERT(sizeof(class) <= CELL_SIZE, class_fits_in_cell) namespace JSC { @@ -171,11 +167,6 @@ namespace JSC { pthread_key_t m_currentThreadRegistrar; #endif -#if OS(SYMBIAN) - // Allocates collector blocks with correct alignment - WTF::AlignedBlockAllocator m_blockallocator; -#endif - JSGlobalData* m_globalData; }; diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/CollectorHeapIterator.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/CollectorHeapIterator.h index e4f2f91..4a38df9 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/CollectorHeapIterator.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/CollectorHeapIterator.h @@ -97,14 +97,12 @@ namespace JSC { inline LiveObjectIterator& LiveObjectIterator::operator++() { - if (m_block < m_heap.nextBlock || m_cell < m_heap.nextCell) { - advance(HeapConstants::cellsPerBlock); + advance(HeapConstants::cellsPerBlock - 1); + if (m_block < m_heap.nextBlock || (m_block == m_heap.nextBlock && m_cell < m_heap.nextCell)) return *this; - } - do { - advance(HeapConstants::cellsPerBlock); - } while (m_block < m_heap.usedBlocks && !m_heap.blocks[m_block]->marked.get(m_cell)); + while (m_block < m_heap.usedBlocks && !m_heap.blocks[m_block]->marked.get(m_cell)) + advance(HeapConstants::cellsPerBlock - 1); return *this; } diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp deleted file mode 100644 index 6a28e9e..0000000 --- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON 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. - */ - -#include "config.h" - -#if OS(SYMBIAN) - -#include "BlockAllocatorSymbian.h" - - -namespace WTF { - -/** Efficiently allocates blocks of size blockSize with blockSize alignment. - * Primarly designed for JSC Collector's needs. - * Not thread-safe. - */ -AlignedBlockAllocator::AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize ) - : m_reservation(reservationSize), - m_blockSize(blockSize) -{ - - // Get system's page size value. - SYMBIAN_PAGESIZE(m_pageSize); - - // We only accept multiples of system page size for both initial reservation and the alignment/block size - m_reservation = SYMBIAN_ROUNDUPTOMULTIPLE(m_reservation, m_pageSize); - __ASSERT_ALWAYS(SYMBIAN_ROUNDUPTOMULTIPLE(m_blockSize, m_pageSize), User::Panic(_L("AlignedBlockAllocator1"), KErrArgument)); - - // Calculate max. bit flags we need to carve a reservationSize range into blockSize-sized blocks - m_map.numBits = m_reservation / m_blockSize; - const TUint32 bitsPerWord = 8*sizeof(TUint32); - const TUint32 numWords = (m_map.numBits + bitsPerWord -1) / bitsPerWord; - - m_map.bits = new TUint32[numWords]; - __ASSERT_ALWAYS(m_map.bits, User::Panic(_L("AlignedBlockAllocator2"), KErrNoMemory)); - m_map.clearAll(); - - // Open a Symbian RChunk, and reserve requested virtual address range - // Any thread in this process can operate this rchunk due to EOwnerProcess access rights. - TInt ret = m_chunk.CreateDisconnectedLocal(0 , 0, (TInt)m_reservation , EOwnerProcess); - if (ret != KErrNone) - User::Panic(_L("AlignedBlockAllocator3"), ret); - - // This is the offset to m_chunk.Base() required to make it m_blockSize-aligned - m_offset = SYMBIAN_ROUNDUPTOMULTIPLE(TUint32(m_chunk.Base()), m_blockSize) - TUint(m_chunk.Base()); - -} - -void* AlignedBlockAllocator::alloc() -{ - - TInt freeRam = 0; - void* address = 0; - - // Look up first free slot in bit map - const TInt freeIdx = m_map.findFree(); - - // Pseudo OOM: We ate up the address space we reserved.. - // ..even though the device may have free RAM left - if (freeIdx < 0) - return 0; - - TInt ret = m_chunk.Commit(m_offset + (m_blockSize * freeIdx), m_blockSize); - if (ret != KErrNone) - return 0; // True OOM: Device didn't have physical RAM to spare - - // Updated bit to mark region as in use. - m_map.set(freeIdx); - - // Calculate address of committed region (block) - address = (void*)( (m_chunk.Base() + m_offset) + (TUint)(m_blockSize * freeIdx) ); - - return address; -} - -void AlignedBlockAllocator::free(void* block) -{ - // Calculate index of block to be freed - TInt idx = TUint(static_cast<TUint8*>(block) - m_chunk.Base() - m_offset) / m_blockSize; - - __ASSERT_DEBUG(idx >= 0 && idx < m_map.numBits, User::Panic(_L("AlignedBlockAllocator4"), KErrCorrupt)); // valid index check - __ASSERT_DEBUG(m_map.get(idx), User::Panic(_L("AlignedBlockAllocator5"), KErrCorrupt)); // in-use flag check - - // Return committed region to system RAM pool (the physical RAM becomes usable by others) - TInt ret = m_chunk.Decommit(m_offset + m_blockSize * idx, m_blockSize); - - // mark this available again - m_map.clear(idx); -} - -void AlignedBlockAllocator::destroy() -{ - // release everything! - m_chunk.Decommit(0, m_chunk.MaxSize()); - m_map.clearAll(); -} - -AlignedBlockAllocator::~AlignedBlockAllocator() -{ - destroy(); - m_chunk.Close(); - delete [] m_map.bits; -} - -} // end of namespace - -#endif // SYMBIAN diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h deleted file mode 100644 index 21422f6..0000000 --- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON 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. - */ - -#ifndef BlockAllocatorSymbian_h -#define BlockAllocatorSymbian_h - -#include <e32cmn.h> -#include <e32std.h> -#include <hal.h> - - -#define SYMBIAN_PAGESIZE(x) (HAL::Get(HALData::EMemoryPageSize, x)); -#define SYMBIAN_FREERAM(x) (HAL::Get(HALData::EMemoryRAMFree, x)); -#define SYMBIAN_ROUNDUPTOMULTIPLE(x, multipleof) ( (x + multipleof - 1) & ~(multipleof - 1) ) - -// Set sane defaults if -D<flagname=value> wasn't provided via compiler args -#ifndef JSCCOLLECTOR_VIRTUALMEM_RESERVATION -#if defined(__WINS__) - // Emulator has limited virtual address space - #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (4*1024*1024) -#else - // HW has plenty of virtual addresses - #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (128*1024*1024) -#endif -#endif - -namespace WTF { - -/** - * Allocates contiguous region of size blockSize with blockSize-aligned address. - * blockSize must be a multiple of system page size (typically 4K on Symbian/ARM) - * - * @param reservationSize Virtual address range to be reserved upon creation of chunk (bytes). - * @param blockSize Size of a single allocation. Returned address will also be blockSize-aligned. - */ -class AlignedBlockAllocator { - public: - AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize); - ~AlignedBlockAllocator(); - void destroy(); - void* alloc(); - void free(void* data); - - private: - RChunk m_chunk; // Symbian chunk that lets us reserve/commit/decommit - TUint m_offset; // offset of first committed region from base - TInt m_pageSize; // cached value of system page size, typically 4K on Symbian - TUint32 m_reservation; - TUint32 m_blockSize; - - // Tracks comitted/decommitted state of a blockSize region - struct { - - TUint32 *bits; // array of bit flags - TUint32 numBits; // number of regions to keep track of - - bool get(TUint32 n) const - { - return !!(bits[n >> 5] & (1 << (n & 0x1F))); - } - - void set(TUint32 n) - { - bits[n >> 5] |= (1 << (n & 0x1F)); - } - - void clear(TUint32 n) - { - bits[n >> 5] &= ~(1 << (n & 0x1F)); - } - - void clearAll() - { - for (TUint32 i = 0; i < numBits; i++) - clear(i); - } - - TInt findFree() const - { - for (TUint32 i = 0; i < numBits; i++) { - if (!get(i)) - return i; - } - return -1; - } - - } m_map; - -}; - -} - -#endif // end of BlockAllocatorSymbian_h - - diff --git a/src/3rdparty/javascriptcore/VERSION b/src/3rdparty/javascriptcore/VERSION index b4744b7..9991ac0 100644 --- a/src/3rdparty/javascriptcore/VERSION +++ b/src/3rdparty/javascriptcore/VERSION @@ -4,8 +4,8 @@ This is a snapshot of JavaScriptCore from The commit imported was from the - javascriptcore-snapshot-24012011 branch/tag + javascriptcore-snapshot-05102010 branch/tag and has the sha1 checksum - d143bde5ae8cff229aebd43487a2fce5e713e990 + 82ead85cfea5859044eeb25b33314dcc0fa5eea1 diff --git a/src/script/script.pro b/src/script/script.pro index 63917b1..d1633d8 100644 --- a/src/script/script.pro +++ b/src/script/script.pro @@ -81,6 +81,7 @@ include(script.pri) symbian { TARGET.UID3=0x2001B2E1 + LIBS += -lhal } symbian { -- cgit v0.12 From 86a864f906d7dcda1b1ab04d1e25e7020a53be64 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Tue, 25 Jan 2011 17:06:16 +0100 Subject: QtScript/JSC on Symbian: Enhanced memory allocator for Collector heap Cherry-picked from http://trac.webkit.org/changeset/56370 The old allocator caused QML to crash in MCL (TB10.1, week 1). Task-number: QTBUG-14293 Reviewed-by: Simon Hausmann --- .../javascriptcore/JavaScriptCore/ChangeLog | 28 +++++ .../JavaScriptCore/JavaScriptCore.pri | 3 + .../JavaScriptCore/runtime/Collector.cpp | 46 ++----- .../JavaScriptCore/runtime/Collector.h | 9 ++ .../wtf/symbian/BlockAllocatorSymbian.cpp | 132 +++++++++++++++++++++ .../wtf/symbian/BlockAllocatorSymbian.h | 120 +++++++++++++++++++ src/3rdparty/javascriptcore/VERSION | 4 +- src/script/script.pro | 1 - 8 files changed, 303 insertions(+), 40 deletions(-) create mode 100644 src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp create mode 100644 src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog index fd6c3f7..c2b1155 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog +++ b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog @@ -232,6 +232,34 @@ without using doubles, but the code would be much more complicated, and there is no important reason to stick to integers here. +2010-03-22 Siddharth Mathur <siddharth.mathur@nokia.com> + + Reviewed by Laszlo Gombos. + + [Symbian] More efficient aligned memory allocation for JSC Collector + https://bugs.webkit.org/show_bug.cgi?id=34350 + + * JavaScriptCore.pri: Added 2 new Symbian source files and HAL linkage + + * runtime/Collector.cpp: Reduced port-specific code and added private data member + (JSC::Heap::Heap): + (JSC::Heap::~Heap): + (JSC::Heap::destroy): + (JSC::Heap::allocateBlock): + (JSC::Heap::freeBlockPtr): + + * runtime/Collector.h: Added private data member + + * wtf/symbian: Added. + * wtf/symbian/BlockAllocatorSymbian.cpp: Added. + (WTF::AlignedBlockAllocator::AlignedBlockAllocator): Helper class to allocate + aligned blocks more efficiently as required by Collector + (WTF::AlignedBlockAllocator::alloc): + (WTF::AlignedBlockAllocator::free): + (WTF::AlignedBlockAllocator::destroy): + (WTF::AlignedBlockAllocator::~AlignedBlockAllocator): + * wtf/symbian/BlockAllocatorSymbian.h: Added. + 2010-03-22 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri index d75bd31..b061321 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri +++ b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri @@ -16,6 +16,7 @@ CONFIG(debug, debug|release) { symbian: { # Need to guarantee this comes before system includes of /epoc32/include MMP_RULES += "USERINCLUDE ../JavaScriptCore/profiler" + LIBS += -lhal } INCLUDEPATH = \ @@ -33,6 +34,7 @@ INCLUDEPATH = \ $$PWD/runtime \ $$PWD/wrec \ $$PWD/wtf \ + $$PWD/wtf/symbian \ $$PWD/wtf/unicode \ $$PWD/yarr \ $$PWD/API \ @@ -211,6 +213,7 @@ SOURCES += \ wtf/qt/ThreadingQt.cpp \ wtf/RandomNumber.cpp \ wtf/RefCountedLeakCounter.cpp \ + wtf/symbian/BlockAllocatorSymbian.cpp \ wtf/symbian/RegisterFileAllocatorSymbian.cpp \ wtf/ThreadingNone.cpp \ wtf/Threading.cpp \ diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp index 24873c8..42e2a35 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp @@ -53,11 +53,6 @@ #include <mach/thread_act.h> #include <mach/vm_map.h> -#elif OS(SYMBIAN) -#include <e32std.h> -#include <e32cmn.h> -#include <unistd.h> - #elif OS(WINDOWS) #include <windows.h> @@ -109,11 +104,6 @@ const size_t ALLOCATIONS_PER_COLLECTION = 3600; // a PIC branch in Mach-O binaries, see <rdar://problem/5971391>. #define MIN_ARRAY_SIZE (static_cast<size_t>(14)) -#if OS(SYMBIAN) -const size_t MAX_NUM_BLOCKS = 256; // Max size of collector heap set to 16 MB -static RHeap* userChunk = 0; -#endif - #if ENABLE(JSC_MULTIPLE_THREADS) #if OS(DARWIN) @@ -146,29 +136,11 @@ Heap::Heap(JSGlobalData* globalData) , m_currentThreadRegistrar(0) #endif , m_globalData(globalData) +#if OS(SYMBIAN) + , m_blockallocator(JSCCOLLECTOR_VIRTUALMEM_RESERVATION, BLOCK_SIZE) +#endif { ASSERT(globalData); - -#if OS(SYMBIAN) - // Symbian OpenC supports mmap but currently not the MAP_ANON flag. - // Using fastMalloc() does not properly align blocks on 64k boundaries - // and previous implementation was flawed/incomplete. - // UserHeap::ChunkHeap allows allocation of continuous memory and specification - // of alignment value for (symbian) cells within that heap. - // - // Clarification and mapping of terminology: - // RHeap (created by UserHeap::ChunkHeap below) is continuos memory chunk, - // which can dynamically grow up to 8 MB, - // that holds all CollectorBlocks of this session (static). - // Each symbian cell within RHeap maps to a 64kb aligned CollectorBlock. - // JSCell objects are maintained as usual within CollectorBlocks. - if (!userChunk) { - userChunk = UserHeap::ChunkHeap(0, 0, MAX_NUM_BLOCKS * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); - if (!userChunk) - CRASH(); - } -#endif // OS(SYMBIAN) - memset(&m_heap, 0, sizeof(CollectorHeap)); allocateBlock(); } @@ -211,7 +183,9 @@ void Heap::destroy() t = next; } #endif - +#if OS(SYMBIAN) + m_blockallocator.destroy(); +#endif m_globalData = 0; } @@ -221,11 +195,9 @@ NEVER_INLINE CollectorBlock* Heap::allocateBlock() vm_address_t address = 0; vm_map(current_task(), &address, BLOCK_SIZE, BLOCK_OFFSET_MASK, VM_FLAGS_ANYWHERE | VM_TAG_FOR_COLLECTOR_MEMORY, MEMORY_OBJECT_NULL, 0, FALSE, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT); #elif OS(SYMBIAN) - // Allocate a 64 kb aligned CollectorBlock - unsigned char* mask = reinterpret_cast<unsigned char*>(userChunk->Alloc(BLOCK_SIZE)); - if (!mask) + void* address = m_blockallocator.alloc(); + if (!address) CRASH(); - uintptr_t address = reinterpret_cast<uintptr_t>(mask); #elif OS(WINCE) void* address = VirtualAlloc(NULL, BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); #elif OS(WINDOWS) @@ -316,7 +288,7 @@ NEVER_INLINE void Heap::freeBlockPtr(CollectorBlock* block) #if OS(DARWIN) vm_deallocate(current_task(), reinterpret_cast<vm_address_t>(block), BLOCK_SIZE); #elif OS(SYMBIAN) - userChunk->Free(reinterpret_cast<TAny*>(block)); + m_blockallocator.free(reinterpret_cast<void*>(block)); #elif OS(WINCE) VirtualFree(block, 0, MEM_RELEASE); #elif OS(WINDOWS) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h index 7f7a679..d3616dc 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.h @@ -35,6 +35,10 @@ #include <pthread.h> #endif +#if OS(SYMBIAN) +#include <wtf/symbian/BlockAllocatorSymbian.h> +#endif + #define ASSERT_CLASS_FITS_IN_CELL(class) COMPILE_ASSERT(sizeof(class) <= CELL_SIZE, class_fits_in_cell) namespace JSC { @@ -167,6 +171,11 @@ namespace JSC { pthread_key_t m_currentThreadRegistrar; #endif +#if OS(SYMBIAN) + // Allocates collector blocks with correct alignment + WTF::AlignedBlockAllocator m_blockallocator; +#endif + JSGlobalData* m_globalData; }; diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp new file mode 100644 index 0000000..6a28e9e --- /dev/null +++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON 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. + */ + +#include "config.h" + +#if OS(SYMBIAN) + +#include "BlockAllocatorSymbian.h" + + +namespace WTF { + +/** Efficiently allocates blocks of size blockSize with blockSize alignment. + * Primarly designed for JSC Collector's needs. + * Not thread-safe. + */ +AlignedBlockAllocator::AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize ) + : m_reservation(reservationSize), + m_blockSize(blockSize) +{ + + // Get system's page size value. + SYMBIAN_PAGESIZE(m_pageSize); + + // We only accept multiples of system page size for both initial reservation and the alignment/block size + m_reservation = SYMBIAN_ROUNDUPTOMULTIPLE(m_reservation, m_pageSize); + __ASSERT_ALWAYS(SYMBIAN_ROUNDUPTOMULTIPLE(m_blockSize, m_pageSize), User::Panic(_L("AlignedBlockAllocator1"), KErrArgument)); + + // Calculate max. bit flags we need to carve a reservationSize range into blockSize-sized blocks + m_map.numBits = m_reservation / m_blockSize; + const TUint32 bitsPerWord = 8*sizeof(TUint32); + const TUint32 numWords = (m_map.numBits + bitsPerWord -1) / bitsPerWord; + + m_map.bits = new TUint32[numWords]; + __ASSERT_ALWAYS(m_map.bits, User::Panic(_L("AlignedBlockAllocator2"), KErrNoMemory)); + m_map.clearAll(); + + // Open a Symbian RChunk, and reserve requested virtual address range + // Any thread in this process can operate this rchunk due to EOwnerProcess access rights. + TInt ret = m_chunk.CreateDisconnectedLocal(0 , 0, (TInt)m_reservation , EOwnerProcess); + if (ret != KErrNone) + User::Panic(_L("AlignedBlockAllocator3"), ret); + + // This is the offset to m_chunk.Base() required to make it m_blockSize-aligned + m_offset = SYMBIAN_ROUNDUPTOMULTIPLE(TUint32(m_chunk.Base()), m_blockSize) - TUint(m_chunk.Base()); + +} + +void* AlignedBlockAllocator::alloc() +{ + + TInt freeRam = 0; + void* address = 0; + + // Look up first free slot in bit map + const TInt freeIdx = m_map.findFree(); + + // Pseudo OOM: We ate up the address space we reserved.. + // ..even though the device may have free RAM left + if (freeIdx < 0) + return 0; + + TInt ret = m_chunk.Commit(m_offset + (m_blockSize * freeIdx), m_blockSize); + if (ret != KErrNone) + return 0; // True OOM: Device didn't have physical RAM to spare + + // Updated bit to mark region as in use. + m_map.set(freeIdx); + + // Calculate address of committed region (block) + address = (void*)( (m_chunk.Base() + m_offset) + (TUint)(m_blockSize * freeIdx) ); + + return address; +} + +void AlignedBlockAllocator::free(void* block) +{ + // Calculate index of block to be freed + TInt idx = TUint(static_cast<TUint8*>(block) - m_chunk.Base() - m_offset) / m_blockSize; + + __ASSERT_DEBUG(idx >= 0 && idx < m_map.numBits, User::Panic(_L("AlignedBlockAllocator4"), KErrCorrupt)); // valid index check + __ASSERT_DEBUG(m_map.get(idx), User::Panic(_L("AlignedBlockAllocator5"), KErrCorrupt)); // in-use flag check + + // Return committed region to system RAM pool (the physical RAM becomes usable by others) + TInt ret = m_chunk.Decommit(m_offset + m_blockSize * idx, m_blockSize); + + // mark this available again + m_map.clear(idx); +} + +void AlignedBlockAllocator::destroy() +{ + // release everything! + m_chunk.Decommit(0, m_chunk.MaxSize()); + m_map.clearAll(); +} + +AlignedBlockAllocator::~AlignedBlockAllocator() +{ + destroy(); + m_chunk.Close(); + delete [] m_map.bits; +} + +} // end of namespace + +#endif // SYMBIAN diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h new file mode 100644 index 0000000..21422f6 --- /dev/null +++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON 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. + */ + +#ifndef BlockAllocatorSymbian_h +#define BlockAllocatorSymbian_h + +#include <e32cmn.h> +#include <e32std.h> +#include <hal.h> + + +#define SYMBIAN_PAGESIZE(x) (HAL::Get(HALData::EMemoryPageSize, x)); +#define SYMBIAN_FREERAM(x) (HAL::Get(HALData::EMemoryRAMFree, x)); +#define SYMBIAN_ROUNDUPTOMULTIPLE(x, multipleof) ( (x + multipleof - 1) & ~(multipleof - 1) ) + +// Set sane defaults if -D<flagname=value> wasn't provided via compiler args +#ifndef JSCCOLLECTOR_VIRTUALMEM_RESERVATION +#if defined(__WINS__) + // Emulator has limited virtual address space + #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (4*1024*1024) +#else + // HW has plenty of virtual addresses + #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (128*1024*1024) +#endif +#endif + +namespace WTF { + +/** + * Allocates contiguous region of size blockSize with blockSize-aligned address. + * blockSize must be a multiple of system page size (typically 4K on Symbian/ARM) + * + * @param reservationSize Virtual address range to be reserved upon creation of chunk (bytes). + * @param blockSize Size of a single allocation. Returned address will also be blockSize-aligned. + */ +class AlignedBlockAllocator { + public: + AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize); + ~AlignedBlockAllocator(); + void destroy(); + void* alloc(); + void free(void* data); + + private: + RChunk m_chunk; // Symbian chunk that lets us reserve/commit/decommit + TUint m_offset; // offset of first committed region from base + TInt m_pageSize; // cached value of system page size, typically 4K on Symbian + TUint32 m_reservation; + TUint32 m_blockSize; + + // Tracks comitted/decommitted state of a blockSize region + struct { + + TUint32 *bits; // array of bit flags + TUint32 numBits; // number of regions to keep track of + + bool get(TUint32 n) const + { + return !!(bits[n >> 5] & (1 << (n & 0x1F))); + } + + void set(TUint32 n) + { + bits[n >> 5] |= (1 << (n & 0x1F)); + } + + void clear(TUint32 n) + { + bits[n >> 5] &= ~(1 << (n & 0x1F)); + } + + void clearAll() + { + for (TUint32 i = 0; i < numBits; i++) + clear(i); + } + + TInt findFree() const + { + for (TUint32 i = 0; i < numBits; i++) { + if (!get(i)) + return i; + } + return -1; + } + + } m_map; + +}; + +} + +#endif // end of BlockAllocatorSymbian_h + + diff --git a/src/3rdparty/javascriptcore/VERSION b/src/3rdparty/javascriptcore/VERSION index 9991ac0..b4744b7 100644 --- a/src/3rdparty/javascriptcore/VERSION +++ b/src/3rdparty/javascriptcore/VERSION @@ -4,8 +4,8 @@ This is a snapshot of JavaScriptCore from The commit imported was from the - javascriptcore-snapshot-05102010 branch/tag + javascriptcore-snapshot-24012011 branch/tag and has the sha1 checksum - 82ead85cfea5859044eeb25b33314dcc0fa5eea1 + d143bde5ae8cff229aebd43487a2fce5e713e990 diff --git a/src/script/script.pro b/src/script/script.pro index d1633d8..63917b1 100644 --- a/src/script/script.pro +++ b/src/script/script.pro @@ -81,7 +81,6 @@ include(script.pri) symbian { TARGET.UID3=0x2001B2E1 - LIBS += -lhal } symbian { -- cgit v0.12 From 6c5ea196ff086b92687033208f15e36591dc70f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Wed, 6 Oct 2010 21:51:23 -0400 Subject: Add wayland lighthouse plugin --- config.tests/qpa/wayland/wayland.cpp | 7 + config.tests/qpa/wayland/wayland.pro | 6 + configure | 5 + src/plugins/platforms/platforms.pro | 4 + src/plugins/platforms/wayland/main.cpp | 72 ++++ .../platforms/wayland/qwaylandintegration.cpp | 399 +++++++++++++++++++++ .../platforms/wayland/qwaylandintegration.h | 156 ++++++++ .../platforms/wayland/qwaylandwindowsurface.cpp | 131 +++++++ .../platforms/wayland/qwaylandwindowsurface.h | 71 ++++ src/plugins/platforms/wayland/wayland.pro | 19 + 10 files changed, 870 insertions(+) create mode 100644 config.tests/qpa/wayland/wayland.cpp create mode 100644 config.tests/qpa/wayland/wayland.pro create mode 100644 src/plugins/platforms/wayland/main.cpp create mode 100644 src/plugins/platforms/wayland/qwaylandintegration.cpp create mode 100644 src/plugins/platforms/wayland/qwaylandintegration.h create mode 100644 src/plugins/platforms/wayland/qwaylandwindowsurface.cpp create mode 100644 src/plugins/platforms/wayland/qwaylandwindowsurface.h create mode 100644 src/plugins/platforms/wayland/wayland.pro diff --git a/config.tests/qpa/wayland/wayland.cpp b/config.tests/qpa/wayland/wayland.cpp new file mode 100644 index 0000000..40ff2cb --- /dev/null +++ b/config.tests/qpa/wayland/wayland.cpp @@ -0,0 +1,7 @@ +#include "wayland-client.h" +#include "wayland-glib.h" + +int main(int, char **) +{ + return 0; +} diff --git a/config.tests/qpa/wayland/wayland.pro b/config.tests/qpa/wayland/wayland.pro new file mode 100644 index 0000000..83f5efe --- /dev/null +++ b/config.tests/qpa/wayland/wayland.pro @@ -0,0 +1,6 @@ +SOURCES = client.cpp +CONFIG -= qt + +QMAKE_CXXFLAGS += $$QT_CFLAGS_WAYLAND +LIBS += $$QT_LIBS_WAYLAND -lfreetype -lfontconfig -lwayland-client + diff --git a/configure b/configure index e3c0882..e1c41ec 100755 --- a/configure +++ b/configure @@ -6185,6 +6185,11 @@ if [ "$PLATFORM_QPA" = "yes" ]; then QMakeVar set QMAKE_LIBS_FONTCONFIG "$QT_LIBS_FONTCONFIG" CFG_LIBFREETYPE=system fi + + if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qpa/wayland "Wayland" $L_FLAGS $I_FLAGS $l_FLAGS; then + QT_CONFIG="$QT_CONFIG wayland" + fi + fi if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/mac/coreservices "CoreServices" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then diff --git a/src/plugins/platforms/platforms.pro b/src/plugins/platforms/platforms.pro index 26ccd44..57015e7 100644 --- a/src/plugins/platforms/platforms.pro +++ b/src/plugins/platforms/platforms.pro @@ -2,3 +2,7 @@ TEMPLATE = subdirs SUBDIRS += minimal +contains(QT_CONFIG, wayland) { + SUBDIRS += wayland +} + diff --git a/src/plugins/platforms/wayland/main.cpp b/src/plugins/platforms/wayland/main.cpp new file mode 100644 index 0000000..056cc64 --- /dev/null +++ b/src/plugins/platforms/wayland/main.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui/QPlatformIntegrationPlugin> +#include "qwaylandintegration.h" + +QT_BEGIN_NAMESPACE + +class QWaylandIntegrationPlugin : public QPlatformIntegrationPlugin +{ +public: + QStringList keys() const; + QPlatformIntegration *create(const QString&, const QStringList&); +}; + +QStringList QWaylandIntegrationPlugin::keys() const +{ + QStringList list; + list << "Wayland"; + return list; +} + +QPlatformIntegration *QWaylandIntegrationPlugin::create(const QString& system, const QStringList& paramList) +{ + Q_UNUSED(paramList); + if (system.toLower() == "wayland") + return new QWaylandIntegration; + + return 0; +} + +Q_EXPORT_PLUGIN2(wayland, QWaylandIntegrationPlugin) + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp new file mode 100644 index 0000000..577dd28 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -0,0 +1,399 @@ +#include <QWindowSystemInterface> +#include "qwaylandintegration.h" +#include "qwaylandwindowsurface.h" +#include "qfontconfigdatabase.h" + +#include <QtGui/private/qpixmap_raster_p.h> +#include <QtGui/QPlatformWindow> + +#include <unistd.h> +#include <fcntl.h> + +extern "C" { +#include <xf86drm.h> +} + +struct wl_surface *QWaylandDisplay::createSurface() +{ + return wl_compositor_create_surface(mCompositor); +} + +struct wl_buffer *QWaylandDisplay::createShmBuffer(int fd, + int width, int height, + uint32_t stride, + struct wl_visual *visual) +{ + return wl_shm_create_buffer(mShm, fd, width, height, stride, visual); +} + +struct wl_visual *QWaylandDisplay::argbVisual() +{ + return wl_display_get_argb_visual(mDisplay); +} + +void QWaylandDisplay::drmHandleDevice(void *data, + struct wl_drm *drm, const char *device) +{ + Q_UNUSED(drm); + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + + qwd->mDeviceName = strdup(device); +} + +void QWaylandDisplay::drmHandleAuthenticated(void *data, struct wl_drm *drm) +{ + Q_UNUSED(drm); + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + + qwd->mAuthenticated = true; +} + +const struct wl_drm_listener QWaylandDisplay::drmListener = { + QWaylandDisplay::drmHandleDevice, + QWaylandDisplay::drmHandleAuthenticated +}; + +void QWaylandDisplay::outputHandleGeometry(void *data, + struct wl_output *output, + int32_t width, int32_t height) +{ + Q_UNUSED(output); + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + QWaylandScreen *screen; + + screen = new QWaylandScreen(); + screen->mGeometry = QRect(0, 0, width, height); + screen->mDepth = 32; + screen->mFormat = QImage::Format_ARGB32; + screen->mOutput = output; + + qwd->mScreens.append(screen); +} + +const struct wl_output_listener QWaylandDisplay::outputListener = { + QWaylandDisplay::outputHandleGeometry +}; + +class QWaylandInputDevice { +public: + QWaylandInputDevice(struct wl_display *display, uint32_t id); + +private: + struct wl_display *mDisplay; + struct wl_input_device *mInputDevice; + struct wl_surface *mPointerFocus; + struct wl_surface *mKeyboardFocus; + static const struct wl_input_device_listener inputDeviceListener; + Qt::MouseButtons mButtons; + QPoint mSurfacePos; + QPoint mGlobalPos; + + static void inputHandleMotion(void *data, + struct wl_input_device *input_device, + uint32_t time, + int32_t x, int32_t y, + int32_t sx, int32_t sy); + static void inputHandleButton(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t button, uint32_t state); + static void inputHandleKey(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t key, uint32_t state); + static void inputHandlePointerFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, struct wl_surface *surface, + int32_t x, int32_t y, int32_t sx, int32_t sy); + static void inputHandleKeyboardFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, + struct wl_surface *surface, + struct wl_array *keys); +}; + +QWaylandInputDevice::QWaylandInputDevice(struct wl_display *display, + uint32_t id) + : mDisplay(display) + , mInputDevice(wl_input_device_create(display, id)) + , mPointerFocus(NULL) + , mKeyboardFocus(NULL) + , mButtons(0) +{ + wl_input_device_add_listener(mInputDevice, + &inputDeviceListener, + this); + wl_input_device_set_user_data(mInputDevice, this); +} + +void QWaylandInputDevice::inputHandleMotion(void *data, + struct wl_input_device *input_device, + uint32_t time, + int32_t x, int32_t y, + int32_t surface_x, int32_t surface_y) +{ + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window = + (QWaylandWindow *) wl_surface_get_user_data(inputDevice->mPointerFocus); + + inputDevice->mSurfacePos = QPoint(surface_x, surface_y); + inputDevice->mGlobalPos = QPoint(x, y); + QWindowSystemInterface::handleMouseEvent(window->widget(), + time, + inputDevice->mSurfacePos, + inputDevice->mGlobalPos, + inputDevice->mButtons); +} + +void QWaylandInputDevice::inputHandleButton(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t button, uint32_t state) +{ + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window = + (QWaylandWindow *) wl_surface_get_user_data(inputDevice->mPointerFocus); + Qt::MouseButton qt_button; + + switch (button) { + case 272: + qt_button = Qt::LeftButton; + break; + case 273: + qt_button = Qt::RightButton; + break; + case 274: + qt_button = Qt::MidButton; + break; + default: + return; + } + + if (state) + inputDevice->mButtons |= qt_button; + else + inputDevice->mButtons &= ~qt_button; + + QWindowSystemInterface::handleMouseEvent(window->widget(), + time, + inputDevice->mSurfacePos, + inputDevice->mGlobalPos, + inputDevice->mButtons); +} + +void QWaylandInputDevice::inputHandleKey(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t key, uint32_t state) +{ +} + +void QWaylandInputDevice::inputHandlePointerFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, struct wl_surface *surface, + int32_t x, int32_t y, int32_t sx, int32_t sy) +{ + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window; + + if (inputDevice->mPointerFocus) { + window = (QWaylandWindow *) + wl_surface_get_user_data(inputDevice->mPointerFocus); + QWindowSystemInterface::handleLeaveEvent(window->widget()); + inputDevice->mPointerFocus = NULL; + } + + if (surface) { + window = (QWaylandWindow *) wl_surface_get_user_data(surface); + QWindowSystemInterface::handleEnterEvent(window->widget()); + inputDevice->mPointerFocus = surface; + } +} + +void QWaylandInputDevice::inputHandleKeyboardFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, + struct wl_surface *surface, + struct wl_array *keys) +{ + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window; + + if (inputDevice->mKeyboardFocus) { + window = (QWaylandWindow *) + wl_surface_get_user_data(inputDevice->mKeyboardFocus); + inputDevice->mKeyboardFocus = NULL; + } + + if (surface) { + window = (QWaylandWindow *) wl_surface_get_user_data(surface); + inputDevice->mKeyboardFocus = surface; + } +} + +const struct wl_input_device_listener QWaylandInputDevice::inputDeviceListener = { + QWaylandInputDevice::inputHandleMotion, + QWaylandInputDevice::inputHandleButton, + QWaylandInputDevice::inputHandleKey, + QWaylandInputDevice::inputHandlePointerFocus, + QWaylandInputDevice::inputHandleKeyboardFocus, +}; + +void QWaylandDisplay::displayHandleGlobal(struct wl_display *display, + uint32_t id, + const char *interface, + uint32_t version, void *data) +{ + Q_UNUSED(version); + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + + if (strcmp(interface, "compositor") == 0) { + qwd->mCompositor = wl_compositor_create(display, id); + } else if (strcmp(interface, "drm") == 0) { + qwd->mDrm = wl_drm_create(display, id); + wl_drm_add_listener(qwd->mDrm, &drmListener, qwd); + } else if (strcmp(interface, "shm") == 0) { + qwd->mShm = wl_shm_create(display, id); + } else if (strcmp(interface, "output") == 0) { + struct wl_output *output = wl_output_create(display, id); + wl_output_add_listener(output, &outputListener, qwd); + } else if (strcmp(interface, "input_device") == 0) { + QWaylandInputDevice *inputDevice = new QWaylandInputDevice(display, id); + qwd->mInputDevices.append(inputDevice); + } +} + +static void initial_roundtrip(void *data) +{ + bool *done = (bool *) data; + + *done = true; +} + +static const char socket_name[] = "\0wayland"; + +void QWaylandDisplay::eventDispatcher(void) +{ + wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); +} + +int +QWaylandDisplay::sourceUpdate(uint32_t mask, void *data) +{ + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + + /* FIXME: We get a callback here when we ask wl_display for the + * fd, but at that point we don't have the socket notifier as we + * need the fd to create that. We'll probably need to split that + * API into get_fd and set_update_func functions. */ + if (qwd->mWriteNotifier == NULL) + return 0; + + qwd->mWriteNotifier->setEnabled(mask & WL_DISPLAY_WRITABLE); + + return 0; +} + +void QWaylandDisplay::flushRequests(void) +{ + wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE); +} + +QWaylandDisplay::QWaylandDisplay(void) + : mWriteNotifier(0) +{ + drm_magic_t magic; + bool done; + + mDisplay = wl_display_create(socket_name, sizeof socket_name); + if (mDisplay == NULL) { + fprintf(stderr, "failed to create display: %m\n"); + return; + } + + wl_display_add_global_listener(mDisplay, + QWaylandDisplay::displayHandleGlobal, this); + + /* Process connection events. */ + wl_display_sync_callback(mDisplay, initial_roundtrip, &done); + wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE); + done = false; + while (!done) + wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); + + mFd = open(mDeviceName, O_RDWR); + if (mFd < 0) { + qWarning("drm open failed: %m\n"); + return; + } + + if (drmGetMagic(mFd, &magic)) { + qWarning("DRI2: failed to get drm magic"); + return; + } + + /* Wait for authenticated event */ + wl_drm_authenticate(mDrm, magic); + wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE); + while (!mAuthenticated) + wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); + + int fd = wl_display_get_fd(mDisplay, sourceUpdate, this); + mReadNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this); + connect(mReadNotifier, + SIGNAL(activated(int)), this, SLOT(eventDispatcher())); + + mWriteNotifier = new QSocketNotifier(fd, QSocketNotifier::Write, this); + connect(mWriteNotifier, + SIGNAL(activated(int)), this, SLOT(flushRequests())); + mWriteNotifier->setEnabled(false); +} + +QWaylandDisplay::~QWaylandDisplay(void) +{ + close(mFd); + wl_display_destroy(mDisplay); +} + +QWaylandIntegration::QWaylandIntegration() + : mFontDb(new QFontconfigDatabase()) + , mDisplay(new QWaylandDisplay()) +{ +} + +QList<QPlatformScreen *> +QWaylandIntegration::screens() const +{ + return mDisplay->screens(); +} + +QPixmapData *QWaylandIntegration::createPixmapData(QPixmapData::PixelType type) const +{ + return new QRasterPixmapData(type); +} + +QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) + : QPlatformWindow(window) + , mDisplay(display) +{ + mSurface = mDisplay->createSurface(); + wl_surface_set_user_data(mSurface, this); +} + +QWaylandWindow::~QWaylandWindow() +{ + /* mDisplay->destroySurface() */ +} + +QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const +{ + Q_UNUSED(winId); + return new QWaylandWindow(widget, mDisplay); +} + +QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId winId) const +{ + Q_UNUSED(winId); + return new QWaylandWindowSurface(widget, mDisplay); +} + +QPlatformFontDatabase *QWaylandIntegration::fontDatabase() const +{ + return mFontDb; +} diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h new file mode 100644 index 0000000..d777175 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -0,0 +1,156 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPLATFORMINTEGRATION_WAYLAND_H +#define QPLATFORMINTEGRATION_WAYLAND_H + +#include <QSocketNotifier> +#include <QObject> +#include <QtGui/QPlatformIntegration> +#include <QtGui/QPlatformScreen> + +#include <wayland-client.h> + +QT_BEGIN_NAMESPACE + +class QWaylandInputDevice; + +class QWaylandDisplay : public QObject { + Q_OBJECT; + +public: + QWaylandDisplay(void); + ~QWaylandDisplay(void); + + QList<QPlatformScreen *> screens() const { return mScreens; } + struct wl_surface *createSurface(); + struct wl_buffer *createShmBuffer(int fd, int width, int height, + uint32_t stride, + struct wl_visual *visual); + struct wl_visual *argbVisual(); + +public slots: + void eventDispatcher(void); + void flushRequests(void); + +private: + struct wl_display *mDisplay; + struct wl_compositor *mCompositor; + struct wl_drm *mDrm; + struct wl_shm *mShm; + char *mDeviceName; + int mFd; + bool mAuthenticated; + QList<QPlatformScreen *> mScreens; + QList<QWaylandInputDevice *> mInputDevices; + QSocketNotifier *mReadNotifier; + QSocketNotifier *mWriteNotifier; + + static void displayHandleGlobal(struct wl_display *display, + uint32_t id, + const char *interface, + uint32_t version, void *data); + + static void drmHandleDevice(void *data, + struct wl_drm *drm, const char *device); + static void drmHandleAuthenticated(void *data, struct wl_drm *drm); + + static void outputHandleGeometry(void *data, + struct wl_output *output, + int32_t width, int32_t height); + + static int sourceUpdate(uint32_t mask, void *data); + + static const struct wl_drm_listener drmListener; + static const struct wl_output_listener outputListener; +}; + +class QWaylandScreen : public QPlatformScreen +{ +public: + QWaylandScreen() {} + + QRect geometry() const { return mGeometry; } + int depth() const { return mDepth; } + QImage::Format format() const { return mFormat; } + +public: + QRect mGeometry; + int mDepth; + QImage::Format mFormat; + QSize mPhysicalSize; + struct wl_output *mOutput; +}; + + +class QWaylandWindow : public QPlatformWindow +{ +public: + QWaylandWindow(QWidget *window, QWaylandDisplay *display); + ~QWaylandWindow(); + struct wl_surface *surface() { return mSurface; } + +private: + struct wl_surface *mSurface; + QWaylandDisplay *mDisplay; +}; + +class QWaylandIntegration : public QPlatformIntegration +{ +public: + QWaylandIntegration(); + + QPixmapData *createPixmapData(QPixmapData::PixelType type) const; + QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const; + QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const; + + QList<QPlatformScreen *> screens() const; + + QPlatformFontDatabase *fontDatabase() const; + +private: + QPlatformFontDatabase *mFontDb; + QWaylandDisplay *mDisplay; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp new file mode 100644 index 0000000..f0f5018 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -0,0 +1,131 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylandintegration.h" +#include "qwaylandwindowsurface.h" +#include <QtCore/qdebug.h> +#include <QtGui/private/qapplication_p.h> + +#include <wayland-client.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/mman.h> + +QT_BEGIN_NAMESPACE + +QWaylandWindowSurface::QWaylandWindowSurface(QWidget *window, + QWaylandDisplay *display) + : QWindowSurface(window) + , mImage(0) + , mDisplay(display) +{ + //qDebug() << "QWaylandWindowSurface::QWaylandWindowSurface:" << (long)this; +} + +QWaylandWindowSurface::~QWaylandWindowSurface() +{ +} + +QPaintDevice *QWaylandWindowSurface::paintDevice() +{ + //qDebug() << "QWaylandWindowSurface::paintDevice"; + return mImage; +} + +void QWaylandWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) +{ + Q_UNUSED(widget); + Q_UNUSED(offset); + QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + QVector<QRect> rects = region.rects(); + const QRect *r; + int i; + + for (i = 0; i < rects.size(); i++) { + r = &rects.at(i); + wl_surface_damage(ww->surface(), + r->x(), r->y(), r->width(), r->height()); + } +} + +void QWaylandWindowSurface::resize(const QSize &size) +{ + //qDebug() << "QWaylandWindowSurface::setGeometry:" << (long)this << rect; + QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + QWindowSurface::resize(size); + QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); + + if (mImage != NULL && mImage->size() == size) + return; + + if (mImage != NULL) { + delete mImage; + munmap(mData, mSize); + } + + mStride = size.width() * 4; + mSize = mStride * size.height(); + char filename[] = "/tmp/wayland-shm-XXXXXX"; + int fd = mkstemp(filename); + if (fd < 0) + qWarning("open %s failed: %s", filename, strerror(errno)); + if (ftruncate(fd, mSize) < 0) + qWarning("ftruncate failed: %s", strerror(errno)); + mData = (uchar *) + mmap(NULL, mSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + unlink(filename); + + if (mData == (uchar *) MAP_FAILED) + qWarning("mmap /dev/zero failed: %s", strerror(errno)); + + mImage = new QImage(mData, size.width(), size.height(), mStride, format); + + struct wl_buffer *buffer = + mDisplay->createShmBuffer(fd, size.width(), size.height(), + mStride, mDisplay->argbVisual()); + wl_surface_attach(ww->surface(), buffer); + wl_surface_map(ww->surface(), 0, 0, size.width(), size.height()); + wl_buffer_destroy(buffer); + close(fd); +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h new file mode 100644 index 0000000..1054c51 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSURFACE_WAYLAND_H +#define QWINDOWSURFACE_WAYLAND_H + +#include <QtGui/private/qwindowsurface_p.h> + +#include <QtGui/QPlatformWindow> + +QT_BEGIN_NAMESPACE + +class QWaylandWindowSurface : public QWindowSurface +{ +public: + QWaylandWindowSurface(QWidget *window, QWaylandDisplay *display); + ~QWaylandWindowSurface(); + + QPaintDevice *paintDevice(); + void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); + void resize(const QSize &size); + +private: + QImage *mImage; + uchar *mData; + int mSize; + int mStride; + QWaylandDisplay *mDisplay; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro new file mode 100644 index 0000000..62ff4df --- /dev/null +++ b/src/plugins/platforms/wayland/wayland.pro @@ -0,0 +1,19 @@ +TARGET = qwayland +include(../../qpluginbase.pri) + +QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms + +SOURCES = main.cpp \ + qwaylandintegration.cpp \ + qwaylandwindowsurface.cpp + +HEADERS = qwaylandintegration.h \ + qwaylandwindowsurface.h + +INCLUDEPATH += /usr/include/libdrm +LIBS += -lwayland-client -ldrm + +include (../fontdatabases/fontconfig/fontconfig.pri) + +target.path += $$[QT_INSTALL_PLUGINS]/platforms +INSTALLS += target -- cgit v0.12 From 3c2bb14b11f590f425281184ae6a1dadb98d6326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Thu, 7 Oct 2010 10:54:39 -0400 Subject: wayland: Split input device out to its own file --- .../platforms/wayland/qwaylandinputdevice.cpp | 178 +++++++++++++++++++++ .../platforms/wayland/qwaylandintegration.cpp | 164 +------------------ .../platforms/wayland/qwaylandintegration.h | 3 + src/plugins/platforms/wayland/wayland.pro | 3 +- 4 files changed, 185 insertions(+), 163 deletions(-) create mode 100644 src/plugins/platforms/wayland/qwaylandinputdevice.cpp diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp new file mode 100644 index 0000000..eeda105 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp @@ -0,0 +1,178 @@ +#include <QWindowSystemInterface> +#include "qwaylandintegration.h" +#include "qwaylandwindowsurface.h" +#include "qfontconfigdatabase.h" + +#include <QtGui/private/qpixmap_raster_p.h> +#include <QtGui/QPlatformWindow> + +#include <unistd.h> +#include <fcntl.h> + +class QWaylandInputDevice { +public: + QWaylandInputDevice(struct wl_display *display, uint32_t id); + +private: + struct wl_display *mDisplay; + struct wl_input_device *mInputDevice; + struct wl_surface *mPointerFocus; + struct wl_surface *mKeyboardFocus; + static const struct wl_input_device_listener inputDeviceListener; + Qt::MouseButtons mButtons; + QPoint mSurfacePos; + QPoint mGlobalPos; + + static void inputHandleMotion(void *data, + struct wl_input_device *input_device, + uint32_t time, + int32_t x, int32_t y, + int32_t sx, int32_t sy); + static void inputHandleButton(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t button, uint32_t state); + static void inputHandleKey(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t key, uint32_t state); + static void inputHandlePointerFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, struct wl_surface *surface, + int32_t x, int32_t y, int32_t sx, int32_t sy); + static void inputHandleKeyboardFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, + struct wl_surface *surface, + struct wl_array *keys); +}; + +QWaylandInputDevice::QWaylandInputDevice(struct wl_display *display, + uint32_t id) + : mDisplay(display) + , mInputDevice(wl_input_device_create(display, id)) + , mPointerFocus(NULL) + , mKeyboardFocus(NULL) + , mButtons(0) +{ + wl_input_device_add_listener(mInputDevice, + &inputDeviceListener, + this); + wl_input_device_set_user_data(mInputDevice, this); +} + +void QWaylandInputDevice::inputHandleMotion(void *data, + struct wl_input_device *input_device, + uint32_t time, + int32_t x, int32_t y, + int32_t surface_x, int32_t surface_y) +{ + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window = + (QWaylandWindow *) wl_surface_get_user_data(inputDevice->mPointerFocus); + + inputDevice->mSurfacePos = QPoint(surface_x, surface_y); + inputDevice->mGlobalPos = QPoint(x, y); + QWindowSystemInterface::handleMouseEvent(window->widget(), + time, + inputDevice->mSurfacePos, + inputDevice->mGlobalPos, + inputDevice->mButtons); +} + +void QWaylandInputDevice::inputHandleButton(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t button, uint32_t state) +{ + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window = + (QWaylandWindow *) wl_surface_get_user_data(inputDevice->mPointerFocus); + Qt::MouseButton qt_button; + + switch (button) { + case 272: + qt_button = Qt::LeftButton; + break; + case 273: + qt_button = Qt::RightButton; + break; + case 274: + qt_button = Qt::MidButton; + break; + default: + return; + } + + if (state) + inputDevice->mButtons |= qt_button; + else + inputDevice->mButtons &= ~qt_button; + + QWindowSystemInterface::handleMouseEvent(window->widget(), + time, + inputDevice->mSurfacePos, + inputDevice->mGlobalPos, + inputDevice->mButtons); +} + +void QWaylandInputDevice::inputHandleKey(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t key, uint32_t state) +{ +} + +void QWaylandInputDevice::inputHandlePointerFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, struct wl_surface *surface, + int32_t x, int32_t y, int32_t sx, int32_t sy) +{ + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window; + + if (inputDevice->mPointerFocus) { + window = (QWaylandWindow *) + wl_surface_get_user_data(inputDevice->mPointerFocus); + QWindowSystemInterface::handleLeaveEvent(window->widget()); + inputDevice->mPointerFocus = NULL; + } + + if (surface) { + window = (QWaylandWindow *) wl_surface_get_user_data(surface); + QWindowSystemInterface::handleEnterEvent(window->widget()); + inputDevice->mPointerFocus = surface; + } +} + +void QWaylandInputDevice::inputHandleKeyboardFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, + struct wl_surface *surface, + struct wl_array *keys) +{ + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window; + + if (inputDevice->mKeyboardFocus) { + window = (QWaylandWindow *) + wl_surface_get_user_data(inputDevice->mKeyboardFocus); + inputDevice->mKeyboardFocus = NULL; + } + + if (surface) { + window = (QWaylandWindow *) wl_surface_get_user_data(surface); + inputDevice->mKeyboardFocus = surface; + } +} + +const struct wl_input_device_listener QWaylandInputDevice::inputDeviceListener = { + QWaylandInputDevice::inputHandleMotion, + QWaylandInputDevice::inputHandleButton, + QWaylandInputDevice::inputHandleKey, + QWaylandInputDevice::inputHandlePointerFocus, + QWaylandInputDevice::inputHandleKeyboardFocus, +}; + + +QWaylandInputDevice * +waylandInputDeviceCreate(struct wl_display *display, uint32_t id) +{ + return new QWaylandInputDevice(display, id); +} diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 577dd28..c93ff25 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -74,167 +74,6 @@ const struct wl_output_listener QWaylandDisplay::outputListener = { QWaylandDisplay::outputHandleGeometry }; -class QWaylandInputDevice { -public: - QWaylandInputDevice(struct wl_display *display, uint32_t id); - -private: - struct wl_display *mDisplay; - struct wl_input_device *mInputDevice; - struct wl_surface *mPointerFocus; - struct wl_surface *mKeyboardFocus; - static const struct wl_input_device_listener inputDeviceListener; - Qt::MouseButtons mButtons; - QPoint mSurfacePos; - QPoint mGlobalPos; - - static void inputHandleMotion(void *data, - struct wl_input_device *input_device, - uint32_t time, - int32_t x, int32_t y, - int32_t sx, int32_t sy); - static void inputHandleButton(void *data, - struct wl_input_device *input_device, - uint32_t time, uint32_t button, uint32_t state); - static void inputHandleKey(void *data, - struct wl_input_device *input_device, - uint32_t time, uint32_t key, uint32_t state); - static void inputHandlePointerFocus(void *data, - struct wl_input_device *input_device, - uint32_t time, struct wl_surface *surface, - int32_t x, int32_t y, int32_t sx, int32_t sy); - static void inputHandleKeyboardFocus(void *data, - struct wl_input_device *input_device, - uint32_t time, - struct wl_surface *surface, - struct wl_array *keys); -}; - -QWaylandInputDevice::QWaylandInputDevice(struct wl_display *display, - uint32_t id) - : mDisplay(display) - , mInputDevice(wl_input_device_create(display, id)) - , mPointerFocus(NULL) - , mKeyboardFocus(NULL) - , mButtons(0) -{ - wl_input_device_add_listener(mInputDevice, - &inputDeviceListener, - this); - wl_input_device_set_user_data(mInputDevice, this); -} - -void QWaylandInputDevice::inputHandleMotion(void *data, - struct wl_input_device *input_device, - uint32_t time, - int32_t x, int32_t y, - int32_t surface_x, int32_t surface_y) -{ - QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; - QWaylandWindow *window = - (QWaylandWindow *) wl_surface_get_user_data(inputDevice->mPointerFocus); - - inputDevice->mSurfacePos = QPoint(surface_x, surface_y); - inputDevice->mGlobalPos = QPoint(x, y); - QWindowSystemInterface::handleMouseEvent(window->widget(), - time, - inputDevice->mSurfacePos, - inputDevice->mGlobalPos, - inputDevice->mButtons); -} - -void QWaylandInputDevice::inputHandleButton(void *data, - struct wl_input_device *input_device, - uint32_t time, uint32_t button, uint32_t state) -{ - QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; - QWaylandWindow *window = - (QWaylandWindow *) wl_surface_get_user_data(inputDevice->mPointerFocus); - Qt::MouseButton qt_button; - - switch (button) { - case 272: - qt_button = Qt::LeftButton; - break; - case 273: - qt_button = Qt::RightButton; - break; - case 274: - qt_button = Qt::MidButton; - break; - default: - return; - } - - if (state) - inputDevice->mButtons |= qt_button; - else - inputDevice->mButtons &= ~qt_button; - - QWindowSystemInterface::handleMouseEvent(window->widget(), - time, - inputDevice->mSurfacePos, - inputDevice->mGlobalPos, - inputDevice->mButtons); -} - -void QWaylandInputDevice::inputHandleKey(void *data, - struct wl_input_device *input_device, - uint32_t time, uint32_t key, uint32_t state) -{ -} - -void QWaylandInputDevice::inputHandlePointerFocus(void *data, - struct wl_input_device *input_device, - uint32_t time, struct wl_surface *surface, - int32_t x, int32_t y, int32_t sx, int32_t sy) -{ - QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; - QWaylandWindow *window; - - if (inputDevice->mPointerFocus) { - window = (QWaylandWindow *) - wl_surface_get_user_data(inputDevice->mPointerFocus); - QWindowSystemInterface::handleLeaveEvent(window->widget()); - inputDevice->mPointerFocus = NULL; - } - - if (surface) { - window = (QWaylandWindow *) wl_surface_get_user_data(surface); - QWindowSystemInterface::handleEnterEvent(window->widget()); - inputDevice->mPointerFocus = surface; - } -} - -void QWaylandInputDevice::inputHandleKeyboardFocus(void *data, - struct wl_input_device *input_device, - uint32_t time, - struct wl_surface *surface, - struct wl_array *keys) -{ - QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; - QWaylandWindow *window; - - if (inputDevice->mKeyboardFocus) { - window = (QWaylandWindow *) - wl_surface_get_user_data(inputDevice->mKeyboardFocus); - inputDevice->mKeyboardFocus = NULL; - } - - if (surface) { - window = (QWaylandWindow *) wl_surface_get_user_data(surface); - inputDevice->mKeyboardFocus = surface; - } -} - -const struct wl_input_device_listener QWaylandInputDevice::inputDeviceListener = { - QWaylandInputDevice::inputHandleMotion, - QWaylandInputDevice::inputHandleButton, - QWaylandInputDevice::inputHandleKey, - QWaylandInputDevice::inputHandlePointerFocus, - QWaylandInputDevice::inputHandleKeyboardFocus, -}; - void QWaylandDisplay::displayHandleGlobal(struct wl_display *display, uint32_t id, const char *interface, @@ -254,7 +93,8 @@ void QWaylandDisplay::displayHandleGlobal(struct wl_display *display, struct wl_output *output = wl_output_create(display, id); wl_output_add_listener(output, &outputListener, qwd); } else if (strcmp(interface, "input_device") == 0) { - QWaylandInputDevice *inputDevice = new QWaylandInputDevice(display, id); + QWaylandInputDevice *inputDevice = + waylandInputDeviceCreate(display, id); qwd->mInputDevices.append(inputDevice); } } diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index d777175..20d890e 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -53,6 +53,9 @@ QT_BEGIN_NAMESPACE class QWaylandInputDevice; +QWaylandInputDevice * +waylandInputDeviceCreate(struct wl_display *display, uint32_t id); + class QWaylandDisplay : public QObject { Q_OBJECT; diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index 62ff4df..c1f5bae 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -5,7 +5,8 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms SOURCES = main.cpp \ qwaylandintegration.cpp \ - qwaylandwindowsurface.cpp + qwaylandwindowsurface.cpp \ + qwaylandinputdevice.cpp HEADERS = qwaylandintegration.h \ qwaylandwindowsurface.h -- cgit v0.12 From 918baf0ce0132d7751751c3b1a6a5cae3eb566e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Thu, 7 Oct 2010 11:46:13 -0400 Subject: wayland: Create and destroy surface at show and hide --- .../platforms/wayland/qwaylandintegration.cpp | 19 ++++++++++++++++--- .../platforms/wayland/qwaylandintegration.h | 2 ++ .../platforms/wayland/qwaylandwindowsurface.cpp | 22 +++++++++++++++------- .../platforms/wayland/qwaylandwindowsurface.h | 2 ++ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index c93ff25..277e965 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -210,15 +210,28 @@ QPixmapData *QWaylandIntegration::createPixmapData(QPixmapData::PixelType type) QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) : QPlatformWindow(window) + , mSurface(0) , mDisplay(display) { - mSurface = mDisplay->createSurface(); - wl_surface_set_user_data(mSurface, this); } QWaylandWindow::~QWaylandWindow() { - /* mDisplay->destroySurface() */ +} + +void QWaylandWindow::setVisible(bool visible) +{ + QWaylandWindowSurface *wws = + (QWaylandWindowSurface *) widget()->windowSurface(); + + if (visible) { + mSurface = mDisplay->createSurface(); + wl_surface_set_user_data(mSurface, this); + wws->attach(); + } else { + wl_surface_destroy(mSurface); + mSurface = NULL; + } } QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 20d890e..4e50f3c 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -131,6 +131,8 @@ public: ~QWaylandWindow(); struct wl_surface *surface() { return mSurface; } + void setVisible(bool visible); + private: struct wl_surface *mSurface; QWaylandDisplay *mDisplay; diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp index f0f5018..41f72d0 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -87,10 +87,19 @@ void QWaylandWindowSurface::flush(QWidget *widget, const QRegion ®ion, const } } +void QWaylandWindowSurface::attach(void) +{ + QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + + if (ww->surface()) { + wl_surface_attach(ww->surface(), mBuffer); + wl_surface_map(ww->surface(), 0, 0, mImage->width(), mImage->height()); + } +} + void QWaylandWindowSurface::resize(const QSize &size) { //qDebug() << "QWaylandWindowSurface::setGeometry:" << (long)this << rect; - QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); QWindowSurface::resize(size); QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); @@ -100,6 +109,7 @@ void QWaylandWindowSurface::resize(const QSize &size) if (mImage != NULL) { delete mImage; munmap(mData, mSize); + wl_buffer_destroy(mBuffer); } mStride = size.width() * 4; @@ -119,13 +129,11 @@ void QWaylandWindowSurface::resize(const QSize &size) mImage = new QImage(mData, size.width(), size.height(), mStride, format); - struct wl_buffer *buffer = - mDisplay->createShmBuffer(fd, size.width(), size.height(), - mStride, mDisplay->argbVisual()); - wl_surface_attach(ww->surface(), buffer); - wl_surface_map(ww->surface(), 0, 0, size.width(), size.height()); - wl_buffer_destroy(buffer); + mBuffer = mDisplay->createShmBuffer(fd, size.width(), size.height(), + mStride, mDisplay->argbVisual()); close(fd); + + attach(); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h index 1054c51..1da6ab4 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -57,6 +57,7 @@ public: QPaintDevice *paintDevice(); void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); void resize(const QSize &size); + void attach(void); private: QImage *mImage; @@ -64,6 +65,7 @@ private: int mSize; int mStride; QWaylandDisplay *mDisplay; + struct wl_buffer *mBuffer; }; QT_END_NAMESPACE -- cgit v0.12 From 4f073a5ae720fc89eda2430f3aaa9e5f4a533af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Thu, 7 Oct 2010 11:47:08 -0400 Subject: wayland: Assign a window id to wayland windows --- src/plugins/platforms/wayland/qwaylandintegration.cpp | 8 ++++++++ src/plugins/platforms/wayland/qwaylandintegration.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 277e965..01affac 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -213,12 +213,20 @@ QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) , mSurface(0) , mDisplay(display) { + static WId id = 1; + + mWindowId = id++; } QWaylandWindow::~QWaylandWindow() { } +WId QWaylandWindow::winId() const +{ + return mWindowId; +} + void QWaylandWindow::setVisible(bool visible) { QWaylandWindowSurface *wws = diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 4e50f3c..ed9ca3b 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -132,10 +132,12 @@ public: struct wl_surface *surface() { return mSurface; } void setVisible(bool visible); + WId winId() const; private: struct wl_surface *mSurface; QWaylandDisplay *mDisplay; + WId mWindowId; }; class QWaylandIntegration : public QPlatformIntegration -- cgit v0.12 From e53dd775ae46b99d61e3aebe0de6b48f94f89678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Thu, 7 Oct 2010 12:23:14 -0400 Subject: wayland: Track the QWaylandWindow in the input device instead of the surface The surface is destroyed when the window is hidden, so we can't use that for looking up the widget to send events to. --- .../platforms/wayland/qwaylandinputdevice.cpp | 29 +++++++++++++--------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp index eeda105..5bddf2f 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp @@ -16,8 +16,8 @@ public: private: struct wl_display *mDisplay; struct wl_input_device *mInputDevice; - struct wl_surface *mPointerFocus; - struct wl_surface *mKeyboardFocus; + QWaylandWindow *mPointerFocus; + QWaylandWindow *mKeyboardFocus; static const struct wl_input_device_listener inputDeviceListener; Qt::MouseButtons mButtons; QPoint mSurfacePos; @@ -65,9 +65,9 @@ void QWaylandInputDevice::inputHandleMotion(void *data, int32_t x, int32_t y, int32_t surface_x, int32_t surface_y) { + Q_UNUSED(input_device); QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; - QWaylandWindow *window = - (QWaylandWindow *) wl_surface_get_user_data(inputDevice->mPointerFocus); + QWaylandWindow *window = inputDevice->mPointerFocus; inputDevice->mSurfacePos = QPoint(surface_x, surface_y); inputDevice->mGlobalPos = QPoint(x, y); @@ -82,9 +82,9 @@ void QWaylandInputDevice::inputHandleButton(void *data, struct wl_input_device *input_device, uint32_t time, uint32_t button, uint32_t state) { + Q_UNUSED(input_device); QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; - QWaylandWindow *window = - (QWaylandWindow *) wl_surface_get_user_data(inputDevice->mPointerFocus); + QWaylandWindow *window = inputDevice->mPointerFocus; Qt::MouseButton qt_button; switch (button) { @@ -117,6 +117,9 @@ void QWaylandInputDevice::inputHandleKey(void *data, struct wl_input_device *input_device, uint32_t time, uint32_t key, uint32_t state) { + Q_UNUSED(input_device); + QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; + QWaylandWindow *window = inputDevice->mKeyboardFocus; } void QWaylandInputDevice::inputHandlePointerFocus(void *data, @@ -124,12 +127,14 @@ void QWaylandInputDevice::inputHandlePointerFocus(void *data, uint32_t time, struct wl_surface *surface, int32_t x, int32_t y, int32_t sx, int32_t sy) { + Q_UNUSED(input_device); QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; QWaylandWindow *window; + qWarning("pointer focus %p", surface); + if (inputDevice->mPointerFocus) { - window = (QWaylandWindow *) - wl_surface_get_user_data(inputDevice->mPointerFocus); + window = inputDevice->mPointerFocus; QWindowSystemInterface::handleLeaveEvent(window->widget()); inputDevice->mPointerFocus = NULL; } @@ -137,7 +142,7 @@ void QWaylandInputDevice::inputHandlePointerFocus(void *data, if (surface) { window = (QWaylandWindow *) wl_surface_get_user_data(surface); QWindowSystemInterface::handleEnterEvent(window->widget()); - inputDevice->mPointerFocus = surface; + inputDevice->mPointerFocus = window; } } @@ -147,18 +152,18 @@ void QWaylandInputDevice::inputHandleKeyboardFocus(void *data, struct wl_surface *surface, struct wl_array *keys) { + Q_UNUSED(input_device); QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; QWaylandWindow *window; if (inputDevice->mKeyboardFocus) { - window = (QWaylandWindow *) - wl_surface_get_user_data(inputDevice->mKeyboardFocus); + window = inputDevice->mKeyboardFocus; inputDevice->mKeyboardFocus = NULL; } if (surface) { window = (QWaylandWindow *) wl_surface_get_user_data(surface); - inputDevice->mKeyboardFocus = surface; + inputDevice->mKeyboardFocus = window; } } -- cgit v0.12 From 9598483764d0c95751abcfb384422916b64fd283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Thu, 7 Oct 2010 17:07:59 -0400 Subject: Use QImage::Format_ARGB32_Premultiplied for the surface --- src/plugins/platforms/wayland/qwaylandintegration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 01affac..21e7be7 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -64,7 +64,7 @@ void QWaylandDisplay::outputHandleGeometry(void *data, screen = new QWaylandScreen(); screen->mGeometry = QRect(0, 0, width, height); screen->mDepth = 32; - screen->mFormat = QImage::Format_ARGB32; + screen->mFormat = QImage::Format_ARGB32_Premultiplied; screen->mOutput = output; qwd->mScreens.append(screen); -- cgit v0.12 From a052aafacb81482f694c4c41d166439c30d12eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Fri, 8 Oct 2010 16:02:01 -0400 Subject: Cursors, keyboard support, move/resize --- .../platforms/wayland/qwaylandinputdevice.cpp | 162 ++++++++++++++----- .../platforms/wayland/qwaylandinputdevice.h | 58 +++++++ .../platforms/wayland/qwaylandintegration.cpp | 177 ++++++++++++++++++++- .../platforms/wayland/qwaylandintegration.h | 18 ++- .../platforms/wayland/qwaylandwindowsurface.cpp | 79 +++++---- .../platforms/wayland/qwaylandwindowsurface.h | 17 +- src/plugins/platforms/wayland/wayland.pro | 2 +- 7 files changed, 426 insertions(+), 87 deletions(-) create mode 100644 src/plugins/platforms/wayland/qwaylandinputdevice.h diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp index 5bddf2f..fd7a649 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp @@ -1,49 +1,14 @@ #include <QWindowSystemInterface> #include "qwaylandintegration.h" #include "qwaylandwindowsurface.h" -#include "qfontconfigdatabase.h" #include <QtGui/private/qpixmap_raster_p.h> #include <QtGui/QPlatformWindow> #include <unistd.h> #include <fcntl.h> - -class QWaylandInputDevice { -public: - QWaylandInputDevice(struct wl_display *display, uint32_t id); - -private: - struct wl_display *mDisplay; - struct wl_input_device *mInputDevice; - QWaylandWindow *mPointerFocus; - QWaylandWindow *mKeyboardFocus; - static const struct wl_input_device_listener inputDeviceListener; - Qt::MouseButtons mButtons; - QPoint mSurfacePos; - QPoint mGlobalPos; - - static void inputHandleMotion(void *data, - struct wl_input_device *input_device, - uint32_t time, - int32_t x, int32_t y, - int32_t sx, int32_t sy); - static void inputHandleButton(void *data, - struct wl_input_device *input_device, - uint32_t time, uint32_t button, uint32_t state); - static void inputHandleKey(void *data, - struct wl_input_device *input_device, - uint32_t time, uint32_t key, uint32_t state); - static void inputHandlePointerFocus(void *data, - struct wl_input_device *input_device, - uint32_t time, struct wl_surface *surface, - int32_t x, int32_t y, int32_t sx, int32_t sy); - static void inputHandleKeyboardFocus(void *data, - struct wl_input_device *input_device, - uint32_t time, - struct wl_surface *surface, - struct wl_array *keys); -}; +#include <X11/extensions/XKBcommon.h> +#include <X11/keysym.h> QWaylandInputDevice::QWaylandInputDevice(struct wl_display *display, uint32_t id) @@ -53,10 +18,20 @@ QWaylandInputDevice::QWaylandInputDevice(struct wl_display *display, , mKeyboardFocus(NULL) , mButtons(0) { + struct xkb_rule_names names; + wl_input_device_add_listener(mInputDevice, &inputDeviceListener, this); wl_input_device_set_user_data(mInputDevice, this); + + names.rules = "evdev"; + names.model = "pc105"; + names.layout = "us"; + names.variant = ""; + names.options = ""; + + mXkb = xkb_compile_keymap_from_rules(&names); } void QWaylandInputDevice::inputHandleMotion(void *data, @@ -71,6 +46,7 @@ void QWaylandInputDevice::inputHandleMotion(void *data, inputDevice->mSurfacePos = QPoint(surface_x, surface_y); inputDevice->mGlobalPos = QPoint(x, y); + inputDevice->mTime = time; QWindowSystemInterface::handleMouseEvent(window->widget(), time, inputDevice->mSurfacePos, @@ -95,7 +71,7 @@ void QWaylandInputDevice::inputHandleButton(void *data, qt_button = Qt::RightButton; break; case 274: - qt_button = Qt::MidButton; + qt_button = Qt::MiddleButton; break; default: return; @@ -106,6 +82,7 @@ void QWaylandInputDevice::inputHandleButton(void *data, else inputDevice->mButtons &= ~qt_button; + inputDevice->mTime = time; QWindowSystemInterface::handleMouseEvent(window->widget(), time, inputDevice->mSurfacePos, @@ -113,6 +90,72 @@ void QWaylandInputDevice::inputHandleButton(void *data, inputDevice->mButtons); } +static Qt::KeyboardModifiers translateModifiers(int s) +{ + const uchar qt_alt_mask = XKB_COMMON_MOD1_MASK; + const uchar qt_meta_mask = XKB_COMMON_MOD4_MASK; + + Qt::KeyboardModifiers ret = 0; + if (s & XKB_COMMON_SHIFT_MASK) + ret |= Qt::ShiftModifier; + if (s & XKB_COMMON_CONTROL_MASK) + ret |= Qt::ControlModifier; + if (s & qt_alt_mask) + ret |= Qt::AltModifier; + if (s & qt_meta_mask) + ret |= Qt::MetaModifier; + + return ret; +} + +static uint32_t translateKey(uint32_t sym, char *string, size_t size) +{ + string[0] = '\0'; + + switch (sym) { + case XK_Escape: return Qt::Key_Escape; + case XK_Tab: return Qt::Key_Tab; + case XK_ISO_Left_Tab: return Qt::Key_Backtab; + case XK_BackSpace: return Qt::Key_Backspace; + case XK_Return: return Qt::Key_Return; + case XK_Insert: return Qt::Key_Insert; + case XK_Delete: return Qt::Key_Delete; + case XK_Clear: return Qt::Key_Delete; + case XK_Pause: return Qt::Key_Pause; + case XK_Print: return Qt::Key_Print; + + case XK_Home: return Qt::Key_Home; + case XK_End: return Qt::Key_End; + case XK_Left: return Qt::Key_Left; + case XK_Up: return Qt::Key_Up; + case XK_Right: return Qt::Key_Right; + case XK_Down: return Qt::Key_Down; + case XK_Prior: return Qt::Key_PageUp; + case XK_Next: return Qt::Key_PageDown; + + case XK_Shift_L: return Qt::Key_Shift; + case XK_Shift_R: return Qt::Key_Shift; + case XK_Shift_Lock: return Qt::Key_Shift; + case XK_Control_L: return Qt::Key_Control; + case XK_Control_R: return Qt::Key_Control; + case XK_Meta_L: return Qt::Key_Meta; + case XK_Meta_R: return Qt::Key_Meta; + case XK_Alt_L: return Qt::Key_Alt; + case XK_Alt_R: return Qt::Key_Alt; + case XK_Caps_Lock: return Qt::Key_CapsLock; + case XK_Num_Lock: return Qt::Key_NumLock; + case XK_Scroll_Lock: return Qt::Key_ScrollLock; + case XK_Super_L: return Qt::Key_Super_L; + case XK_Super_R: return Qt::Key_Super_R; + case XK_Menu: return Qt::Key_Menu; + + default: + string[0] = sym; + string[1] = '\0'; + return toupper(sym); + } +} + void QWaylandInputDevice::inputHandleKey(void *data, struct wl_input_device *input_device, uint32_t time, uint32_t key, uint32_t state) @@ -120,6 +163,39 @@ void QWaylandInputDevice::inputHandleKey(void *data, Q_UNUSED(input_device); QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; QWaylandWindow *window = inputDevice->mKeyboardFocus; + uint32_t code, sym, level; + Qt::KeyboardModifiers modifiers; + QEvent::Type type; + char s[2]; + + code = key + inputDevice->mXkb->min_key_code; + + level = 0; + if (inputDevice->mModifiers & Qt::ShiftModifier && + XkbKeyGroupWidth(inputDevice->mXkb, code, 0) > 1) + level = 1; + + sym = XkbKeySymEntry(inputDevice->mXkb, code, level, 0); + + modifiers = translateModifiers(inputDevice->mXkb->map->modmap[code]); + + if (state) { + inputDevice->mModifiers |= modifiers; + type = QEvent::KeyPress; + } else { + inputDevice->mModifiers &= ~modifiers; + type = QEvent::KeyRelease; + } + + sym = translateKey(sym, s, sizeof s); + + qWarning("keycode %d, sym %d, string %d, modifiers 0x%x", + code, sym, s[0], (int) inputDevice->mModifiers); + + QWindowSystemInterface::handleKeyEvent(window->widget(), + time, type, sym, + inputDevice->mModifiers, + QString::fromLatin1(s)); } void QWaylandInputDevice::inputHandlePointerFocus(void *data, @@ -131,8 +207,6 @@ void QWaylandInputDevice::inputHandlePointerFocus(void *data, QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; QWaylandWindow *window; - qWarning("pointer focus %p", surface); - if (inputDevice->mPointerFocus) { window = inputDevice->mPointerFocus; QWindowSystemInterface::handleLeaveEvent(window->widget()); @@ -144,6 +218,8 @@ void QWaylandInputDevice::inputHandlePointerFocus(void *data, QWindowSystemInterface::handleEnterEvent(window->widget()); inputDevice->mPointerFocus = window; } + + inputDevice->mTime = time; } void QWaylandInputDevice::inputHandleKeyboardFocus(void *data, @@ -175,9 +251,7 @@ const struct wl_input_device_listener QWaylandInputDevice::inputDeviceListener = QWaylandInputDevice::inputHandleKeyboardFocus, }; - -QWaylandInputDevice * -waylandInputDeviceCreate(struct wl_display *display, uint32_t id) +void QWaylandInputDevice::attach(QWaylandBuffer *buffer, int x, int y) { - return new QWaylandInputDevice(display, id); + wl_input_device_attach(mInputDevice, mTime, buffer->mBuffer, x, y); } diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.h b/src/plugins/platforms/wayland/qwaylandinputdevice.h new file mode 100644 index 0000000..749ef70 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.h @@ -0,0 +1,58 @@ +#ifndef QWAYLANDINPUTDEVICE_H +#define QWAYLANDINPUTDEVICE_H + +#include <QSocketNotifier> +#include <QObject> +#include <QtGui/QPlatformIntegration> +#include <QtGui/QPlatformScreen> + +#include <wayland-client.h> +#include "qwaylandwindowsurface.h" + +QT_BEGIN_NAMESPACE + +class QWaylandWindow; + +class QWaylandInputDevice { +public: + QWaylandInputDevice(struct wl_display *display, uint32_t id); + void attach(QWaylandBuffer *buffer, int x, int y); + +private: + struct wl_display *mDisplay; + struct wl_input_device *mInputDevice; + QWaylandWindow *mPointerFocus; + QWaylandWindow *mKeyboardFocus; + static const struct wl_input_device_listener inputDeviceListener; + Qt::MouseButtons mButtons; + QPoint mSurfacePos; + QPoint mGlobalPos; + struct xkb_desc *mXkb; + Qt::KeyboardModifiers mModifiers; + uint32_t mTime; + + static void inputHandleMotion(void *data, + struct wl_input_device *input_device, + uint32_t time, + int32_t x, int32_t y, + int32_t sx, int32_t sy); + static void inputHandleButton(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t button, uint32_t state); + static void inputHandleKey(void *data, + struct wl_input_device *input_device, + uint32_t time, uint32_t key, uint32_t state); + static void inputHandlePointerFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, struct wl_surface *surface, + int32_t x, int32_t y, int32_t sx, int32_t sy); + static void inputHandleKeyboardFocus(void *data, + struct wl_input_device *input_device, + uint32_t time, + struct wl_surface *surface, + struct wl_array *keys); +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 21e7be7..a728f78 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -1,4 +1,6 @@ +#include <QImageReader> #include <QWindowSystemInterface> +#include <QPlatformCursor> #include "qwaylandintegration.h" #include "qwaylandwindowsurface.h" #include "qfontconfigdatabase.h" @@ -13,6 +15,150 @@ extern "C" { #include <xf86drm.h> } +class QWaylandCursor : QPlatformCursor { +public: + QWaylandCursor(QWaylandDisplay *display, + QPlatformScreen *screen) + : QPlatformCursor(screen) + , mDisplay(display) { } + + void changeCursor(QCursor *cursor, QWidget *widget); + QWaylandBuffer *mBuffer; + QWaylandDisplay *mDisplay; +}; + +#define DATADIR "/usr/share" + +static const struct pointer_image { + const char *filename; + int hotspot_x, hotspot_y; +} pointer_images[] = { + /* FIXME: Half of these are wrong... */ + /* Qt::ArrowCursor */ + { DATADIR "/wayland/left_ptr.png", 10, 5 }, + /* Qt::UpArrowCursor */ + { DATADIR "/wayland/top_side.png", 18, 8 }, + /* Qt::CrossCursor */ + { DATADIR "/wayland/top_side.png", 18, 8 }, + /* Qt::WaitCursor */ + { DATADIR "/wayland/top_side.png", 18, 8 }, + /* Qt::IBeamCursor */ + { DATADIR "/wayland/xterm.png", 15, 15 }, + /* Qt::SizeVerCursor */ + { DATADIR "/wayland/top_side.png", 18, 8 }, + /* Qt::SizeHorCursor */ + { DATADIR "/wayland/bottom_left_corner.png", 6, 30 }, + /* Qt::SizeBDiagCursor */ + { DATADIR "/wayland/bottom_right_corner.png", 28, 28 }, + /* Qt::SizeFDiagCursor */ + { DATADIR "/wayland/bottom_side.png", 16, 20 }, + /* Qt::SizeAllCursor */ + { DATADIR "/wayland/left_side.png", 10, 20 }, + /* Qt::BlankCursor */ + { DATADIR "/wayland/right_side.png", 30, 19 }, + /* Qt::SplitVCursor */ + { DATADIR "/wayland/sb_v_double_arrow.png", 15, 15 }, + /* Qt::SplitHCursor */ + { DATADIR "/wayland/sb_h_double_arrow.png", 15, 15 }, + /* Qt::PointingHandCursor */ + { DATADIR "/wayland/hand2.png", 14, 8 }, + /* Qt::ForbiddenCursor */ + { DATADIR "/wayland/top_right_corner.png", 26, 8 }, + /* Qt::WhatsThisCursor */ + { DATADIR "/wayland/top_right_corner.png", 26, 8 }, + /* Qt::BusyCursor */ + { DATADIR "/wayland/top_right_corner.png", 26, 8 }, + /* Qt::OpenHandCursor */ + { DATADIR "/wayland/hand1.png", 18, 11 }, + /* Qt::ClosedHandCursor */ + { DATADIR "/wayland/grabbing.png", 20, 17 }, + /* Qt::DragCopyCursor */ + { DATADIR "/wayland/dnd-copy.png", 13, 13 }, + /* Qt::DragMoveCursor */ + { DATADIR "/wayland/dnd-move.png", 13, 13 }, + /* Qt::DragLinkCursor */ + { DATADIR "/wayland/dnd-link.png", 13, 13 }, +}; + +void QWaylandCursor::changeCursor(QCursor *cursor, QWidget *widget) +{ + const struct pointer_image *p; + + if (widget == NULL) + return; + + p = NULL; + + switch (cursor->shape()) { + case Qt::ArrowCursor: + p = &pointer_images[cursor->shape()]; + break; + case Qt::UpArrowCursor: + case Qt::CrossCursor: + case Qt::WaitCursor: + break; + case Qt::IBeamCursor: + p = &pointer_images[cursor->shape()]; + break; + case Qt::SizeVerCursor: /* 5 */ + case Qt::SizeHorCursor: + case Qt::SizeBDiagCursor: + case Qt::SizeFDiagCursor: + case Qt::SizeAllCursor: + case Qt::BlankCursor: /* 10 */ + break; + case Qt::SplitVCursor: + case Qt::SplitHCursor: + case Qt::PointingHandCursor: + p = &pointer_images[cursor->shape()]; + break; + case Qt::ForbiddenCursor: + case Qt::WhatsThisCursor: /* 15 */ + case Qt::BusyCursor: + break; + case Qt::OpenHandCursor: + case Qt::ClosedHandCursor: + case Qt::DragCopyCursor: + case Qt::DragMoveCursor: /* 20 */ + case Qt::DragLinkCursor: + p = &pointer_images[cursor->shape()]; + break; + + default: + case Qt::BitmapCursor: + break; + } + + if (!p) { + p = &pointer_images[0]; + qWarning("unhandled cursor %d", cursor->shape()); + } + + QImageReader reader(p->filename); + + if (mBuffer == NULL || mBuffer->mImage.size() != reader.size()) { + if (mBuffer) + delete mBuffer; + + mBuffer = new QWaylandBuffer(mDisplay, reader.size(), + QImage::Format_ARGB32); + } + + reader.read(&mBuffer->mImage); + + mDisplay->setCursor(mBuffer, p->hotspot_x, p->hotspot_y); +} + +void QWaylandDisplay::setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y) +{ + /* Qt doesn't tell us which input device we should set the cursor + * for, so set it for all devices. */ + for (int i = 0; i < mInputDevices.count(); i++) { + QWaylandInputDevice *inputDevice = mInputDevices.at(i); + inputDevice->attach(buffer, x, y); + } +} + struct wl_surface *QWaylandDisplay::createSurface() { return wl_compositor_create_surface(mCompositor); @@ -53,6 +199,21 @@ const struct wl_drm_listener QWaylandDisplay::drmListener = { QWaylandDisplay::drmHandleAuthenticated }; +void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell, + uint32_t time, uint32_t edges, + struct wl_surface *surface, + int32_t x, int32_t y, + int32_t width, int32_t height) +{ + QWaylandWindow *ww = (QWaylandWindow *) wl_surface_get_user_data(surface); + + ww->configure(time, edges, x, y, width, height); +} + +const struct wl_shell_listener QWaylandDisplay::shellListener = { + QWaylandDisplay::shellHandleConfigure, +}; + void QWaylandDisplay::outputHandleGeometry(void *data, struct wl_output *output, int32_t width, int32_t height) @@ -67,6 +228,8 @@ void QWaylandDisplay::outputHandleGeometry(void *data, screen->mFormat = QImage::Format_ARGB32_Premultiplied; screen->mOutput = output; + new QWaylandCursor(qwd, screen); + qwd->mScreens.append(screen); } @@ -89,12 +252,15 @@ void QWaylandDisplay::displayHandleGlobal(struct wl_display *display, wl_drm_add_listener(qwd->mDrm, &drmListener, qwd); } else if (strcmp(interface, "shm") == 0) { qwd->mShm = wl_shm_create(display, id); + } else if (strcmp(interface, "shell") == 0) { + qwd->mShell = wl_shell_create(display, id); + wl_shell_add_listener(qwd->mShell, &shellListener, qwd); } else if (strcmp(interface, "output") == 0) { struct wl_output *output = wl_output_create(display, id); wl_output_add_listener(output, &outputListener, qwd); } else if (strcmp(interface, "input_device") == 0) { QWaylandInputDevice *inputDevice = - waylandInputDeviceCreate(display, id); + new QWaylandInputDevice(display, id); qwd->mInputDevices.append(inputDevice); } } @@ -242,6 +408,15 @@ void QWaylandWindow::setVisible(bool visible) } } +void QWaylandWindow::configure(uint32_t time, uint32_t edges, + int32_t x, int32_t y, + int32_t width, int32_t height) +{ + QRect geometry = QRect(x, y, width, height); + + QWindowSystemInterface::handleGeometryChange(widget(), geometry); +} + QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const { Q_UNUSED(winId); diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index ed9ca3b..9f0b371 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -48,13 +48,11 @@ #include <QtGui/QPlatformScreen> #include <wayland-client.h> +#include "qwaylandinputdevice.h" QT_BEGIN_NAMESPACE -class QWaylandInputDevice; - -QWaylandInputDevice * -waylandInputDeviceCreate(struct wl_display *display, uint32_t id); +class QWaylandBuffer; class QWaylandDisplay : public QObject { Q_OBJECT; @@ -70,6 +68,8 @@ public: struct wl_visual *visual); struct wl_visual *argbVisual(); + void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y); + public slots: void eventDispatcher(void); void flushRequests(void); @@ -79,6 +79,7 @@ private: struct wl_compositor *mCompositor; struct wl_drm *mDrm; struct wl_shm *mShm; + struct wl_shell *mShell; char *mDeviceName; int mFd; bool mAuthenticated; @@ -100,10 +101,17 @@ private: struct wl_output *output, int32_t width, int32_t height); + static void shellHandleConfigure(void *data, struct wl_shell *shell, + uint32_t time, uint32_t edges, + struct wl_surface *surface, + int32_t x, int32_t y, + int32_t width, int32_t height); + static int sourceUpdate(uint32_t mask, void *data); static const struct wl_drm_listener drmListener; static const struct wl_output_listener outputListener; + static const struct wl_shell_listener shellListener; }; class QWaylandScreen : public QPlatformScreen @@ -132,6 +140,8 @@ public: struct wl_surface *surface() { return mSurface; } void setVisible(bool visible); + void configure(uint32_t time, uint32_t edges, + int32_t x, int32_t y, int32_t width, int32_t height); WId winId() const; private: diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp index 41f72d0..a988d63 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -52,10 +52,46 @@ QT_BEGIN_NAMESPACE +QWaylandBuffer::QWaylandBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format) +{ + int stride = size.width() * 4; + int alloc = stride * size.height(); + char filename[] = "/tmp/wayland-shm-XXXXXX"; + int fd = mkstemp(filename); + if (fd < 0) + qWarning("open %s failed: %s", filename, strerror(errno)); + if (ftruncate(fd, alloc) < 0) { + qWarning("ftruncate failed: %s", strerror(errno)); + close(fd); + return; + } + uchar *data = (uchar *) + mmap(NULL, alloc, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + unlink(filename); + + if (data == (uchar *) MAP_FAILED) { + qWarning("mmap /dev/zero failed: %s", strerror(errno)); + close(fd); + return; + } + + mImage = QImage(data, size.width(), size.height(), stride, format); + mBuffer = display->createShmBuffer(fd, size.width(), size.height(), + stride, display->argbVisual()); + close(fd); +} + +QWaylandBuffer::~QWaylandBuffer(void) +{ + munmap((void *) mImage.constBits(), mImage.byteCount()); + wl_buffer_destroy(mBuffer); +} + QWaylandWindowSurface::QWaylandWindowSurface(QWidget *window, QWaylandDisplay *display) : QWindowSurface(window) - , mImage(0) + , mBuffer(0) , mDisplay(display) { //qDebug() << "QWaylandWindowSurface::QWaylandWindowSurface:" << (long)this; @@ -67,8 +103,7 @@ QWaylandWindowSurface::~QWaylandWindowSurface() QPaintDevice *QWaylandWindowSurface::paintDevice() { - //qDebug() << "QWaylandWindowSurface::paintDevice"; - return mImage; + return &mBuffer->mImage; } void QWaylandWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) @@ -90,10 +125,12 @@ void QWaylandWindowSurface::flush(QWidget *widget, const QRegion ®ion, const void QWaylandWindowSurface::attach(void) { QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + QRect geometry = window()->geometry(); - if (ww->surface()) { - wl_surface_attach(ww->surface(), mBuffer); - wl_surface_map(ww->surface(), 0, 0, mImage->width(), mImage->height()); + if (ww->surface() && mBuffer) { + wl_surface_attach(ww->surface(), mBuffer->mBuffer); + wl_surface_map(ww->surface(), geometry.x(), geometry.y(), + mBuffer->mImage.width(), mBuffer->mImage.height()); } } @@ -103,35 +140,13 @@ void QWaylandWindowSurface::resize(const QSize &size) QWindowSurface::resize(size); QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); - if (mImage != NULL && mImage->size() == size) + if (mBuffer != NULL && mBuffer->mImage.size() == size) return; - if (mImage != NULL) { - delete mImage; - munmap(mData, mSize); - wl_buffer_destroy(mBuffer); - } - - mStride = size.width() * 4; - mSize = mStride * size.height(); - char filename[] = "/tmp/wayland-shm-XXXXXX"; - int fd = mkstemp(filename); - if (fd < 0) - qWarning("open %s failed: %s", filename, strerror(errno)); - if (ftruncate(fd, mSize) < 0) - qWarning("ftruncate failed: %s", strerror(errno)); - mData = (uchar *) - mmap(NULL, mSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - unlink(filename); - - if (mData == (uchar *) MAP_FAILED) - qWarning("mmap /dev/zero failed: %s", strerror(errno)); - - mImage = new QImage(mData, size.width(), size.height(), mStride, format); + if (mBuffer != NULL) + delete mBuffer; - mBuffer = mDisplay->createShmBuffer(fd, size.width(), size.height(), - mStride, mDisplay->argbVisual()); - close(fd); + mBuffer = new QWaylandBuffer(mDisplay, size, format); attach(); } diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h index 1da6ab4..711b0c1 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -48,6 +48,17 @@ QT_BEGIN_NAMESPACE +class QWaylandDisplay; + +class QWaylandBuffer { +public: + QWaylandBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format); + ~QWaylandBuffer(); + QImage mImage; + struct wl_buffer *mBuffer; +}; + class QWaylandWindowSurface : public QWindowSurface { public: @@ -60,12 +71,8 @@ public: void attach(void); private: - QImage *mImage; - uchar *mData; - int mSize; - int mStride; + QWaylandBuffer *mBuffer; QWaylandDisplay *mDisplay; - struct wl_buffer *mBuffer; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index c1f5bae..f5751e2 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -12,7 +12,7 @@ HEADERS = qwaylandintegration.h \ qwaylandwindowsurface.h INCLUDEPATH += /usr/include/libdrm -LIBS += -lwayland-client -ldrm +LIBS += -lwayland-client -ldrm -lxkbcommon include (../fontdatabases/fontconfig/fontconfig.pri) -- cgit v0.12 From d0c99dada04785c95f321495c621cd18eaef8b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Thu, 14 Oct 2010 15:36:59 -0400 Subject: Initialize EGL --- .../platforms/wayland/qwaylandintegration.cpp | 161 +++++++++++++++++---- .../platforms/wayland/qwaylandintegration.h | 10 +- src/plugins/platforms/wayland/wayland.pro | 2 +- 3 files changed, 142 insertions(+), 31 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index a728f78..5882ad4 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -1,13 +1,18 @@ +#include "qfontconfigdatabase.h" + #include <QImageReader> #include <QWindowSystemInterface> #include <QPlatformCursor> -#include "qwaylandintegration.h" -#include "qwaylandwindowsurface.h" -#include "qfontconfigdatabase.h" + +#include <QtGui/QPlatformGLContext> +#include <QtGui/QPlatformWindowFormat> #include <QtGui/private/qpixmap_raster_p.h> #include <QtGui/QPlatformWindow> +#include "qwaylandintegration.h" +#include "qwaylandwindowsurface.h" + #include <unistd.h> #include <fcntl.h> @@ -182,16 +187,50 @@ void QWaylandDisplay::drmHandleDevice(void *data, { Q_UNUSED(drm); QWaylandDisplay *qwd = (QWaylandDisplay *) data; + drm_magic_t magic; qwd->mDeviceName = strdup(device); + + qwd->mFd = open(qwd->mDeviceName, O_RDWR); + if (qwd->mFd < 0) { + qWarning("drm open failed: %m"); + return; + } + + if (drmGetMagic(qwd->mFd, &magic)) { + qWarning("DRI2: failed to get drm magic"); + return; + } + + wl_drm_authenticate(qwd->mDrm, magic); } void QWaylandDisplay::drmHandleAuthenticated(void *data, struct wl_drm *drm) { Q_UNUSED(drm); QWaylandDisplay *qwd = (QWaylandDisplay *) data; + EGLint major, minor; + const char *extensions; + + qwd->mEglDisplay = eglGetDRMDisplayMESA(qwd->mFd); + if (qwd->mEglDisplay == NULL) { + qWarning("failed to create display"); + return; + } + + if (!eglInitialize(qwd->mEglDisplay, &major, &minor)) { + qWarning("failed to initialize display"); + qwd->mEglDisplay = NULL; + return; + } - qwd->mAuthenticated = true; + extensions = eglQueryString(qwd->mEglDisplay, EGL_EXTENSIONS); + if (!strstr(extensions, "EGL_KHR_surfaceless_gles2")) { + qWarning("EGL_KHR_surfaceless_opengles2 not available"); + eglTerminate(qwd->mEglDisplay); + qwd->mEglDisplay = NULL; + return; + } } const struct wl_drm_listener QWaylandDisplay::drmListener = { @@ -265,13 +304,24 @@ void QWaylandDisplay::displayHandleGlobal(struct wl_display *display, } } -static void initial_roundtrip(void *data) +static void roundtripCallback(void *data) { bool *done = (bool *) data; *done = true; } +static void forceRoundtrip(struct wl_display *display) +{ + bool done; + + wl_display_sync_callback(display, roundtripCallback, &done); + wl_display_iterate(display, WL_DISPLAY_WRITABLE); + done = false; + while (!done) + wl_display_iterate(display, WL_DISPLAY_READABLE); +} + static const char socket_name[] = "\0wayland"; void QWaylandDisplay::eventDispatcher(void) @@ -304,9 +354,6 @@ void QWaylandDisplay::flushRequests(void) QWaylandDisplay::QWaylandDisplay(void) : mWriteNotifier(0) { - drm_magic_t magic; - bool done; - mDisplay = wl_display_create(socket_name, sizeof socket_name); if (mDisplay == NULL) { fprintf(stderr, "failed to create display: %m\n"); @@ -317,28 +364,17 @@ QWaylandDisplay::QWaylandDisplay(void) QWaylandDisplay::displayHandleGlobal, this); /* Process connection events. */ - wl_display_sync_callback(mDisplay, initial_roundtrip, &done); - wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE); - done = false; - while (!done) - wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); - - mFd = open(mDeviceName, O_RDWR); - if (mFd < 0) { - qWarning("drm open failed: %m\n"); - return; - } - - if (drmGetMagic(mFd, &magic)) { - qWarning("DRI2: failed to get drm magic"); - return; - } + wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); + if (!mShm || !mDeviceName) + forceRoundtrip(mDisplay); - /* Wait for authenticated event */ - wl_drm_authenticate(mDrm, magic); - wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE); - while (!mAuthenticated) - wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); + /* Force a roundtrip to finish the drm authentication so we + * initialize EGL before proceeding */ + forceRoundtrip(mDisplay); + if (mEglDisplay == NULL) + qWarning("EGL not available"); + else + qWarning("EGL initialized"); int fd = wl_display_get_fd(mDisplay, sourceUpdate, this); mReadNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this); @@ -417,6 +453,73 @@ void QWaylandWindow::configure(uint32_t time, uint32_t edges, QWindowSystemInterface::handleGeometryChange(widget(), geometry); } +class QWaylandGLContext : public QPlatformGLContext { +public: + QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowFormat &format); + ~QWaylandGLContext(); + void makeCurrent(); + void doneCurrent(); + void swapBuffers(); + void* getProcAddress(const QString&); + QPlatformWindowFormat platformWindowFormat() const { return mFormat; } + +private: + EGLContext mContext; + QPlatformWindowFormat mFormat; + QWaylandDisplay *mDisplay; +}; + +QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowFormat &format) + : QPlatformGLContext() + , mContext(0) + , mFormat(format) + , mDisplay(wd) +{ + EGLDisplay eglDisplay; + static const EGLint contextAttribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + + eglBindAPI(EGL_OPENGL_ES_API); + eglDisplay = mDisplay->eglDisplay(); + mContext = eglCreateContext(eglDisplay, NULL, + EGL_NO_CONTEXT, contextAttribs); +} + +QWaylandGLContext::~QWaylandGLContext() +{ + if (mContext) + eglDestroyContext(mDisplay->eglDisplay(), mContext); +} + +void QWaylandGLContext::makeCurrent() +{ +} + +void QWaylandGLContext::doneCurrent() +{ +} + +void QWaylandGLContext::swapBuffers() +{ +} + +void *QWaylandGLContext::getProcAddress(const QString &string) +{ + return (void *) eglGetProcAddress(string.toLatin1().data()); +} + +QPlatformGLContext *QWaylandWindow::glContext() const +{ + if (!mGLContext) { + QWaylandWindow *that = const_cast<QWaylandWindow *>(this); + that->mGLContext = new QWaylandGLContext(mDisplay, widget()->platformWindowFormat()); + } + + return mGLContext; +} + QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const { Q_UNUSED(winId); diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 9f0b371..81819be 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -50,6 +50,11 @@ #include <wayland-client.h> #include "qwaylandinputdevice.h" +#define MESA_EGL_NO_X11_HEADERS +#define EGL_EGLEXT_PROTOTYPES +#include <EGL/egl.h> +#include <EGL/eglext.h> + QT_BEGIN_NAMESPACE class QWaylandBuffer; @@ -67,6 +72,7 @@ public: uint32_t stride, struct wl_visual *visual); struct wl_visual *argbVisual(); + EGLDisplay eglDisplay() { return mEglDisplay; } void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y); @@ -82,11 +88,11 @@ private: struct wl_shell *mShell; char *mDeviceName; int mFd; - bool mAuthenticated; QList<QPlatformScreen *> mScreens; QList<QWaylandInputDevice *> mInputDevices; QSocketNotifier *mReadNotifier; QSocketNotifier *mWriteNotifier; + EGLDisplay mEglDisplay; static void displayHandleGlobal(struct wl_display *display, uint32_t id, @@ -143,10 +149,12 @@ public: void configure(uint32_t time, uint32_t edges, int32_t x, int32_t y, int32_t width, int32_t height); WId winId() const; + QPlatformGLContext *glContext() const; private: struct wl_surface *mSurface; QWaylandDisplay *mDisplay; + QPlatformGLContext *mGLContext; WId mWindowId; }; diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index f5751e2..7a3d0b9 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -12,7 +12,7 @@ HEADERS = qwaylandintegration.h \ qwaylandwindowsurface.h INCLUDEPATH += /usr/include/libdrm -LIBS += -lwayland-client -ldrm -lxkbcommon +LIBS += -lwayland-client -ldrm -lxkbcommon -lEGL -lGLESv2 include (../fontdatabases/fontconfig/fontconfig.pri) -- cgit v0.12 From f9d0a75c066ecc464907c2021874d9e2c347d9a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net> Date: Thu, 14 Oct 2010 21:25:15 -0400 Subject: Introduce drm wayland buffer --- .../platforms/wayland/qwaylandintegration.cpp | 33 ++++-- .../platforms/wayland/qwaylandintegration.h | 7 ++ .../platforms/wayland/qwaylandwindowsurface.cpp | 130 +++++++++++++++++---- .../platforms/wayland/qwaylandwindowsurface.h | 21 ++-- 4 files changed, 151 insertions(+), 40 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 5882ad4..30e0f6a 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -28,7 +28,7 @@ public: , mDisplay(display) { } void changeCursor(QCursor *cursor, QWidget *widget); - QWaylandBuffer *mBuffer; + QWaylandShmBuffer *mBuffer; QWaylandDisplay *mDisplay; }; @@ -145,8 +145,8 @@ void QWaylandCursor::changeCursor(QCursor *cursor, QWidget *widget) if (mBuffer) delete mBuffer; - mBuffer = new QWaylandBuffer(mDisplay, reader.size(), - QImage::Format_ARGB32); + mBuffer = new QWaylandShmBuffer(mDisplay, reader.size(), + QImage::Format_ARGB32); } reader.read(&mBuffer->mImage); @@ -177,6 +177,14 @@ struct wl_buffer *QWaylandDisplay::createShmBuffer(int fd, return wl_shm_create_buffer(mShm, fd, width, height, stride, visual); } +struct wl_buffer *QWaylandDisplay::createDrmBuffer(int name, + int width, int height, + uint32_t stride, + struct wl_visual *visual) +{ + return wl_drm_create_buffer(mDrm, name, width, height, stride, visual); +} + struct wl_visual *QWaylandDisplay::argbVisual() { return wl_display_get_argb_visual(mDisplay); @@ -431,19 +439,28 @@ WId QWaylandWindow::winId() const void QWaylandWindow::setVisible(bool visible) { - QWaylandWindowSurface *wws = - (QWaylandWindowSurface *) widget()->windowSurface(); - if (visible) { mSurface = mDisplay->createSurface(); wl_surface_set_user_data(mSurface, this); - wws->attach(); + attach(mBuffer); } else { wl_surface_destroy(mSurface); mSurface = NULL; } } +void QWaylandWindow::attach(QWaylandBuffer *buffer) +{ + QRect geometry = widget()->geometry(); + + mBuffer = buffer; + if (mSurface) { + wl_surface_attach(mSurface, mBuffer->mBuffer); + wl_surface_map(mSurface, geometry.x(), geometry.y(), + geometry.width(), geometry.height()); + } +} + void QWaylandWindow::configure(uint32_t time, uint32_t edges, int32_t x, int32_t y, int32_t width, int32_t height) @@ -529,7 +546,7 @@ QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId winId) const { Q_UNUSED(winId); - return new QWaylandWindowSurface(widget, mDisplay); + return new QWaylandShmWindowSurface(widget, mDisplay); } QPlatformFontDatabase *QWaylandIntegration::fontDatabase() const diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 81819be..6267e9b 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -71,6 +71,10 @@ public: struct wl_buffer *createShmBuffer(int fd, int width, int height, uint32_t stride, struct wl_visual *visual); + struct wl_buffer *createDrmBuffer(int name, int width, int height, + uint32_t stride, + struct wl_visual *visual); + struct wl_visual *argbVisual(); EGLDisplay eglDisplay() { return mEglDisplay; } @@ -150,12 +154,15 @@ public: int32_t x, int32_t y, int32_t width, int32_t height); WId winId() const; QPlatformGLContext *glContext() const; + void attach(QWaylandBuffer *buffer); private: struct wl_surface *mSurface; QWaylandDisplay *mDisplay; QPlatformGLContext *mGLContext; WId mWindowId; + + QWaylandBuffer *mBuffer; }; class QWaylandIntegration : public QPlatformIntegration diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp index a988d63..0fd519e 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -50,10 +50,19 @@ #include <errno.h> #include <sys/mman.h> +#define GL_GLEXT_PROTOTYPES +#define EGL_EGLEXT_PROTOTYPES +#define MESA_EGL_NO_X11_HEADERS + +#include <EGL/egl.h> +#include <EGL/eglext.h> +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + QT_BEGIN_NAMESPACE -QWaylandBuffer::QWaylandBuffer(QWaylandDisplay *display, - const QSize &size, QImage::Format format) +QWaylandShmBuffer::QWaylandShmBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format) { int stride = size.width() * 4; int alloc = stride * size.height(); @@ -82,31 +91,30 @@ QWaylandBuffer::QWaylandBuffer(QWaylandDisplay *display, close(fd); } -QWaylandBuffer::~QWaylandBuffer(void) +QWaylandShmBuffer::~QWaylandShmBuffer(void) { munmap((void *) mImage.constBits(), mImage.byteCount()); wl_buffer_destroy(mBuffer); } -QWaylandWindowSurface::QWaylandWindowSurface(QWidget *window, - QWaylandDisplay *display) +QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window, + QWaylandDisplay *display) : QWindowSurface(window) , mBuffer(0) , mDisplay(display) { - //qDebug() << "QWaylandWindowSurface::QWaylandWindowSurface:" << (long)this; } -QWaylandWindowSurface::~QWaylandWindowSurface() +QWaylandShmWindowSurface::~QWaylandShmWindowSurface() { } -QPaintDevice *QWaylandWindowSurface::paintDevice() +QPaintDevice *QWaylandShmWindowSurface::paintDevice() { return &mBuffer->mImage; } -void QWaylandWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) +void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) { Q_UNUSED(widget); Q_UNUSED(offset); @@ -122,21 +130,9 @@ void QWaylandWindowSurface::flush(QWidget *widget, const QRegion ®ion, const } } -void QWaylandWindowSurface::attach(void) +void QWaylandShmWindowSurface::resize(const QSize &size) { QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); - QRect geometry = window()->geometry(); - - if (ww->surface() && mBuffer) { - wl_surface_attach(ww->surface(), mBuffer->mBuffer); - wl_surface_map(ww->surface(), geometry.x(), geometry.y(), - mBuffer->mImage.width(), mBuffer->mImage.height()); - } -} - -void QWaylandWindowSurface::resize(const QSize &size) -{ - //qDebug() << "QWaylandWindowSurface::setGeometry:" << (long)this << rect; QWindowSurface::resize(size); QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); @@ -146,9 +142,95 @@ void QWaylandWindowSurface::resize(const QSize &size) if (mBuffer != NULL) delete mBuffer; - mBuffer = new QWaylandBuffer(mDisplay, size, format); + mBuffer = new QWaylandShmBuffer(mDisplay, size, format); + + ww->attach(mBuffer); +} + - attach(); +class QWaylandDrmBuffer : public QWaylandBuffer { +public: + QWaylandDrmBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format); + ~QWaylandDrmBuffer(); + EGLImageKHR mImage; + GLuint mTexture; + QWaylandDisplay *mDisplay; +}; + +class QWaylandDrmWindowSurface : public QWindowSurface +{ +public: + QWaylandDrmWindowSurface(QWidget *window, QWaylandDisplay *display); + ~QWaylandDrmWindowSurface(); + + QPaintDevice *paintDevice(); + void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); + void resize(const QSize &size); + +private: + QWaylandDrmBuffer *mBuffer; + QWaylandDisplay *mDisplay; +}; + +QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format) + : mDisplay(display) +{ + EGLint name, stride; + EGLint imageAttribs[] = { + EGL_WIDTH, 0, + EGL_HEIGHT, 0, + EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, + EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA, + EGL_NONE + }; + + imageAttribs[1] = size.width(); + imageAttribs[3] = size.height(); + mImage = eglCreateDRMImageMESA(mDisplay->eglDisplay(), imageAttribs); + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); + + eglExportDRMImageMESA(mDisplay->eglDisplay(), + mImage, &name, NULL, &stride); + + mBuffer = display->createDrmBuffer(name, size.width(), size.height(), + stride, display->argbVisual()); +} + +QWaylandDrmBuffer::~QWaylandDrmBuffer(void) +{ + glDeleteTextures(1, &mTexture); + eglDestroyImageKHR(mDisplay->eglDisplay(), mImage); + wl_buffer_destroy(mBuffer); +} + + +QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window, + QWaylandDisplay *display) + : QWindowSurface(window) + , mBuffer(0) + , mDisplay(display) +{ +} + +QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface() +{ +} + +QPaintDevice *QWaylandDrmWindowSurface::paintDevice() +{ + return NULL; +} + +void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) +{ +} + +void QWaylandDrmWindowSurface::resize(const QSize &size) +{ } QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h index 711b0c1..2246db6 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -52,26 +52,31 @@ class QWaylandDisplay; class QWaylandBuffer { public: - QWaylandBuffer(QWaylandDisplay *display, + QWaylandBuffer() { } + virtual ~QWaylandBuffer() { } + struct wl_buffer *mBuffer; +}; + +class QWaylandShmBuffer : public QWaylandBuffer { +public: + QWaylandShmBuffer(QWaylandDisplay *display, const QSize &size, QImage::Format format); - ~QWaylandBuffer(); + ~QWaylandShmBuffer(); QImage mImage; - struct wl_buffer *mBuffer; }; -class QWaylandWindowSurface : public QWindowSurface +class QWaylandShmWindowSurface : public QWindowSurface { public: - QWaylandWindowSurface(QWidget *window, QWaylandDisplay *display); - ~QWaylandWindowSurface(); + QWaylandShmWindowSurface(QWidget *window, QWaylandDisplay *display); + ~QWaylandShmWindowSurface(); QPaintDevice *paintDevice(); void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); void resize(const QSize &size); - void attach(void); private: - QWaylandBuffer *mBuffer; + QWaylandShmBuffer *mBuffer; QWaylandDisplay *mDisplay; }; -- cgit v0.12 From 229d9d36c3ba3f4149d050a6942886b181a90db7 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Fri, 22 Oct 2010 10:30:27 -0700 Subject: Wayland: misc cleanups Unused variables, debug output. --- src/plugins/platforms/wayland/qwaylandintegration.cpp | 12 ++++++++++-- src/plugins/platforms/wayland/qwaylandwindowsurface.cpp | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 30e0f6a..248158d 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -252,6 +252,10 @@ void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell, int32_t x, int32_t y, int32_t width, int32_t height) { + Q_UNUSED(data); + Q_UNUSED(shell); + Q_UNUSED(time); + Q_UNUSED(edges); QWaylandWindow *ww = (QWaylandWindow *) wl_surface_get_user_data(surface); ww->configure(time, edges, x, y, width, height); @@ -380,9 +384,9 @@ QWaylandDisplay::QWaylandDisplay(void) * initialize EGL before proceeding */ forceRoundtrip(mDisplay); if (mEglDisplay == NULL) - qWarning("EGL not available"); + qDebug("EGL not available"); else - qWarning("EGL initialized"); + qDebug("EGL initialized"); int fd = wl_display_get_fd(mDisplay, sourceUpdate, this); mReadNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this); @@ -465,6 +469,8 @@ void QWaylandWindow::configure(uint32_t time, uint32_t edges, int32_t x, int32_t y, int32_t width, int32_t height) { + Q_UNUSED(time); + Q_UNUSED(edges); QRect geometry = QRect(x, y, width, height); QWindowSystemInterface::handleGeometryChange(widget(), geometry); @@ -546,6 +552,8 @@ QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId winId) const { Q_UNUSED(winId); + Q_UNUSED(winId); + return new QWaylandShmWindowSurface(widget, mDisplay); } diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp index 0fd519e..0954bc5 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -177,6 +177,8 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, const QSize &size, QImage::Format format) : mDisplay(display) { + Q_UNUSED(format); + EGLint name, stride; EGLint imageAttribs[] = { EGL_WIDTH, 0, -- cgit v0.12 From 506e3535c85de2b41e0d31bbcd3b726ce8adbeca Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Fri, 22 Oct 2010 10:31:03 -0700 Subject: Wayland: add GL drawing support Works with analogclock, draws upside down, fails to resize, and doesn't show GL widget with hello_es2. --- .../platforms/wayland/qwaylandintegration.cpp | 17 ++- .../platforms/wayland/qwaylandintegration.h | 5 +- .../platforms/wayland/qwaylandwindowsurface.cpp | 140 ++++++++++++++++----- .../platforms/wayland/qwaylandwindowsurface.h | 37 ++++++ 4 files changed, 167 insertions(+), 32 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 248158d..c433983 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -3,6 +3,7 @@ #include <QImageReader> #include <QWindowSystemInterface> #include <QPlatformCursor> +#include <QPaintEngine> #include <QtGui/QPlatformGLContext> #include <QtGui/QPlatformWindowFormat> @@ -10,6 +11,9 @@ #include <QtGui/private/qpixmap_raster_p.h> #include <QtGui/QPlatformWindow> +#include <private/qwindowsurface_gl_p.h> +#include <private/qpixmapdata_gl_p.h> + #include "qwaylandintegration.h" #include "qwaylandwindowsurface.h" @@ -405,9 +409,10 @@ QWaylandDisplay::~QWaylandDisplay(void) wl_display_destroy(mDisplay); } -QWaylandIntegration::QWaylandIntegration() +QWaylandIntegration::QWaylandIntegration(bool useOpenGL) : mFontDb(new QFontconfigDatabase()) , mDisplay(new QWaylandDisplay()) + , mUseOpenGL(useOpenGL) { } @@ -419,6 +424,8 @@ QWaylandIntegration::screens() const QPixmapData *QWaylandIntegration::createPixmapData(QPixmapData::PixelType type) const { + if (mUseOpenGL) + return new QGLPixmapData(type); return new QRasterPixmapData(type); } @@ -426,6 +433,7 @@ QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) : QPlatformWindow(window) , mSurface(0) , mDisplay(display) + , mGLContext(0) { static WId id = 1; @@ -434,6 +442,8 @@ QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) QWaylandWindow::~QWaylandWindow() { + if (mGLContext) + delete mGLContext; } WId QWaylandWindow::winId() const @@ -508,6 +518,7 @@ QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowF eglDisplay = mDisplay->eglDisplay(); mContext = eglCreateContext(eglDisplay, NULL, EGL_NO_CONTEXT, contextAttribs); + eglMakeCurrent(eglDisplay, NULL, NULL, mContext); } QWaylandGLContext::~QWaylandGLContext() @@ -518,10 +529,12 @@ QWaylandGLContext::~QWaylandGLContext() void QWaylandGLContext::makeCurrent() { + eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); } void QWaylandGLContext::doneCurrent() { + eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); } void QWaylandGLContext::swapBuffers() @@ -554,6 +567,8 @@ QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId wi Q_UNUSED(winId); Q_UNUSED(winId); + if (mUseOpenGL) + return new QWaylandDrmWindowSurface(widget, mDisplay); return new QWaylandShmWindowSurface(widget, mDisplay); } diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 6267e9b..70fb538 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -46,6 +46,7 @@ #include <QObject> #include <QtGui/QPlatformIntegration> #include <QtGui/QPlatformScreen> +#include "qgl.h" #include <wayland-client.h> #include "qwaylandinputdevice.h" @@ -155,6 +156,7 @@ public: WId winId() const; QPlatformGLContext *glContext() const; void attach(QWaylandBuffer *buffer); + QWaylandBuffer *getBuffer(void) { return mBuffer; } private: struct wl_surface *mSurface; @@ -168,7 +170,7 @@ private: class QWaylandIntegration : public QPlatformIntegration { public: - QWaylandIntegration(); + QWaylandIntegration(bool useOpenGL = false); QPixmapData *createPixmapData(QPixmapData::PixelType type) const; QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const; @@ -181,6 +183,7 @@ public: private: QPlatformFontDatabase *mFontDb; QWaylandDisplay *mDisplay; + bool mUseOpenGL; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp index 0954bc5..78900ba 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -39,10 +39,18 @@ ** ****************************************************************************/ -#include "qwaylandintegration.h" -#include "qwaylandwindowsurface.h" +#define GL_GLEXT_PROTOTYPES +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + +#include <QGLFramebufferObject> #include <QtCore/qdebug.h> #include <QtGui/private/qapplication_p.h> +#include <QtOpenGL/private/qgl_p.h> +#include <QtOpenGL/private/qglpaintdevice_p.h> + +#include "qwaylandintegration.h" +#include "qwaylandwindowsurface.h" #include <wayland-client.h> #include <unistd.h> @@ -50,15 +58,6 @@ #include <errno.h> #include <sys/mman.h> -#define GL_GLEXT_PROTOTYPES -#define EGL_EGLEXT_PROTOTYPES -#define MESA_EGL_NO_X11_HEADERS - -#include <EGL/egl.h> -#include <EGL/eglext.h> -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - QT_BEGIN_NAMESPACE QWaylandShmBuffer::QWaylandShmBuffer(QWaylandDisplay *display, @@ -147,35 +146,77 @@ void QWaylandShmWindowSurface::resize(const QSize &size) ww->attach(mBuffer); } - -class QWaylandDrmBuffer : public QWaylandBuffer { +class QWaylandPaintDevice : public QGLPaintDevice +{ public: - QWaylandDrmBuffer(QWaylandDisplay *display, - const QSize &size, QImage::Format format); - ~QWaylandDrmBuffer(); - EGLImageKHR mImage; - GLuint mTexture; + QWaylandPaintDevice(QWaylandDisplay *display, QWidget *widget) + : QGLPaintDevice(), mDisplay(display), mWidget(widget) + { + QGLFormat format; + mContext = new QGLContext(format, widget); + mContext->create(); + glGenFramebuffers(1, &mFbo); + glGenRenderbuffers(1, &mRbo); + } + ~QWaylandPaintDevice() + { + glDeleteFramebuffers(1, &mFbo); + glDeleteRenderbuffers(1, &mRbo); + } + + QSize size() const { return mWidget->size(); } + QGLContext *context() const { return mContext; } + QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); } + + void beginPaint(); + void endPaint(); +private: QWaylandDisplay *mDisplay; + QWidget *mWidget; + QGLContext *mContext; + GLuint mFbo, mRbo; }; -class QWaylandDrmWindowSurface : public QWindowSurface +void QWaylandPaintDevice::beginPaint(void) { -public: - QWaylandDrmWindowSurface(QWidget *window, QWaylandDisplay *display); - ~QWaylandDrmWindowSurface(); + QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); + QWaylandDrmBuffer *mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); + QPlatformGLContext *ctx = mWindow->glContext(); + QRect geometry = mWidget->geometry(); - QPaintDevice *paintDevice(); - void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); - void resize(const QSize &size); + QGLPaintDevice::beginPaint(); -private: - QWaylandDrmBuffer *mBuffer; - QWaylandDisplay *mDisplay; -}; + ctx->makeCurrent(); + glBindFramebuffer(GL_FRAMEBUFFER, mFbo); + glBindRenderbuffer(GL_RENDERBUFFER, mRbo); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mBuffer->mImage); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, mRbo); +} + +void QWaylandPaintDevice::endPaint(void) +{ + QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); + QPlatformGLContext *ctx = mWindow->glContext(); + QRect geometry = mWidget->geometry(); + + wl_surface_damage(mWindow->surface(), 0, 0, + geometry.width(), geometry.height()); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + ctx->doneCurrent(); + + QGLPaintDevice::endPaint(); +} + +/* + * Shared DRM surface for GL based drawing + */ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, const QSize &size, QImage::Format format) : mDisplay(display) + , mSize(size) { Q_UNUSED(format); @@ -216,23 +257,62 @@ QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window, , mBuffer(0) , mDisplay(display) { + mPaintDevice = new QWaylandPaintDevice(display, window); } QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface() { + delete mPaintDevice; } QPaintDevice *QWaylandDrmWindowSurface::paintDevice() { - return NULL; + return mPaintDevice; } void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) { + Q_UNUSED(region); + Q_UNUSED(offset); + Q_UNUSED(widget); +#if 0 + GLuint surf_rbo, surf_fbo; + QWaylandWindow *mWindow = (QWaylandWindow *)widget->platformWindow(); + QPlatformGLContext *ctx = mWindow->glContext(); + QRect geometry = widget->geometry(); + + ctx->makeCurrent(); + + glGenFramebuffers(1, &surf_fbo); + glBindFramebuffer(GL_FRAMEBUFFER, surf_fbo); + glGenRenderbuffers(1, &surf_rbo); + glBindRenderbuffer(GL_RENDERBUFFER, surf_rbo); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mBuffer->mImage); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, surf_rbo); + + wl_surface_damage(mWindow->surface(), 0, 0, + geometry.width(), geometry.height()); + + ctx->doneCurrent(); +#endif } void QWaylandDrmWindowSurface::resize(const QSize &size) { + QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + QWindowSurface::resize(size); + QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); + + if (mBuffer != NULL && mBuffer->mSize == size) + return; + + if (mBuffer != NULL) + delete mBuffer; + + mBuffer = new QWaylandDrmBuffer(mDisplay, size, format); + + ww->attach(mBuffer); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h index 2246db6..a033531 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -42,10 +42,18 @@ #ifndef QWINDOWSURFACE_WAYLAND_H #define QWINDOWSURFACE_WAYLAND_H +#include <QGLFramebufferObject> #include <QtGui/private/qwindowsurface_p.h> #include <QtGui/QPlatformWindow> +#define MESA_EGL_NO_X11_HEADERS +#define EGL_EGLEXT_PROTOTYPES +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include <QtOpenGL/qgl.h> + QT_BEGIN_NAMESPACE class QWaylandDisplay; @@ -80,6 +88,35 @@ private: QWaylandDisplay *mDisplay; }; +class QWaylandDrmBuffer : public QWaylandBuffer { +public: + QWaylandDrmBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format); + ~QWaylandDrmBuffer(); + EGLImageKHR mImage; + GLuint mTexture; + QWaylandDisplay *mDisplay; + QGLFramebufferObject *pdev; + QSize mSize; +}; + +class QWaylandDrmWindowSurface : public QWindowSurface +{ +public: + QWaylandDrmWindowSurface(QWidget *window, QWaylandDisplay *display); + ~QWaylandDrmWindowSurface(); + + QPaintDevice *paintDevice(); + void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); + void resize(const QSize &size); + +private: + QWaylandDrmBuffer *mBuffer; + QWaylandDisplay *mDisplay; + QPaintDevice *mPaintDevice; +}; + + QT_END_NAMESPACE #endif -- cgit v0.12 From 632b53c1e2704cf1f922f5b0378693361abb7a3d Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Fri, 22 Oct 2010 14:00:08 -0700 Subject: Wayland: silence unused variable warnings in qwaylandinputdevice.cpp --- src/plugins/platforms/wayland/qwaylandinputdevice.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp index fd7a649..6d489b6 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp @@ -110,6 +110,7 @@ static Qt::KeyboardModifiers translateModifiers(int s) static uint32_t translateKey(uint32_t sym, char *string, size_t size) { + Q_UNUSED(size); string[0] = '\0'; switch (sym) { @@ -204,6 +205,10 @@ void QWaylandInputDevice::inputHandlePointerFocus(void *data, int32_t x, int32_t y, int32_t sx, int32_t sy) { Q_UNUSED(input_device); + Q_UNUSED(x); + Q_UNUSED(y); + Q_UNUSED(sx); + Q_UNUSED(sy); QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; QWaylandWindow *window; @@ -229,6 +234,8 @@ void QWaylandInputDevice::inputHandleKeyboardFocus(void *data, struct wl_array *keys) { Q_UNUSED(input_device); + Q_UNUSED(time); + Q_UNUSED(keys); QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data; QWaylandWindow *window; -- cgit v0.12 From ca63274bd2e4def7b6b8c8daec978bb5e44faf6e Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Mon, 25 Oct 2010 11:36:45 -0700 Subject: Wayland: add waylandgl platform type This will set mUseOpenGL when -platform waylandgl is passed to clients. --- src/plugins/platforms/wayland/main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/platforms/wayland/main.cpp b/src/plugins/platforms/wayland/main.cpp index 056cc64..1bca661 100644 --- a/src/plugins/platforms/wayland/main.cpp +++ b/src/plugins/platforms/wayland/main.cpp @@ -55,6 +55,7 @@ QStringList QWaylandIntegrationPlugin::keys() const { QStringList list; list << "Wayland"; + list << "WaylandGL"; return list; } @@ -63,6 +64,8 @@ QPlatformIntegration *QWaylandIntegrationPlugin::create(const QString& system, c Q_UNUSED(paramList); if (system.toLower() == "wayland") return new QWaylandIntegration; + if (system.toLower() == "waylandgl") + return new QWaylandIntegration(true); return 0; } -- cgit v0.12 From 4e417fd2d89c99184c939296d969a6fd312c9257 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Mon, 25 Oct 2010 11:38:29 -0700 Subject: Wayland: add partial GL widget support GL widgets need a platform GL context. Add one to get hellogl_es2 limping along. --- .../platforms/wayland/qwaylandintegration.cpp | 46 +++++++++++++++++-- .../platforms/wayland/qwaylandintegration.h | 1 + .../platforms/wayland/qwaylandwindowsurface.cpp | 51 ++++------------------ src/plugins/platforms/wayland/wayland.pro | 4 +- 4 files changed, 56 insertions(+), 46 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index c433983..9ac22e8 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -1,3 +1,7 @@ +#define GL_GLEXT_PROTOTYPES +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + #include "qfontconfigdatabase.h" #include <QImageReader> @@ -434,6 +438,7 @@ QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) , mSurface(0) , mDisplay(display) , mGLContext(0) + , mBuffer(0) { static WId id = 1; @@ -451,6 +456,14 @@ WId QWaylandWindow::winId() const return mWindowId; } +void QWaylandWindow::setParent(const QPlatformWindow *parent) +{ + QWaylandWindow *wParent = (QWaylandWindow *)parent; + + mSurface = wParent->surface(); + wParent->attach(mBuffer); +} + void QWaylandWindow::setVisible(bool visible) { if (visible) { @@ -488,7 +501,7 @@ void QWaylandWindow::configure(uint32_t time, uint32_t edges, class QWaylandGLContext : public QPlatformGLContext { public: - QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowFormat &format); + QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format); ~QWaylandGLContext(); void makeCurrent(); void doneCurrent(); @@ -500,13 +513,16 @@ private: EGLContext mContext; QPlatformWindowFormat mFormat; QWaylandDisplay *mDisplay; + QWaylandWindow *mWindow; + GLuint mFbo, mRbo; }; -QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowFormat &format) +QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format) : QPlatformGLContext() , mContext(0) , mFormat(format) , mDisplay(wd) + , mWindow(window) { EGLDisplay eglDisplay; static const EGLint contextAttribs[] = { @@ -519,26 +535,50 @@ QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowF mContext = eglCreateContext(eglDisplay, NULL, EGL_NO_CONTEXT, contextAttribs); eglMakeCurrent(eglDisplay, NULL, NULL, mContext); + + glGenFramebuffers(1, &mFbo); + glGenRenderbuffers(1, &mRbo); } QWaylandGLContext::~QWaylandGLContext() { if (mContext) eglDestroyContext(mDisplay->eglDisplay(), mContext); + glDeleteFramebuffers(1, &mFbo); + glDeleteRenderbuffers(1, &mRbo); } void QWaylandGLContext::makeCurrent() { + QWaylandDrmBuffer *mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); + QRect geometry = mWindow->geometry(); + eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); + if (!mBuffer) + return; + glBindFramebuffer(GL_FRAMEBUFFER, mFbo); + glBindRenderbuffer(GL_RENDERBUFFER, mRbo); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mBuffer->mImage); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, mRbo); } void QWaylandGLContext::doneCurrent() { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindRenderbuffer(GL_RENDERBUFFER, 0); eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); } void QWaylandGLContext::swapBuffers() { + QRect geometry = mWindow->geometry(); + + if (!mWindow->surface()) + return; + + wl_surface_damage(mWindow->surface(), 0, 0, + geometry.width(), geometry.height()); } void *QWaylandGLContext::getProcAddress(const QString &string) @@ -550,7 +590,7 @@ QPlatformGLContext *QWaylandWindow::glContext() const { if (!mGLContext) { QWaylandWindow *that = const_cast<QWaylandWindow *>(this); - that->mGLContext = new QWaylandGLContext(mDisplay, widget()->platformWindowFormat()); + that->mGLContext = new QWaylandGLContext(mDisplay, that, widget()->platformWindowFormat()); } return mGLContext; diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 70fb538..e26f9e3 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -154,6 +154,7 @@ public: void configure(uint32_t time, uint32_t edges, int32_t x, int32_t y, int32_t width, int32_t height); WId winId() const; + void setParent(const QPlatformWindow *parent); QPlatformGLContext *glContext() const; void attach(QWaylandBuffer *buffer); QWaylandBuffer *getBuffer(void) { return mBuffer; } diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp index 78900ba..6e7fa89 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -155,13 +155,6 @@ public: QGLFormat format; mContext = new QGLContext(format, widget); mContext->create(); - glGenFramebuffers(1, &mFbo); - glGenRenderbuffers(1, &mRbo); - } - ~QWaylandPaintDevice() - { - glDeleteFramebuffers(1, &mFbo); - glDeleteRenderbuffers(1, &mRbo); } QSize size() const { return mWidget->size(); } @@ -174,25 +167,16 @@ private: QWaylandDisplay *mDisplay; QWidget *mWidget; QGLContext *mContext; - GLuint mFbo, mRbo; }; void QWaylandPaintDevice::beginPaint(void) { QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); - QWaylandDrmBuffer *mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); QPlatformGLContext *ctx = mWindow->glContext(); - QRect geometry = mWidget->geometry(); QGLPaintDevice::beginPaint(); ctx->makeCurrent(); - - glBindFramebuffer(GL_FRAMEBUFFER, mFbo); - glBindRenderbuffer(GL_RENDERBUFFER, mRbo); - glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mBuffer->mImage); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, mRbo); } void QWaylandPaintDevice::endPaint(void) @@ -201,10 +185,6 @@ void QWaylandPaintDevice::endPaint(void) QPlatformGLContext *ctx = mWindow->glContext(); QRect geometry = mWidget->geometry(); - wl_surface_damage(mWindow->surface(), 0, 0, - geometry.width(), geometry.height()); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glBindRenderbuffer(GL_RENDERBUFFER, 0); ctx->doneCurrent(); QGLPaintDevice::endPaint(); @@ -272,30 +252,17 @@ QPaintDevice *QWaylandDrmWindowSurface::paintDevice() void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) { - Q_UNUSED(region); Q_UNUSED(offset); - Q_UNUSED(widget); -#if 0 - GLuint surf_rbo, surf_fbo; - QWaylandWindow *mWindow = (QWaylandWindow *)widget->platformWindow(); - QPlatformGLContext *ctx = mWindow->glContext(); - QRect geometry = widget->geometry(); - - ctx->makeCurrent(); - - glGenFramebuffers(1, &surf_fbo); - glBindFramebuffer(GL_FRAMEBUFFER, surf_fbo); - glGenRenderbuffers(1, &surf_rbo); - glBindRenderbuffer(GL_RENDERBUFFER, surf_rbo); - glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mBuffer->mImage); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, surf_rbo); - - wl_surface_damage(mWindow->surface(), 0, 0, - geometry.width(), geometry.height()); + QWaylandWindow *ww = (QWaylandWindow *) widget->platformWindow(); + QVector<QRect> rects = region.rects(); + const QRect *r; + int i; - ctx->doneCurrent(); -#endif + for (i = 0; i < rects.size(); i++) { + r = &rects.at(i); + wl_surface_damage(ww->surface(), + r->x(), r->y(), r->width(), r->height()); + } } void QWaylandDrmWindowSurface::resize(const QSize &size) diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index 7a3d0b9..ec3f9d3 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -11,7 +11,9 @@ SOURCES = main.cpp \ HEADERS = qwaylandintegration.h \ qwaylandwindowsurface.h -INCLUDEPATH += /usr/include/libdrm +contains(QT_CONFIG, opengl) { + QT += opengl +} LIBS += -lwayland-client -ldrm -lxkbcommon -lEGL -lGLESv2 include (../fontdatabases/fontconfig/fontconfig.pri) -- cgit v0.12 From 8288733d680bba6be762ed0e26aa4e95cdfe68e8 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Wed, 27 Oct 2010 14:38:03 -0700 Subject: Wayland: put context & drawing objects into the drm surface Even GL widgets will allocate window surfaces, so share everything there. This still leaves a hole when we mix GL widgets and the raster back end (the created platform GL context won't have a DRM buffer to use for its objects & context), but that won't work right now anyway... --- .../platforms/wayland/qwaylandintegration.cpp | 34 ++++------------------ .../platforms/wayland/qwaylandwindowsurface.cpp | 19 ++++++++++++ .../platforms/wayland/qwaylandwindowsurface.h | 2 ++ 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 9ac22e8..6842dbf 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -510,42 +510,21 @@ public: QPlatformWindowFormat platformWindowFormat() const { return mFormat; } private: - EGLContext mContext; QPlatformWindowFormat mFormat; QWaylandDisplay *mDisplay; QWaylandWindow *mWindow; - GLuint mFbo, mRbo; }; QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format) : QPlatformGLContext() - , mContext(0) , mFormat(format) , mDisplay(wd) , mWindow(window) { - EGLDisplay eglDisplay; - static const EGLint contextAttribs[] = { - EGL_CONTEXT_CLIENT_VERSION, 2, - EGL_NONE - }; - - eglBindAPI(EGL_OPENGL_ES_API); - eglDisplay = mDisplay->eglDisplay(); - mContext = eglCreateContext(eglDisplay, NULL, - EGL_NO_CONTEXT, contextAttribs); - eglMakeCurrent(eglDisplay, NULL, NULL, mContext); - - glGenFramebuffers(1, &mFbo); - glGenRenderbuffers(1, &mRbo); } QWaylandGLContext::~QWaylandGLContext() { - if (mContext) - eglDestroyContext(mDisplay->eglDisplay(), mContext); - glDeleteFramebuffers(1, &mFbo); - glDeleteRenderbuffers(1, &mRbo); } void QWaylandGLContext::makeCurrent() @@ -553,21 +532,20 @@ void QWaylandGLContext::makeCurrent() QWaylandDrmBuffer *mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); QRect geometry = mWindow->geometry(); - eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); if (!mBuffer) return; - glBindFramebuffer(GL_FRAMEBUFFER, mFbo); - glBindRenderbuffer(GL_RENDERBUFFER, mRbo); + + eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mBuffer->mContext); + + glBindFramebuffer(GL_FRAMEBUFFER, mBuffer->mFbo); + glBindRenderbuffer(GL_RENDERBUFFER, mBuffer->mRbo); glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mBuffer->mImage); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, mRbo); + GL_RENDERBUFFER, mBuffer->mRbo); } void QWaylandGLContext::doneCurrent() { - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glBindRenderbuffer(GL_RENDERBUFFER, 0); - eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); } void QWaylandGLContext::swapBuffers() diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp index 6e7fa89..4ae04be 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -201,6 +201,10 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, Q_UNUSED(format); EGLint name, stride; + static const EGLint contextAttribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; EGLint imageAttribs[] = { EGL_WIDTH, 0, EGL_HEIGHT, 0, @@ -209,9 +213,16 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, EGL_NONE }; + eglBindAPI(EGL_OPENGL_ES_API); + mContext = eglCreateContext(mDisplay->eglDisplay(), NULL, + EGL_NO_CONTEXT, contextAttribs); + eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); + imageAttribs[1] = size.width(); imageAttribs[3] = size.height(); mImage = eglCreateDRMImageMESA(mDisplay->eglDisplay(), imageAttribs); + glGenFramebuffers(1, &mFbo); + glGenRenderbuffers(1, &mRbo); glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); @@ -225,9 +236,12 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, QWaylandDrmBuffer::~QWaylandDrmBuffer(void) { + glDeleteFramebuffers(1, &mFbo); + glDeleteRenderbuffers(1, &mRbo); glDeleteTextures(1, &mTexture); eglDestroyImageKHR(mDisplay->eglDisplay(), mImage); wl_buffer_destroy(mBuffer); + eglDestroyContext(mDisplay->eglDisplay(), mContext); } @@ -237,7 +251,12 @@ QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window, , mBuffer(0) , mDisplay(display) { + QWaylandWindow *ww = (QWaylandWindow *) window->platformWindow(); + QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); + mPaintDevice = new QWaylandPaintDevice(display, window); + mBuffer = new QWaylandDrmBuffer(mDisplay, window->size(), format); + ww->attach(mBuffer); } QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface() diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h index a033531..c8ccdb1 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -93,11 +93,13 @@ public: QWaylandDrmBuffer(QWaylandDisplay *display, const QSize &size, QImage::Format format); ~QWaylandDrmBuffer(); + EGLContext mContext; EGLImageKHR mImage; GLuint mTexture; QWaylandDisplay *mDisplay; QGLFramebufferObject *pdev; QSize mSize; + GLuint mFbo, mRbo; }; class QWaylandDrmWindowSurface : public QWindowSurface -- cgit v0.12 From 81e5d2db862cfaf58eb6394c9fe1968547926c78 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Wed, 27 Oct 2010 14:44:04 -0700 Subject: Wayland: render to a texture, not a renderbuffer This will let us source from offscreen GL widget surfaces and copy into the parent surface. --- src/plugins/platforms/wayland/qwaylandintegration.cpp | 8 ++++---- src/plugins/platforms/wayland/qwaylandwindowsurface.cpp | 2 -- src/plugins/platforms/wayland/qwaylandwindowsurface.h | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 6842dbf..866a197 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -538,10 +538,10 @@ void QWaylandGLContext::makeCurrent() eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mBuffer->mContext); glBindFramebuffer(GL_FRAMEBUFFER, mBuffer->mFbo); - glBindRenderbuffer(GL_RENDERBUFFER, mBuffer->mRbo); - glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mBuffer->mImage); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, mBuffer->mRbo); + glBindTexture(GL_TEXTURE_2D, mBuffer->mTexture); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, mBuffer->mTexture, 0); } void QWaylandGLContext::doneCurrent() diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp index 4ae04be..2374eac 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp @@ -222,7 +222,6 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, imageAttribs[3] = size.height(); mImage = eglCreateDRMImageMESA(mDisplay->eglDisplay(), imageAttribs); glGenFramebuffers(1, &mFbo); - glGenRenderbuffers(1, &mRbo); glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); @@ -237,7 +236,6 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, QWaylandDrmBuffer::~QWaylandDrmBuffer(void) { glDeleteFramebuffers(1, &mFbo); - glDeleteRenderbuffers(1, &mRbo); glDeleteTextures(1, &mTexture); eglDestroyImageKHR(mDisplay->eglDisplay(), mImage); wl_buffer_destroy(mBuffer); diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h index c8ccdb1..eb9cc40 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -99,7 +99,7 @@ public: QWaylandDisplay *mDisplay; QGLFramebufferObject *pdev; QSize mSize; - GLuint mFbo, mRbo; + GLuint mFbo; }; class QWaylandDrmWindowSurface : public QWindowSurface -- cgit v0.12 From cbe7ab5f5da9c14fb6acef3f6d29b319ec2dcc4a Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Wed, 27 Oct 2010 14:49:16 -0700 Subject: Wayland: set parent window pointer in setParent() We'll need this to handle GL widgets. --- src/plugins/platforms/wayland/qwaylandintegration.cpp | 3 +-- src/plugins/platforms/wayland/qwaylandintegration.h | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 866a197..29cd0ee 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -460,8 +460,7 @@ void QWaylandWindow::setParent(const QPlatformWindow *parent) { QWaylandWindow *wParent = (QWaylandWindow *)parent; - mSurface = wParent->surface(); - wParent->attach(mBuffer); + mParentWindow = wParent; } void QWaylandWindow::setVisible(bool visible) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index e26f9e3..e65c141 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -158,6 +158,7 @@ public: QPlatformGLContext *glContext() const; void attach(QWaylandBuffer *buffer); QWaylandBuffer *getBuffer(void) { return mBuffer; } + QWaylandWindow *getParentWindow(void) { return mParentWindow; } private: struct wl_surface *mSurface; @@ -166,6 +167,7 @@ private: WId mWindowId; QWaylandBuffer *mBuffer; + QWaylandWindow *mParentWindow; }; class QWaylandIntegration : public QPlatformIntegration -- cgit v0.12 From 4a3d4dcdcf2782530c76a6aff4775ec5f8ebd157 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Wed, 27 Oct 2010 15:01:38 -0700 Subject: Wayland: add GL widget support Make sure we copy from the private surface into the parent surface at swapBuffers time. --- .../platforms/wayland/qwaylandintegration.cpp | 99 +++++++++++++++++++++- .../platforms/wayland/qwaylandwindowsurface.h | 1 - 2 files changed, 96 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 29cd0ee..a3237fb 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -17,6 +17,7 @@ #include <private/qwindowsurface_gl_p.h> #include <private/qpixmapdata_gl_p.h> +#include <private/qpaintengineex_opengl2_p.h> #include "qwaylandintegration.h" #include "qwaylandwindowsurface.h" @@ -547,14 +548,106 @@ void QWaylandGLContext::doneCurrent() { } +static void drawTexture(const QRectF &rect, GLuint tex_id, + const QSize &texSize, const QRectF &br) +{ + QRectF src = br.isEmpty() + ? QRectF(QPointF(), texSize) + : QRectF(QPointF(br.x(), texSize.height() - br.bottom()), br.size()); + qreal width = texSize.width(); + qreal height = texSize.height(); + + src.setLeft(src.left() / width); + src.setRight(src.right() / width); + src.setTop(src.top() / height); + src.setBottom(src.bottom() / height); + + const GLfloat tx1 = src.left(); + const GLfloat tx2 = src.right(); + const GLfloat ty1 = src.top(); + const GLfloat ty2 = src.bottom(); + + GLfloat texCoordArray[4*2] = { + tx1, ty2, tx2, ty2, tx2, ty1, tx1, ty1 + }; + + GLfloat vertexArray[4*2]; + extern void qt_add_rect_to_array(const QRectF &r, GLfloat *array); + qt_add_rect_to_array(rect, vertexArray); + + glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexArray); + glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, texCoordArray); + + glBindTexture(GL_TEXTURE_2D, tex_id); + + glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR); + glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR); + glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); + + glBindTexture(GL_TEXTURE_2D, 0); +} + void QWaylandGLContext::swapBuffers() { - QRect geometry = mWindow->geometry(); + QWaylandWindow *mParentWindow = mWindow->getParentWindow(); + QWaylandDrmBuffer *mBuffer, *mParentBuffer; + QRect geometry = mWindow->geometry(), parentGeometry; + GLuint parentFbo, parentRbo; - if (!mWindow->surface()) + if (!mParentWindow) { + qDebug("swap without parent widget?\n"); return; + } + + if (!mParentWindow->surface()) { + qDebug("parent has no surface??\n"); + return; + } + + parentGeometry = mParentWindow->geometry(); + mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); + mParentBuffer = (QWaylandDrmBuffer *)mParentWindow->getBuffer(); + + qDebug("copying from texture image %d, texture %d to image %d, texture %d\n", + mBuffer->mImage, mBuffer->mTexture, mParentBuffer->mImage, mParentBuffer->mTexture); + + glDisable(GL_DEPTH_TEST); + + glGenFramebuffers(1, &parentFbo); + glGenRenderbuffers(1, &parentRbo); + glBindFramebuffer(GL_FRAMEBUFFER, parentFbo); + glBindRenderbuffer(GL_RENDERBUFFER, parentRbo); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mParentBuffer->mImage); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, parentRbo); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); + glViewport(0, 0, geometry.width(), geometry.height()); + + QGLShaderProgram *blitProgram = + QGLEngineSharedShaders::shadersForContext(QGLContext::currentContext())->blitProgram(); + blitProgram->bind(); + blitProgram->setUniformValue("imageTexture", 0 /*QT_IMAGE_TEXTURE_UNIT*/); + // The shader manager's blit program does not multiply the + // vertices by the pmv matrix, so we need to do the effect + // of the orthographic projection here ourselves. + QRectF r; + qreal w = geometry.width() ? geometry.width() : 1.0f; + qreal h = geometry.height() ? geometry.height() : 1.0f; + r.setLeft((geometry.left() / w) * 2.0f - 1.0f); + if (geometry.right() == (geometry.width() - 1)) + r.setRight(1.0f); + else + r.setRight((geometry.right() / w) * 2.0f - 1.0f); + r.setBottom((geometry.top() / h) * 2.0f - 1.0f); + if (geometry.bottom() == (geometry.height() - 1)) + r.setTop(1.0f); + else + r.setTop((geometry.bottom() / w) * 2.0f - 1.0f); + drawTexture(r, mBuffer->mTexture, mWindow->widget()->size(), geometry); - wl_surface_damage(mWindow->surface(), 0, 0, + wl_surface_damage(mParentWindow->surface(), 0, 0, geometry.width(), geometry.height()); } diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h index eb9cc40..21c48f9 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -97,7 +97,6 @@ public: EGLImageKHR mImage; GLuint mTexture; QWaylandDisplay *mDisplay; - QGLFramebufferObject *pdev; QSize mSize; GLuint mFbo; }; -- cgit v0.12 From adbcd0f749e7ce8d7a95ed919e0a37fa5b219f06 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Thu, 28 Oct 2010 11:13:13 -0700 Subject: Wayland: clean up swapBuffers code Pull the swap fbo and rbo into the context and make sure to destroy them when the context goes away. Add unfortunate lazy allocation of the fbo and rbo because we need them to be part of the right context. --- .../platforms/wayland/qwaylandintegration.cpp | 38 ++++++++++++++-------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index a3237fb..879fd73 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -513,6 +513,7 @@ private: QPlatformWindowFormat mFormat; QWaylandDisplay *mDisplay; QWaylandWindow *mWindow; + GLuint parentFbo, parentRbo; }; QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format) @@ -520,11 +521,15 @@ QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window , mFormat(format) , mDisplay(wd) , mWindow(window) + , parentFbo(0) + , parentRbo(0) { } QWaylandGLContext::~QWaylandGLContext() { + glDeleteRenderbuffers(1, &parentRbo); + glDeleteFramebuffers(1, &parentFbo); } void QWaylandGLContext::makeCurrent() @@ -594,7 +599,10 @@ void QWaylandGLContext::swapBuffers() QWaylandWindow *mParentWindow = mWindow->getParentWindow(); QWaylandDrmBuffer *mBuffer, *mParentBuffer; QRect geometry = mWindow->geometry(), parentGeometry; - GLuint parentFbo, parentRbo; + QGLShaderProgram *blitProgram; + QRectF r; + qreal w; + qreal h; if (!mParentWindow) { qDebug("swap without parent widget?\n"); @@ -610,31 +618,33 @@ void QWaylandGLContext::swapBuffers() mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); mParentBuffer = (QWaylandDrmBuffer *)mParentWindow->getBuffer(); - qDebug("copying from texture image %d, texture %d to image %d, texture %d\n", - mBuffer->mImage, mBuffer->mTexture, mParentBuffer->mImage, mParentBuffer->mTexture); - glDisable(GL_DEPTH_TEST); - glGenFramebuffers(1, &parentFbo); - glGenRenderbuffers(1, &parentRbo); + w = geometry.width() ? geometry.width() : 1.0f; + h = geometry.height() ? geometry.height() : 1.0f; + + /* These need to be generated against the src context */ + if (!parentFbo) + glGenFramebuffers(1, &parentFbo); + if (!parentRbo) + glGenRenderbuffers(1, &parentRbo); + glBindFramebuffer(GL_FRAMEBUFFER, parentFbo); glBindRenderbuffer(GL_RENDERBUFFER, parentRbo); - glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, mParentBuffer->mImage); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, + mParentBuffer->mImage); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, parentRbo); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); glViewport(0, 0, geometry.width(), geometry.height()); - QGLShaderProgram *blitProgram = - QGLEngineSharedShaders::shadersForContext(QGLContext::currentContext())->blitProgram(); + blitProgram = QGLEngineSharedShaders::shadersForContext(QGLContext::currentContext())->blitProgram(); blitProgram->bind(); - blitProgram->setUniformValue("imageTexture", 0 /*QT_IMAGE_TEXTURE_UNIT*/); + blitProgram->setUniformValue("imageTexture", 0); + // The shader manager's blit program does not multiply the // vertices by the pmv matrix, so we need to do the effect // of the orthographic projection here ourselves. - QRectF r; - qreal w = geometry.width() ? geometry.width() : 1.0f; - qreal h = geometry.height() ? geometry.height() : 1.0f; r.setLeft((geometry.left() / w) * 2.0f - 1.0f); if (geometry.right() == (geometry.width() - 1)) r.setRight(1.0f); @@ -649,6 +659,8 @@ void QWaylandGLContext::swapBuffers() wl_surface_damage(mParentWindow->surface(), 0, 0, geometry.width(), geometry.height()); + /* restore things to the last valid GL state */ + makeCurrent(); } void *QWaylandGLContext::getProcAddress(const QString &string) -- cgit v0.12 From b026c22b06647dadbe76943fe174e57f82ac2b50 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Thu, 28 Oct 2010 11:15:04 -0700 Subject: Wayland: fix geometry of swapBuffers If the geometry isn't mapped 1:1 we need to divide the bottom by height, not width, to calculate the texture rectangle. --- src/plugins/platforms/wayland/qwaylandintegration.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 879fd73..4767f56 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -654,7 +654,8 @@ void QWaylandGLContext::swapBuffers() if (geometry.bottom() == (geometry.height() - 1)) r.setTop(1.0f); else - r.setTop((geometry.bottom() / w) * 2.0f - 1.0f); + r.setTop((geometry.bottom() / h) * 2.0f - 1.0f); + drawTexture(r, mBuffer->mTexture, mWindow->widget()->size(), geometry); wl_surface_damage(mParentWindow->surface(), 0, 0, -- cgit v0.12 From 513f396c7a888473a32cf212f1ce969fe38fdf2e Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Thu, 28 Oct 2010 16:18:15 -0700 Subject: Wayland: use correct viewport for swapBuffers and correct coords We're drawing into the parent, so we need to use the parent's geometry for the GL viewport, or we may not be able to draw it. We also need to use the parent width & height when checking whether to normalize to 1.0 or -1.0 in the coord transform calculations. --- .../platforms/wayland/qwaylandintegration.cpp | 43 ++++++++++++++-------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 4767f56..b8b7c2f 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -542,6 +542,7 @@ void QWaylandGLContext::makeCurrent() eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mBuffer->mContext); + glViewport(0, 0, geometry.width(), geometry.height()); glBindFramebuffer(GL_FRAMEBUFFER, mBuffer->mFbo); glBindTexture(GL_TEXTURE_2D, mBuffer->mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); @@ -553,6 +554,12 @@ void QWaylandGLContext::doneCurrent() { } +/* drawTexture - Draw from a texture into a the current framebuffer + * @rect: GL normalized coords for drawing (between -1.0f and 1.0f) + * @tex_id: texture source + * @texSize: size of source rectangle in Qt coords + * @br: bounding rect for drawing + */ static void drawTexture(const QRectF &rect, GLuint tex_id, const QSize &texSize, const QRectF &br) { @@ -585,6 +592,11 @@ static void drawTexture(const QRectF &rect, GLuint tex_id, glBindTexture(GL_TEXTURE_2D, tex_id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR); glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); @@ -620,9 +632,6 @@ void QWaylandGLContext::swapBuffers() glDisable(GL_DEPTH_TEST); - w = geometry.width() ? geometry.width() : 1.0f; - h = geometry.height() ? geometry.height() : 1.0f; - /* These need to be generated against the src context */ if (!parentFbo) glGenFramebuffers(1, &parentFbo); @@ -636,32 +645,36 @@ void QWaylandGLContext::swapBuffers() glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, parentRbo); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); - glViewport(0, 0, geometry.width(), geometry.height()); + glViewport(0, 0, parentGeometry.width(), parentGeometry.height()); blitProgram = QGLEngineSharedShaders::shadersForContext(QGLContext::currentContext())->blitProgram(); blitProgram->bind(); blitProgram->setUniformValue("imageTexture", 0); - // The shader manager's blit program does not multiply the - // vertices by the pmv matrix, so we need to do the effect - // of the orthographic projection here ourselves. + /* Transform the target rect to the appropriate coords on the parent */ + w = parentGeometry.width(); + h = parentGeometry.height(); + r.setLeft((geometry.left() / w) * 2.0f - 1.0f); - if (geometry.right() == (geometry.width() - 1)) + if (geometry.right() == (parentGeometry.width() - 1)) r.setRight(1.0f); else r.setRight((geometry.right() / w) * 2.0f - 1.0f); - r.setBottom((geometry.top() / h) * 2.0f - 1.0f); - if (geometry.bottom() == (geometry.height() - 1)) - r.setTop(1.0f); + + r.setTop((geometry.top() / h) * 2.0f - 1.0f); + if (geometry.bottom() == (parentGeometry.height() - 1)) + r.setBottom(-1.0f); else - r.setTop((geometry.bottom() / h) * 2.0f - 1.0f); + r.setBottom((geometry.bottom() / h) * 2.0f - 1.0f); - drawTexture(r, mBuffer->mTexture, mWindow->widget()->size(), geometry); + drawTexture(r, mBuffer->mTexture, mParentWindow->widget()->size(), parentGeometry); - wl_surface_damage(mParentWindow->surface(), 0, 0, - geometry.width(), geometry.height()); + wl_surface_damage(mParentWindow->surface(), geometry.left(), geometry.top(), + geometry.right(), geometry.bottom()); /* restore things to the last valid GL state */ makeCurrent(); + /* hack: avoid tight swapBuffers loops */ + usleep(20000); } void *QWaylandGLContext::getProcAddress(const QString &string) -- cgit v0.12 From f3bb98a1fa89a505ae3015977840ddbe2219ab5a Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Mon, 8 Nov 2010 12:24:09 -0800 Subject: Wayland: split GL code into separate files For clarity and to prevent merge conflicts etc. in future. --- .../platforms/wayland/qwaylanddrmsurface.cpp | 216 +++++++++++++++ .../platforms/wayland/qwaylandglcontext.cpp | 207 ++++++++++++++ .../platforms/wayland/qwaylandintegration.cpp | 202 -------------- .../platforms/wayland/qwaylandintegration.h | 21 ++ .../platforms/wayland/qwaylandshmsurface.cpp | 142 ++++++++++ .../platforms/wayland/qwaylandwindowsurface.cpp | 302 --------------------- src/plugins/platforms/wayland/wayland.pro | 6 +- 7 files changed, 590 insertions(+), 506 deletions(-) create mode 100644 src/plugins/platforms/wayland/qwaylanddrmsurface.cpp create mode 100644 src/plugins/platforms/wayland/qwaylandglcontext.cpp create mode 100644 src/plugins/platforms/wayland/qwaylandshmsurface.cpp delete mode 100644 src/plugins/platforms/wayland/qwaylandwindowsurface.cpp diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp new file mode 100644 index 0000000..c9fb187 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp @@ -0,0 +1,216 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#define GL_GLEXT_PROTOTYPES +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + +#include <QGLFramebufferObject> +#include <QtCore/qdebug.h> +#include <QtGui/private/qapplication_p.h> +#include <QtOpenGL/private/qgl_p.h> +#include <QtOpenGL/private/qglpaintdevice_p.h> + +#include "qwaylandintegration.h" +#include "qwaylandwindowsurface.h" + +#include <wayland-client.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/mman.h> + +QT_BEGIN_NAMESPACE + +class QWaylandPaintDevice : public QGLPaintDevice +{ +public: + QWaylandPaintDevice(QWaylandDisplay *display, QWidget *widget) + : QGLPaintDevice(), mDisplay(display), mWidget(widget) + { + QGLFormat format; + mContext = new QGLContext(format, widget); + mContext->create(); + } + + QSize size() const { return mWidget->size(); } + QGLContext *context() const { return mContext; } + QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); } + + void beginPaint(); + void endPaint(); +private: + QWaylandDisplay *mDisplay; + QWidget *mWidget; + QGLContext *mContext; +}; + +void QWaylandPaintDevice::beginPaint(void) +{ + QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); + QPlatformGLContext *ctx = mWindow->glContext(); + + QGLPaintDevice::beginPaint(); + + ctx->makeCurrent(); +} + +void QWaylandPaintDevice::endPaint(void) +{ + QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); + QPlatformGLContext *ctx = mWindow->glContext(); + QRect geometry = mWidget->geometry(); + + ctx->doneCurrent(); + + QGLPaintDevice::endPaint(); +} + +/* + * Shared DRM surface for GL based drawing + */ +QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format) + : mDisplay(display) + , mSize(size) +{ + Q_UNUSED(format); + + EGLint name, stride; + static const EGLint contextAttribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + EGLint imageAttribs[] = { + EGL_WIDTH, 0, + EGL_HEIGHT, 0, + EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, + EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA, + EGL_NONE + }; + + eglBindAPI(EGL_OPENGL_ES_API); + mContext = eglCreateContext(mDisplay->eglDisplay(), NULL, + EGL_NO_CONTEXT, contextAttribs); + eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); + + imageAttribs[1] = size.width(); + imageAttribs[3] = size.height(); + mImage = eglCreateDRMImageMESA(mDisplay->eglDisplay(), imageAttribs); + glGenFramebuffers(1, &mFbo); + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); + + eglExportDRMImageMESA(mDisplay->eglDisplay(), + mImage, &name, NULL, &stride); + + mBuffer = display->createDrmBuffer(name, size.width(), size.height(), + stride, display->argbVisual()); +} + +QWaylandDrmBuffer::~QWaylandDrmBuffer(void) +{ + glDeleteFramebuffers(1, &mFbo); + glDeleteTextures(1, &mTexture); + eglDestroyImageKHR(mDisplay->eglDisplay(), mImage); + wl_buffer_destroy(mBuffer); + eglDestroyContext(mDisplay->eglDisplay(), mContext); +} + + +QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window, + QWaylandDisplay *display) + : QWindowSurface(window) + , mBuffer(0) + , mDisplay(display) +{ + QWaylandWindow *ww = (QWaylandWindow *) window->platformWindow(); + QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); + + mPaintDevice = new QWaylandPaintDevice(display, window); + mBuffer = new QWaylandDrmBuffer(mDisplay, window->size(), format); + ww->attach(mBuffer); +} + +QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface() +{ + delete mPaintDevice; +} + +QPaintDevice *QWaylandDrmWindowSurface::paintDevice() +{ + return mPaintDevice; +} + +void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) +{ + Q_UNUSED(offset); + QWaylandWindow *ww = (QWaylandWindow *) widget->platformWindow(); + QVector<QRect> rects = region.rects(); + const QRect *r; + int i; + + for (i = 0; i < rects.size(); i++) { + r = &rects.at(i); + wl_surface_damage(ww->surface(), + r->x(), r->y(), r->width(), r->height()); + } +} + +void QWaylandDrmWindowSurface::resize(const QSize &size) +{ + QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + QWindowSurface::resize(size); + QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); + + if (mBuffer != NULL && mBuffer->mSize == size) + return; + + if (mBuffer != NULL) + delete mBuffer; + + mBuffer = new QWaylandDrmBuffer(mDisplay, size, format); + + ww->attach(mBuffer); +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/qwaylandglcontext.cpp new file mode 100644 index 0000000..264da2e --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandglcontext.cpp @@ -0,0 +1,207 @@ +#define GL_GLEXT_PROTOTYPES +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + +#include "qfontconfigdatabase.h" + +#include <QImageReader> +#include <QWindowSystemInterface> +#include <QPlatformCursor> +#include <QPaintEngine> + +#include <QtGui/QPlatformGLContext> +#include <QtGui/QPlatformWindowFormat> + +#include <QtGui/private/qpixmap_raster_p.h> +#include <QtGui/QPlatformWindow> + +#include <private/qwindowsurface_gl_p.h> +#include <private/qpixmapdata_gl_p.h> +#include <private/qpaintengineex_opengl2_p.h> + +#include "qwaylandintegration.h" +#include "qwaylandwindowsurface.h" + +#include <unistd.h> +#include <fcntl.h> + +extern "C" { +#include <xf86drm.h> +} + +QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format) + : QPlatformGLContext() + , mFormat(format) + , mDisplay(wd) + , mWindow(window) + , parentFbo(0) + , parentRbo(0) +{ +} + +QWaylandGLContext::~QWaylandGLContext() +{ + glDeleteRenderbuffers(1, &parentRbo); + glDeleteFramebuffers(1, &parentFbo); +} + +void QWaylandGLContext::makeCurrent() +{ + QWaylandDrmBuffer *mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); + QRect geometry = mWindow->geometry(); + + if (!mBuffer) + return; + + eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mBuffer->mContext); + + glViewport(0, 0, geometry.width(), geometry.height()); + glBindFramebuffer(GL_FRAMEBUFFER, mBuffer->mFbo); + glBindTexture(GL_TEXTURE_2D, mBuffer->mTexture); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, mBuffer->mTexture, 0); +} + +void QWaylandGLContext::doneCurrent() +{ +} + +/* drawTexture - Draw from a texture into a the current framebuffer + * @rect: GL normalized coords for drawing (between -1.0f and 1.0f) + * @tex_id: texture source + * @texSize: size of source rectangle in Qt coords + * @br: bounding rect for drawing + */ +static void drawTexture(const QRectF &rect, GLuint tex_id, + const QSize &texSize, const QRectF &br) +{ + QRectF src = br.isEmpty() + ? QRectF(QPointF(), texSize) + : QRectF(QPointF(br.x(), texSize.height() - br.bottom()), br.size()); + qreal width = texSize.width(); + qreal height = texSize.height(); + + src.setLeft(src.left() / width); + src.setRight(src.right() / width); + src.setTop(src.top() / height); + src.setBottom(src.bottom() / height); + + const GLfloat tx1 = src.left(); + const GLfloat tx2 = src.right(); + const GLfloat ty1 = src.top(); + const GLfloat ty2 = src.bottom(); + + GLfloat texCoordArray[4*2] = { + tx1, ty2, tx2, ty2, tx2, ty1, tx1, ty1 + }; + + GLfloat vertexArray[4*2]; + extern void qt_add_rect_to_array(const QRectF &r, GLfloat *array); + qt_add_rect_to_array(rect, vertexArray); + + glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexArray); + glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, texCoordArray); + + glBindTexture(GL_TEXTURE_2D, tex_id); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR); + glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR); + glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); + + glBindTexture(GL_TEXTURE_2D, 0); +} + +void QWaylandGLContext::swapBuffers() +{ + QWaylandWindow *mParentWindow = mWindow->getParentWindow(); + QWaylandDrmBuffer *mBuffer, *mParentBuffer; + QRect geometry = mWindow->geometry(), parentGeometry; + QGLShaderProgram *blitProgram; + QRectF r; + qreal w; + qreal h; + + if (!mParentWindow) { + qDebug("swap without parent widget?\n"); + return; + } + + if (!mParentWindow->surface()) { + qDebug("parent has no surface??\n"); + return; + } + + parentGeometry = mParentWindow->geometry(); + mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); + mParentBuffer = (QWaylandDrmBuffer *)mParentWindow->getBuffer(); + + glDisable(GL_DEPTH_TEST); + + /* These need to be generated against the src context */ + if (!parentFbo) + glGenFramebuffers(1, &parentFbo); + if (!parentRbo) + glGenRenderbuffers(1, &parentRbo); + + glBindFramebuffer(GL_FRAMEBUFFER, parentFbo); + glBindRenderbuffer(GL_RENDERBUFFER, parentRbo); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, + mParentBuffer->mImage); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, parentRbo); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); + glViewport(0, 0, parentGeometry.width(), parentGeometry.height()); + + blitProgram = QGLEngineSharedShaders::shadersForContext(QGLContext::currentContext())->blitProgram(); + blitProgram->bind(); + blitProgram->setUniformValue("imageTexture", 0); + + /* Transform the target rect to the appropriate coords on the parent */ + w = parentGeometry.width(); + h = parentGeometry.height(); + + r.setLeft((geometry.left() / w) * 2.0f - 1.0f); + if (geometry.right() == (parentGeometry.width() - 1)) + r.setRight(1.0f); + else + r.setRight((geometry.right() / w) * 2.0f - 1.0f); + + r.setTop((geometry.top() / h) * 2.0f - 1.0f); + if (geometry.bottom() == (parentGeometry.height() - 1)) + r.setBottom(-1.0f); + else + r.setBottom((geometry.bottom() / h) * 2.0f - 1.0f); + + drawTexture(r, mBuffer->mTexture, mParentWindow->widget()->size(), parentGeometry); + + wl_surface_damage(mParentWindow->surface(), geometry.left(), geometry.top(), + geometry.right(), geometry.bottom()); + /* restore things to the last valid GL state */ + makeCurrent(); + /* hack: avoid tight swapBuffers loops */ + usleep(20000); +} + +void *QWaylandGLContext::getProcAddress(const QString &string) +{ + return (void *) eglGetProcAddress(string.toLatin1().data()); +} + +QPlatformGLContext *QWaylandWindow::glContext() const +{ + if (!mGLContext) { + QWaylandWindow *that = const_cast<QWaylandWindow *>(this); + that->mGLContext = new QWaylandGLContext(mDisplay, that, widget()->platformWindowFormat()); + } + + return mGLContext; +} + diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index b8b7c2f..0109678 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -1,7 +1,3 @@ -#define GL_GLEXT_PROTOTYPES -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - #include "qfontconfigdatabase.h" #include <QImageReader> @@ -9,16 +5,11 @@ #include <QPlatformCursor> #include <QPaintEngine> -#include <QtGui/QPlatformGLContext> #include <QtGui/QPlatformWindowFormat> #include <QtGui/private/qpixmap_raster_p.h> #include <QtGui/QPlatformWindow> -#include <private/qwindowsurface_gl_p.h> -#include <private/qpixmapdata_gl_p.h> -#include <private/qpaintengineex_opengl2_p.h> - #include "qwaylandintegration.h" #include "qwaylandwindowsurface.h" @@ -499,199 +490,6 @@ void QWaylandWindow::configure(uint32_t time, uint32_t edges, QWindowSystemInterface::handleGeometryChange(widget(), geometry); } -class QWaylandGLContext : public QPlatformGLContext { -public: - QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format); - ~QWaylandGLContext(); - void makeCurrent(); - void doneCurrent(); - void swapBuffers(); - void* getProcAddress(const QString&); - QPlatformWindowFormat platformWindowFormat() const { return mFormat; } - -private: - QPlatformWindowFormat mFormat; - QWaylandDisplay *mDisplay; - QWaylandWindow *mWindow; - GLuint parentFbo, parentRbo; -}; - -QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format) - : QPlatformGLContext() - , mFormat(format) - , mDisplay(wd) - , mWindow(window) - , parentFbo(0) - , parentRbo(0) -{ -} - -QWaylandGLContext::~QWaylandGLContext() -{ - glDeleteRenderbuffers(1, &parentRbo); - glDeleteFramebuffers(1, &parentFbo); -} - -void QWaylandGLContext::makeCurrent() -{ - QWaylandDrmBuffer *mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); - QRect geometry = mWindow->geometry(); - - if (!mBuffer) - return; - - eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mBuffer->mContext); - - glViewport(0, 0, geometry.width(), geometry.height()); - glBindFramebuffer(GL_FRAMEBUFFER, mBuffer->mFbo); - glBindTexture(GL_TEXTURE_2D, mBuffer->mTexture); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, mBuffer->mTexture, 0); -} - -void QWaylandGLContext::doneCurrent() -{ -} - -/* drawTexture - Draw from a texture into a the current framebuffer - * @rect: GL normalized coords for drawing (between -1.0f and 1.0f) - * @tex_id: texture source - * @texSize: size of source rectangle in Qt coords - * @br: bounding rect for drawing - */ -static void drawTexture(const QRectF &rect, GLuint tex_id, - const QSize &texSize, const QRectF &br) -{ - QRectF src = br.isEmpty() - ? QRectF(QPointF(), texSize) - : QRectF(QPointF(br.x(), texSize.height() - br.bottom()), br.size()); - qreal width = texSize.width(); - qreal height = texSize.height(); - - src.setLeft(src.left() / width); - src.setRight(src.right() / width); - src.setTop(src.top() / height); - src.setBottom(src.bottom() / height); - - const GLfloat tx1 = src.left(); - const GLfloat tx2 = src.right(); - const GLfloat ty1 = src.top(); - const GLfloat ty2 = src.bottom(); - - GLfloat texCoordArray[4*2] = { - tx1, ty2, tx2, ty2, tx2, ty1, tx1, ty1 - }; - - GLfloat vertexArray[4*2]; - extern void qt_add_rect_to_array(const QRectF &r, GLfloat *array); - qt_add_rect_to_array(rect, vertexArray); - - glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexArray); - glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, texCoordArray); - - glBindTexture(GL_TEXTURE_2D, tex_id); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR); - glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR); - glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); - - glBindTexture(GL_TEXTURE_2D, 0); -} - -void QWaylandGLContext::swapBuffers() -{ - QWaylandWindow *mParentWindow = mWindow->getParentWindow(); - QWaylandDrmBuffer *mBuffer, *mParentBuffer; - QRect geometry = mWindow->geometry(), parentGeometry; - QGLShaderProgram *blitProgram; - QRectF r; - qreal w; - qreal h; - - if (!mParentWindow) { - qDebug("swap without parent widget?\n"); - return; - } - - if (!mParentWindow->surface()) { - qDebug("parent has no surface??\n"); - return; - } - - parentGeometry = mParentWindow->geometry(); - mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); - mParentBuffer = (QWaylandDrmBuffer *)mParentWindow->getBuffer(); - - glDisable(GL_DEPTH_TEST); - - /* These need to be generated against the src context */ - if (!parentFbo) - glGenFramebuffers(1, &parentFbo); - if (!parentRbo) - glGenRenderbuffers(1, &parentRbo); - - glBindFramebuffer(GL_FRAMEBUFFER, parentFbo); - glBindRenderbuffer(GL_RENDERBUFFER, parentRbo); - glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, - mParentBuffer->mImage); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, parentRbo); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); - glViewport(0, 0, parentGeometry.width(), parentGeometry.height()); - - blitProgram = QGLEngineSharedShaders::shadersForContext(QGLContext::currentContext())->blitProgram(); - blitProgram->bind(); - blitProgram->setUniformValue("imageTexture", 0); - - /* Transform the target rect to the appropriate coords on the parent */ - w = parentGeometry.width(); - h = parentGeometry.height(); - - r.setLeft((geometry.left() / w) * 2.0f - 1.0f); - if (geometry.right() == (parentGeometry.width() - 1)) - r.setRight(1.0f); - else - r.setRight((geometry.right() / w) * 2.0f - 1.0f); - - r.setTop((geometry.top() / h) * 2.0f - 1.0f); - if (geometry.bottom() == (parentGeometry.height() - 1)) - r.setBottom(-1.0f); - else - r.setBottom((geometry.bottom() / h) * 2.0f - 1.0f); - - drawTexture(r, mBuffer->mTexture, mParentWindow->widget()->size(), parentGeometry); - - wl_surface_damage(mParentWindow->surface(), geometry.left(), geometry.top(), - geometry.right(), geometry.bottom()); - /* restore things to the last valid GL state */ - makeCurrent(); - /* hack: avoid tight swapBuffers loops */ - usleep(20000); -} - -void *QWaylandGLContext::getProcAddress(const QString &string) -{ - return (void *) eglGetProcAddress(string.toLatin1().data()); -} - -QPlatformGLContext *QWaylandWindow::glContext() const -{ - if (!mGLContext) { - QWaylandWindow *that = const_cast<QWaylandWindow *>(this); - that->mGLContext = new QWaylandGLContext(mDisplay, that, widget()->platformWindowFormat()); - } - - return mGLContext; -} - QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const { Q_UNUSED(winId); diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index e65c141..1c5f834 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -46,8 +46,12 @@ #include <QObject> #include <QtGui/QPlatformIntegration> #include <QtGui/QPlatformScreen> +#include <QtGui/QPlatformGLContext> +#include <QtGui/QPlatformWindowFormat> #include "qgl.h" +#include <private/qpixmapdata_gl_p.h> + #include <wayland-client.h> #include "qwaylandinputdevice.h" @@ -189,6 +193,23 @@ private: bool mUseOpenGL; }; +class QWaylandGLContext : public QPlatformGLContext { +public: + QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format); + ~QWaylandGLContext(); + void makeCurrent(); + void doneCurrent(); + void swapBuffers(); + void* getProcAddress(const QString&); + QPlatformWindowFormat platformWindowFormat() const { return mFormat; } + +private: + QPlatformWindowFormat mFormat; + QWaylandDisplay *mDisplay; + QWaylandWindow *mWindow; + GLuint parentFbo, parentRbo; +}; + QT_END_NAMESPACE #endif diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp new file mode 100644 index 0000000..004b93a --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore/qdebug.h> +#include <QtGui/private/qapplication_p.h> + +#include "qwaylandintegration.h" +#include "qwaylandwindowsurface.h" + +#include <wayland-client.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/mman.h> + +QT_BEGIN_NAMESPACE + +QWaylandShmBuffer::QWaylandShmBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format) +{ + int stride = size.width() * 4; + int alloc = stride * size.height(); + char filename[] = "/tmp/wayland-shm-XXXXXX"; + int fd = mkstemp(filename); + if (fd < 0) + qWarning("open %s failed: %s", filename, strerror(errno)); + if (ftruncate(fd, alloc) < 0) { + qWarning("ftruncate failed: %s", strerror(errno)); + close(fd); + return; + } + uchar *data = (uchar *) + mmap(NULL, alloc, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + unlink(filename); + + if (data == (uchar *) MAP_FAILED) { + qWarning("mmap /dev/zero failed: %s", strerror(errno)); + close(fd); + return; + } + + mImage = QImage(data, size.width(), size.height(), stride, format); + mBuffer = display->createShmBuffer(fd, size.width(), size.height(), + stride, display->argbVisual()); + close(fd); +} + +QWaylandShmBuffer::~QWaylandShmBuffer(void) +{ + munmap((void *) mImage.constBits(), mImage.byteCount()); + wl_buffer_destroy(mBuffer); +} + +QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window, + QWaylandDisplay *display) + : QWindowSurface(window) + , mBuffer(0) + , mDisplay(display) +{ +} + +QWaylandShmWindowSurface::~QWaylandShmWindowSurface() +{ +} + +QPaintDevice *QWaylandShmWindowSurface::paintDevice() +{ + return &mBuffer->mImage; +} + +void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) +{ + Q_UNUSED(widget); + Q_UNUSED(offset); + QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + QVector<QRect> rects = region.rects(); + const QRect *r; + int i; + + for (i = 0; i < rects.size(); i++) { + r = &rects.at(i); + wl_surface_damage(ww->surface(), + r->x(), r->y(), r->width(), r->height()); + } +} + +void QWaylandShmWindowSurface::resize(const QSize &size) +{ + QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + QWindowSurface::resize(size); + QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); + + if (mBuffer != NULL && mBuffer->mImage.size() == size) + return; + + if (mBuffer != NULL) + delete mBuffer; + + mBuffer = new QWaylandShmBuffer(mDisplay, size, format); + + ww->attach(mBuffer); +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp b/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp deleted file mode 100644 index 2374eac..0000000 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.cpp +++ /dev/null @@ -1,302 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtOpenVG module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#define GL_GLEXT_PROTOTYPES -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - -#include <QGLFramebufferObject> -#include <QtCore/qdebug.h> -#include <QtGui/private/qapplication_p.h> -#include <QtOpenGL/private/qgl_p.h> -#include <QtOpenGL/private/qglpaintdevice_p.h> - -#include "qwaylandintegration.h" -#include "qwaylandwindowsurface.h" - -#include <wayland-client.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <sys/mman.h> - -QT_BEGIN_NAMESPACE - -QWaylandShmBuffer::QWaylandShmBuffer(QWaylandDisplay *display, - const QSize &size, QImage::Format format) -{ - int stride = size.width() * 4; - int alloc = stride * size.height(); - char filename[] = "/tmp/wayland-shm-XXXXXX"; - int fd = mkstemp(filename); - if (fd < 0) - qWarning("open %s failed: %s", filename, strerror(errno)); - if (ftruncate(fd, alloc) < 0) { - qWarning("ftruncate failed: %s", strerror(errno)); - close(fd); - return; - } - uchar *data = (uchar *) - mmap(NULL, alloc, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - unlink(filename); - - if (data == (uchar *) MAP_FAILED) { - qWarning("mmap /dev/zero failed: %s", strerror(errno)); - close(fd); - return; - } - - mImage = QImage(data, size.width(), size.height(), stride, format); - mBuffer = display->createShmBuffer(fd, size.width(), size.height(), - stride, display->argbVisual()); - close(fd); -} - -QWaylandShmBuffer::~QWaylandShmBuffer(void) -{ - munmap((void *) mImage.constBits(), mImage.byteCount()); - wl_buffer_destroy(mBuffer); -} - -QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window, - QWaylandDisplay *display) - : QWindowSurface(window) - , mBuffer(0) - , mDisplay(display) -{ -} - -QWaylandShmWindowSurface::~QWaylandShmWindowSurface() -{ -} - -QPaintDevice *QWaylandShmWindowSurface::paintDevice() -{ - return &mBuffer->mImage; -} - -void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) -{ - Q_UNUSED(widget); - Q_UNUSED(offset); - QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); - QVector<QRect> rects = region.rects(); - const QRect *r; - int i; - - for (i = 0; i < rects.size(); i++) { - r = &rects.at(i); - wl_surface_damage(ww->surface(), - r->x(), r->y(), r->width(), r->height()); - } -} - -void QWaylandShmWindowSurface::resize(const QSize &size) -{ - QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); - QWindowSurface::resize(size); - QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); - - if (mBuffer != NULL && mBuffer->mImage.size() == size) - return; - - if (mBuffer != NULL) - delete mBuffer; - - mBuffer = new QWaylandShmBuffer(mDisplay, size, format); - - ww->attach(mBuffer); -} - -class QWaylandPaintDevice : public QGLPaintDevice -{ -public: - QWaylandPaintDevice(QWaylandDisplay *display, QWidget *widget) - : QGLPaintDevice(), mDisplay(display), mWidget(widget) - { - QGLFormat format; - mContext = new QGLContext(format, widget); - mContext->create(); - } - - QSize size() const { return mWidget->size(); } - QGLContext *context() const { return mContext; } - QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); } - - void beginPaint(); - void endPaint(); -private: - QWaylandDisplay *mDisplay; - QWidget *mWidget; - QGLContext *mContext; -}; - -void QWaylandPaintDevice::beginPaint(void) -{ - QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); - QPlatformGLContext *ctx = mWindow->glContext(); - - QGLPaintDevice::beginPaint(); - - ctx->makeCurrent(); -} - -void QWaylandPaintDevice::endPaint(void) -{ - QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); - QPlatformGLContext *ctx = mWindow->glContext(); - QRect geometry = mWidget->geometry(); - - ctx->doneCurrent(); - - QGLPaintDevice::endPaint(); -} - -/* - * Shared DRM surface for GL based drawing - */ -QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, - const QSize &size, QImage::Format format) - : mDisplay(display) - , mSize(size) -{ - Q_UNUSED(format); - - EGLint name, stride; - static const EGLint contextAttribs[] = { - EGL_CONTEXT_CLIENT_VERSION, 2, - EGL_NONE - }; - EGLint imageAttribs[] = { - EGL_WIDTH, 0, - EGL_HEIGHT, 0, - EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, - EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA, - EGL_NONE - }; - - eglBindAPI(EGL_OPENGL_ES_API); - mContext = eglCreateContext(mDisplay->eglDisplay(), NULL, - EGL_NO_CONTEXT, contextAttribs); - eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); - - imageAttribs[1] = size.width(); - imageAttribs[3] = size.height(); - mImage = eglCreateDRMImageMESA(mDisplay->eglDisplay(), imageAttribs); - glGenFramebuffers(1, &mFbo); - glGenTextures(1, &mTexture); - glBindTexture(GL_TEXTURE_2D, mTexture); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); - - eglExportDRMImageMESA(mDisplay->eglDisplay(), - mImage, &name, NULL, &stride); - - mBuffer = display->createDrmBuffer(name, size.width(), size.height(), - stride, display->argbVisual()); -} - -QWaylandDrmBuffer::~QWaylandDrmBuffer(void) -{ - glDeleteFramebuffers(1, &mFbo); - glDeleteTextures(1, &mTexture); - eglDestroyImageKHR(mDisplay->eglDisplay(), mImage); - wl_buffer_destroy(mBuffer); - eglDestroyContext(mDisplay->eglDisplay(), mContext); -} - - -QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window, - QWaylandDisplay *display) - : QWindowSurface(window) - , mBuffer(0) - , mDisplay(display) -{ - QWaylandWindow *ww = (QWaylandWindow *) window->platformWindow(); - QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); - - mPaintDevice = new QWaylandPaintDevice(display, window); - mBuffer = new QWaylandDrmBuffer(mDisplay, window->size(), format); - ww->attach(mBuffer); -} - -QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface() -{ - delete mPaintDevice; -} - -QPaintDevice *QWaylandDrmWindowSurface::paintDevice() -{ - return mPaintDevice; -} - -void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) -{ - Q_UNUSED(offset); - QWaylandWindow *ww = (QWaylandWindow *) widget->platformWindow(); - QVector<QRect> rects = region.rects(); - const QRect *r; - int i; - - for (i = 0; i < rects.size(); i++) { - r = &rects.at(i); - wl_surface_damage(ww->surface(), - r->x(), r->y(), r->width(), r->height()); - } -} - -void QWaylandDrmWindowSurface::resize(const QSize &size) -{ - QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); - QWindowSurface::resize(size); - QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); - - if (mBuffer != NULL && mBuffer->mSize == size) - return; - - if (mBuffer != NULL) - delete mBuffer; - - mBuffer = new QWaylandDrmBuffer(mDisplay, size, format); - - ww->attach(mBuffer); -} - -QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index ec3f9d3..b0cb98b 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -5,8 +5,10 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms SOURCES = main.cpp \ qwaylandintegration.cpp \ - qwaylandwindowsurface.cpp \ - qwaylandinputdevice.cpp + qwaylandshmsurface.cpp \ + qwaylanddrmsurface.cpp \ + qwaylandinputdevice.cpp \ + qwaylandglcontext.cpp HEADERS = qwaylandintegration.h \ qwaylandwindowsurface.h -- cgit v0.12 From aba46c644461616a2b14fc422efba74d5c44d017 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Mon, 8 Nov 2010 13:05:19 -0800 Subject: Wayland: clamp window resizes to screen size --- src/plugins/platforms/wayland/qwaylanddrmsurface.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp index c9fb187..7756e85 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp @@ -196,11 +196,13 @@ void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion ®ion, con } } -void QWaylandDrmWindowSurface::resize(const QSize &size) +void QWaylandDrmWindowSurface::resize(const QSize &requestedSize) { QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); - QWindowSurface::resize(size); - QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); + QWaylandScreen *screen = (QWaylandScreen *)QApplicationPrivate::platformIntegration()->screens().first(); + QImage::Format format = screen->format(); + QSize screenSize = screen->geometry().size(); + QSize size = requestedSize; if (mBuffer != NULL && mBuffer->mSize == size) return; @@ -208,6 +210,14 @@ void QWaylandDrmWindowSurface::resize(const QSize &size) if (mBuffer != NULL) delete mBuffer; + /* Clamp to screen size */ + if (size.width() > screenSize.width()) + size.setWidth(screenSize.width()); + if (size.height() > screenSize.height()) + size.setHeight(screenSize.height()); + + QWindowSurface::resize(size); + mBuffer = new QWaylandDrmBuffer(mDisplay, size, format); ww->attach(mBuffer); -- cgit v0.12 From 73a2833abc1c9e9d5d3abe461e2ce9196bcb2a74 Mon Sep 17 00:00:00 2001 From: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Tue, 9 Nov 2010 12:44:18 -0800 Subject: Wayland: request rbg and premultiplied argb visuals as needed When creating DRM buffers we should try to match the visual type requested with the buffer format. --- src/plugins/platforms/wayland/qwaylanddrmsurface.cpp | 17 +++++++++++++++-- src/plugins/platforms/wayland/qwaylandintegration.cpp | 10 ++++++++++ src/plugins/platforms/wayland/qwaylandintegration.h | 3 ++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp index 7756e85..cb4445c 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp @@ -112,7 +112,7 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, : mDisplay(display) , mSize(size) { - Q_UNUSED(format); + struct wl_visual *visual; EGLint name, stride; static const EGLint contextAttribs[] = { @@ -143,8 +143,21 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, eglExportDRMImageMESA(mDisplay->eglDisplay(), mImage, &name, NULL, &stride); + switch (format) { + case QImage::Format_ARGB32: + visual = display->argbVisual(); + break; + case QImage::Format_ARGB32_Premultiplied: + visual = display->argbPremultipliedVisual(); + break; + default: + qDebug("unsupported buffer format %d requested\n", format); + visual = display->argbVisual(); + break; + } + mBuffer = display->createDrmBuffer(name, size.width(), size.height(), - stride, display->argbVisual()); + stride, visual); } QWaylandDrmBuffer::~QWaylandDrmBuffer(void) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 0109678..19f339a 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -185,11 +185,21 @@ struct wl_buffer *QWaylandDisplay::createDrmBuffer(int name, return wl_drm_create_buffer(mDrm, name, width, height, stride, visual); } +struct wl_visual *QWaylandDisplay::rgbVisual() +{ + return wl_display_get_rgb_visual(mDisplay); +} + struct wl_visual *QWaylandDisplay::argbVisual() { return wl_display_get_argb_visual(mDisplay); } +struct wl_visual *QWaylandDisplay::argbPremultipliedVisual() +{ + return wl_display_get_premultiplied_argb_visual(mDisplay); +} + void QWaylandDisplay::drmHandleDevice(void *data, struct wl_drm *drm, const char *device) { diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 1c5f834..611ce43 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -79,8 +79,9 @@ public: struct wl_buffer *createDrmBuffer(int name, int width, int height, uint32_t stride, struct wl_visual *visual); - + struct wl_visual *rgbVisual(); struct wl_visual *argbVisual(); + struct wl_visual *argbPremultipliedVisual(); EGLDisplay eglDisplay() { return mEglDisplay; } void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y); -- cgit v0.12 From 53d2a41e3afd86a8571de40ff91b00d4f11a111a Mon Sep 17 00:00:00 2001 From: Benjamin Franzke <benjaminfranzke@googlemail.com> Date: Sun, 21 Nov 2010 14:14:30 +0100 Subject: wayland: fix SOURCES to point to wayland.cpp in config.tests --- config.tests/qpa/wayland/wayland.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.tests/qpa/wayland/wayland.pro b/config.tests/qpa/wayland/wayland.pro index 83f5efe..266e4d6 100644 --- a/config.tests/qpa/wayland/wayland.pro +++ b/config.tests/qpa/wayland/wayland.pro @@ -1,4 +1,4 @@ -SOURCES = client.cpp +SOURCES = wayland.cpp CONFIG -= qt QMAKE_CXXFLAGS += $$QT_CFLAGS_WAYLAND -- cgit v0.12 From 959b42b5f227486554ab82d50c29d3d2d3f40c08 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke <benjaminfranzke@googlemail.com> Date: Sun, 21 Nov 2010 14:15:37 +0100 Subject: wayland: remove non-public header from config.tests --- config.tests/qpa/wayland/wayland.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config.tests/qpa/wayland/wayland.cpp b/config.tests/qpa/wayland/wayland.cpp index 40ff2cb..28a904d 100644 --- a/config.tests/qpa/wayland/wayland.cpp +++ b/config.tests/qpa/wayland/wayland.cpp @@ -1,5 +1,4 @@ -#include "wayland-client.h" -#include "wayland-glib.h" +#include <wayland-client.h> int main(int, char **) { -- cgit v0.12 From 9d8b093f05a936cdd18f50474cb47c59ed42ac14 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke <benjaminfranzke@googlemail.com> Date: Sun, 21 Nov 2010 14:18:51 +0100 Subject: wayland: use pkgconfig for libdrm in wayland.pro On this system the IncludePath for drm.h was missing So maybe pkgconfig should be additionally also used for libxkbcommon, EGL and GLESv2 to prevent such problems. but i dont know whether its common to use pkg-config in qmake --- src/plugins/platforms/wayland/wayland.pro | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index b0cb98b..4c01fa2 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -16,7 +16,11 @@ HEADERS = qwaylandintegration.h \ contains(QT_CONFIG, opengl) { QT += opengl } -LIBS += -lwayland-client -ldrm -lxkbcommon -lEGL -lGLESv2 +LIBS += -lwayland-client -lxkbcommon -lEGL -lGLESv2 +unix { + CONFIG += link_pkgconfig + PKGCONFIG += libdrm +} include (../fontdatabases/fontconfig/fontconfig.pri) -- cgit v0.12 From 01f21cb23b83ec36267fd606e6137bd7765133c1 Mon Sep 17 00:00:00 2001 From: Rolf Offermanns <roffermanns@sysgo.com> Date: Thu, 25 Nov 2010 12:13:30 +0100 Subject: Fix for uninitialized member in QWaylandCursor Without this patch Qt applications will crash the moment the mouse pointer enters the window. Signed-off-by: Rolf Offermanns <roffermanns@sysgo.com> --- src/plugins/platforms/wayland/qwaylandintegration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 19f339a..82789c8 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -25,7 +25,7 @@ public: QWaylandCursor(QWaylandDisplay *display, QPlatformScreen *screen) : QPlatformCursor(screen) - , mDisplay(display) { } + , mBuffer(0), mDisplay(display) { } void changeCursor(QCursor *cursor, QWidget *widget); QWaylandShmBuffer *mBuffer; -- cgit v0.12 From 9787509be13bfe9e05c4e6f7ab76150edecf133f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Thu, 20 Jan 2011 13:31:48 +0100 Subject: Fix X11 clipboard bug. Truth be told, the x11 clipboard integration in testlite was done rather quickly, thus leaving some cornercases open --- src/plugins/platforms/testlite/qtestliteclipboard.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/testlite/qtestliteclipboard.cpp b/src/plugins/platforms/testlite/qtestliteclipboard.cpp index 25c16ea..d77d45a 100644 --- a/src/plugins/platforms/testlite/qtestliteclipboard.cpp +++ b/src/plugins/platforms/testlite/qtestliteclipboard.cpp @@ -386,9 +386,9 @@ void QTestLiteClipboard::handleSelectionRequest(XEvent *xevent) ; } else if (target == xa_timestamp) { // if (d->timestamp != CurrentTime) { - XChangeProperty(screen()->display(), req->requestor, property, XA_INTEGER, 32, - PropModeReplace, CurrentTime, 1); - ret = property; +// XChangeProperty(screen()->display(), req->requestor, property, XA_INTEGER, 32, +// PropModeReplace, CurrentTime, 1); +// ret = property; // } else { // qWarning("QClipboard: Invalid data timestamp"); // } -- cgit v0.12 From fd28a6ab14fc3c54c443718d405eeb9f98c7dd27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Mon, 17 Jan 2011 13:11:08 +0100 Subject: Remove Lighthouse specific code from QGLWindowSurface --- src/opengl/qwindowsurface_gl.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp index 6185ff8..ea5e9a7 100644 --- a/src/opengl/qwindowsurface_gl.cpp +++ b/src/opengl/qwindowsurface_gl.cpp @@ -401,11 +401,6 @@ void QGLWindowSurface::hijackWindow(QWidget *widget) if (widgetPrivate->extraData()->glContext) return; -#ifdef Q_WS_QPA - QGLContext *ctx = QGLContext::fromPlatformGLContext(widget->platformWindow()->glContext()); - if (!d_ptr->fbo && d_ptr->tried_fbo) - d_ptr->ctx = ctx; -#else QGLContext *ctx = NULL; // For translucent top-level widgets we need alpha in the format. @@ -418,8 +413,7 @@ void QGLWindowSurface::hijackWindow(QWidget *widget) } else ctx = new QGLContext(surfaceFormat, widget); - ctx->create(qt_gl_share_widget()->context()); -#endif + ctx->create(qt_gl_share_context()); #ifndef QT_NO_EGL static bool checkedForNOKSwapRegion = false; -- cgit v0.12 From 37207d16cb51616c0b506dcc57126ff06c9073a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Thu, 20 Jan 2011 08:44:27 +0100 Subject: Make QGLContext::fromPlatformGLContext show correct sharing information. Prior to this, if a context was created with QGLWidget it would setup the sharing correct, but all sharing actually created on a QPlatformGLContext level was ignored by the QGLContext, thus indicating that it wasnt sharing with any other context. --- src/gui/kernel/qplatformglcontext_qpa.cpp | 2 +- src/gui/kernel/qplatformglcontext_qpa.h | 2 +- src/opengl/qgl_p.h | 1 + src/opengl/qgl_qpa.cpp | 30 ++++++++++++++---------------- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/gui/kernel/qplatformglcontext_qpa.cpp b/src/gui/kernel/qplatformglcontext_qpa.cpp index 14bd718..1673aed 100644 --- a/src/gui/kernel/qplatformglcontext_qpa.cpp +++ b/src/gui/kernel/qplatformglcontext_qpa.cpp @@ -138,7 +138,7 @@ void QPlatformGLContext::setDefaultSharedContext(QPlatformGLContext *sharedConte Default shared context is intended to be a globally awailable pointer to a context which can be used for sharing resources when creating new contexts. Its default value is 0; */ -const QPlatformGLContext *QPlatformGLContext::defaultSharedContext() +QPlatformGLContext *QPlatformGLContext::defaultSharedContext() { return QPlatformGLContextPrivate::staticSharedContext; } diff --git a/src/gui/kernel/qplatformglcontext_qpa.h b/src/gui/kernel/qplatformglcontext_qpa.h index a70e046..807ed3d 100644 --- a/src/gui/kernel/qplatformglcontext_qpa.h +++ b/src/gui/kernel/qplatformglcontext_qpa.h @@ -69,7 +69,7 @@ public: virtual QPlatformWindowFormat platformWindowFormat() const = 0; const static QPlatformGLContext *currentContext(); - const static QPlatformGLContext *defaultSharedContext(); + static QPlatformGLContext *defaultSharedContext(); protected: diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h index ca8bc55..858a915 100644 --- a/src/opengl/qgl_p.h +++ b/src/opengl/qgl_p.h @@ -373,6 +373,7 @@ public: #if defined(Q_WS_QPA) QPlatformGLContext *platformContext; + void setupSharing(); #elif defined(Q_WS_X11) || defined(Q_WS_MAC) void* cx; #endif diff --git a/src/opengl/qgl_qpa.cpp b/src/opengl/qgl_qpa.cpp index 52eb57f..0f4b305 100644 --- a/src/opengl/qgl_qpa.cpp +++ b/src/opengl/qgl_qpa.cpp @@ -115,6 +115,16 @@ QPlatformWindowFormat QGLFormat::toPlatformWindowFormat(const QGLFormat &format) return retFormat; } +void QGLContextPrivate::setupSharing() { + Q_Q(QGLContext); + QPlatformGLContext *sharedPlatformGLContext = platformContext->platformWindowFormat().sharedGLContext(); + if (sharedPlatformGLContext) { + QGLContext *actualSharedContext = QGLContext::fromPlatformGLContext(sharedPlatformGLContext); + sharing = true; + QGLContextGroup::addShare(q,actualSharedContext); + } +} + bool QGLFormat::hasOpenGL() { return QApplicationPrivate::platformIntegration()->hasOpenGL(); @@ -151,19 +161,9 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) if (d->valid) { d->platformContext->setQGLContextHandle(this,qDeleteQGLContext); } + d->setupSharing(); } - if (d->valid) { - QPlatformGLContext *sharedPlatformGLContext = d->platformContext->platformWindowFormat().sharedGLContext(); - if (sharedPlatformGLContext) { - QGLContext *actualSharedContext = QGLContext::fromPlatformGLContext(sharedPlatformGLContext); - if (actualSharedContext == shareContext) { - d->sharing = true;//Will add combination in QGLContext::create - }else { - QGLContextGroup::addShare(this,actualSharedContext); - } - } - } return d->valid; } @@ -372,6 +372,9 @@ QGLContext::QGLContext(QPlatformGLContext *platformContext) Q_D(QGLContext); d->init(0,QGLFormat::fromPlatformWindowFormat(platformContext->platformWindowFormat())); d->platformContext = platformContext; + d->platformContext->setQGLContextHandle(this,qDeleteQGLContext); + d->valid = true; + d->setupSharing(); } QGLContext *QGLContext::fromPlatformGLContext(QPlatformGLContext *platformContext) @@ -384,11 +387,6 @@ QGLContext *QGLContext::fromPlatformGLContext(QPlatformGLContext *platformContex QGLContext *glContext = new QGLContext(platformContext); //Dont call create on context. This can cause the platformFormat to be set on the widget, which //will cause the platformWindow to be recreated. - glContext->d_func()->platformContext->setQGLContextHandle(glContext,qDeleteQGLContext); - QGLFormat format = QGLFormat::fromPlatformWindowFormat(platformContext->platformWindowFormat()); - glContext->d_func()->glFormat = format; - glContext->d_func()->valid = true; - return glContext; } -- cgit v0.12 From 9d5675645dfb4b527932e7090f503ede2cc21efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Wed, 5 Jan 2011 12:10:28 +0100 Subject: Fix Wayland plugin to work with Wayland after some interfaces changed such as wl_display_create -> wl_display_connect wl_surface_attach (attributes) wl_surface_map -> wl_surface_map_toplevel wl_shell_listener wl_output_listener --- src/plugins/platforms/wayland/qwaylandintegration.cpp | 17 ++++++++--------- src/plugins/platforms/wayland/qwaylandintegration.h | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 82789c8..61f696c 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -259,7 +259,6 @@ const struct wl_drm_listener QWaylandDisplay::drmListener = { void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell, uint32_t time, uint32_t edges, struct wl_surface *surface, - int32_t x, int32_t y, int32_t width, int32_t height) { Q_UNUSED(data); @@ -268,7 +267,7 @@ void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell, Q_UNUSED(edges); QWaylandWindow *ww = (QWaylandWindow *) wl_surface_get_user_data(surface); - ww->configure(time, edges, x, y, width, height); + ww->configure(time, edges, 0, 0, width, height); } const struct wl_shell_listener QWaylandDisplay::shellListener = { @@ -277,14 +276,15 @@ const struct wl_shell_listener QWaylandDisplay::shellListener = { void QWaylandDisplay::outputHandleGeometry(void *data, struct wl_output *output, - int32_t width, int32_t height) + int32_t x, int32_t y, + int32_t width, int32_t height) { Q_UNUSED(output); QWaylandDisplay *qwd = (QWaylandDisplay *) data; QWaylandScreen *screen; screen = new QWaylandScreen(); - screen->mGeometry = QRect(0, 0, width, height); + screen->mGeometry = QRect(x, y, width, height); screen->mDepth = 32; screen->mFormat = QImage::Format_ARGB32_Premultiplied; screen->mOutput = output; @@ -344,7 +344,7 @@ static void forceRoundtrip(struct wl_display *display) wl_display_iterate(display, WL_DISPLAY_READABLE); } -static const char socket_name[] = "\0wayland"; +static const char *socket_name = NULL; void QWaylandDisplay::eventDispatcher(void) { @@ -376,7 +376,7 @@ void QWaylandDisplay::flushRequests(void) QWaylandDisplay::QWaylandDisplay(void) : mWriteNotifier(0) { - mDisplay = wl_display_create(socket_name, sizeof socket_name); + mDisplay = wl_display_connect(socket_name); if (mDisplay == NULL) { fprintf(stderr, "failed to create display: %m\n"); return; @@ -483,9 +483,8 @@ void QWaylandWindow::attach(QWaylandBuffer *buffer) mBuffer = buffer; if (mSurface) { - wl_surface_attach(mSurface, mBuffer->mBuffer); - wl_surface_map(mSurface, geometry.x(), geometry.y(), - geometry.width(), geometry.height()); + wl_surface_attach(mSurface, mBuffer->mBuffer,geometry.x(),geometry.y()); + wl_surface_map_toplevel(mSurface); } } diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 611ce43..84afcb4 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -115,12 +115,12 @@ private: static void outputHandleGeometry(void *data, struct wl_output *output, + int32_t x, int32_t y, int32_t width, int32_t height); static void shellHandleConfigure(void *data, struct wl_shell *shell, uint32_t time, uint32_t edges, struct wl_surface *surface, - int32_t x, int32_t y, int32_t width, int32_t height); static int sourceUpdate(uint32_t mask, void *data); -- cgit v0.12 From 7052bcc0c6da28f9554f560fef36a5ae3d1e26fd Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Mon, 24 Jan 2011 20:28:56 +0100 Subject: remove the completely insane quote nesting from split_value_list() "foo 'bar "whee"' baz" would be actually treated like nested quotes. of course, this makes utterly no sense, as both the layers below and above couldn't do anything with that. and it would break actually useful things like quoting an apostrophe. Reviewed-by: mariusSO --- qmake/project.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index f314b8b..cbe3a94 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -287,7 +287,7 @@ static QStringList split_value_list(const QString &vals) { QString build; QStringList ret; - QStack<char> quote; + ushort quote = 0; const ushort LPAREN = '('; const ushort RPAREN = ')'; @@ -303,17 +303,17 @@ static QStringList split_value_list(const QString &vals) if(x != (int)vals_len-1 && unicode == BACKSLASH && (vals_data[x+1].unicode() == SINGLEQUOTE || vals_data[x+1].unicode() == DOUBLEQUOTE)) { build += vals_data[x++]; //get that 'escape' - } else if(!quote.isEmpty() && unicode == quote.top()) { - quote.pop(); - } else if(unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE) { - quote.push(unicode); + } else if(quote && unicode == quote) { + quote = 0; + } else if(!quote && (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE)) { + quote = unicode; } else if(unicode == RPAREN) { --parens; } else if(unicode == LPAREN) { ++parens; } - if(!parens && quote.isEmpty() && (vals_data[x] == Option::field_sep)) { + if(!parens && !quote && (vals_data[x] == Option::field_sep)) { ret << build; build.clear(); } else { -- cgit v0.12 From 9e0f4a89564997856c784aed6611b91a9f9f184a Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Mon, 24 Jan 2011 20:44:22 +0100 Subject: remove the somewhat bizarre unquoting of the last argument in split_arg_list() the last argument would be unquoted, but only if currently in a quote. that means that an invalid construct like "foo"" would be reduced to another invalid construct foo". this doesn't sound overly useful ... Reviewed-by: mariusSO --- qmake/project.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index cbe3a94..4053b3d 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -254,11 +254,6 @@ static QStringList split_arg_list(QString params) while(x && params_data[x-1].unicode() == SPACE) --x; QString mid(params_data+last, x-last); - if(quote) { - if(mid[0] == quote && mid[(int)mid.length()-1] == quote) - mid = mid.mid(1, mid.length()-2); - quote = 0; - } args << mid; break; } -- cgit v0.12 From 1f28efe4125397f2a61af421dbeb9f6954ca2a9c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 25 Jan 2011 13:17:08 +0100 Subject: slightly reorganize split_arg_list() cut down code duplication Reviewed-by: mariusSO --- qmake/project.cpp | 59 ++++++++++++++++++++++++++----------------------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index 4053b3d..d690770 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -241,41 +241,38 @@ static QStringList split_arg_list(QString params) const ushort SPACE = ' '; //const ushort TAB = '\t'; - ushort unicode; const QChar *params_data = params.data(); const int params_len = params.length(); - int last = 0; - while(last < params_len && (params_data[last].unicode() == SPACE - /*|| params_data[last].unicode() == TAB*/)) - ++last; - for(int x = last, parens = 0; x <= params_len; x++) { - unicode = params_data[x].unicode(); - if(x == params_len) { - while(x && params_data[x-1].unicode() == SPACE) - --x; - QString mid(params_data+last, x-last); - args << mid; - break; - } - if(unicode == LPAREN) { - --parens; - } else if(unicode == RPAREN) { - ++parens; - } else if(quote && unicode == quote) { - quote = 0; - } else if(!quote && (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE)) { - quote = unicode; - } - if(!parens && !quote && unicode == COMMA) { - QString mid = params.mid(last, x - last).trimmed(); - args << mid; - last = x+1; - while(last < params_len && (params_data[last].unicode() == SPACE - /*|| params_data[last].unicode() == TAB*/)) - ++last; + for(int last = 0; ;) { + while(last < params_len && (params_data[last].unicode() == SPACE + /*|| params_data[last].unicode() == TAB*/)) + ++last; + for(int x = last, parens = 0; ; x++) { + if(x == params_len) { + while(x && params_data[x-1].unicode() == SPACE) + --x; + QString mid(params_data+last, x-last); + args << mid; + return args; + } + ushort unicode = params_data[x].unicode(); + if(unicode == LPAREN) { + --parens; + } else if(unicode == RPAREN) { + ++parens; + } else if(quote && unicode == quote) { + quote = 0; + } else if(!quote && (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE)) { + quote = unicode; + } + if(!parens && !quote && unicode == COMMA) { + QString mid = params.mid(last, x - last).trimmed(); + args << mid; + last = x+1; + break; + } } } - return args; } static QStringList split_value_list(const QString &vals) -- cgit v0.12 From 005e39a2aab88d47044fa2108a6d04bd490b169e Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 25 Jan 2011 13:23:24 +0100 Subject: cleanup split_arg_list() some more unify the code paths for last and intermediate arguments. as a side effect, this should be somewhat more efficient. Reviewed-by: mariusSO --- qmake/project.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index d690770..7951d11 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -249,10 +249,9 @@ static QStringList split_arg_list(QString params) ++last; for(int x = last, parens = 0; ; x++) { if(x == params_len) { - while(x && params_data[x-1].unicode() == SPACE) + while(x > last && params_data[x-1].unicode() == SPACE) --x; - QString mid(params_data+last, x-last); - args << mid; + args << params.mid(last, x - last); return args; } ushort unicode = params_data[x].unicode(); @@ -266,9 +265,11 @@ static QStringList split_arg_list(QString params) quote = unicode; } if(!parens && !quote && unicode == COMMA) { - QString mid = params.mid(last, x - last).trimmed(); - args << mid; + int prev = last; last = x+1; + while(x > prev && params_data[x-1].unicode() == SPACE) + --x; + args << params.mid(prev, x - prev); break; } } -- cgit v0.12 From 648dbc62e9c4e3fc15613c86bbf3c33029d56366 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 25 Jan 2011 13:59:20 +0100 Subject: interpret backslash escaping of quotes in split_arg_list() split_value_list() interprets them, too, but this is useless if the higher layer doesn't and is thus confused by unmatched quotes. note the top-level parsing layer doesn't support escapes, but that's ok, because there function calls are "isolated" by non-escapable parenthesis counting (and the RHS of assignments is not subject to any parsing at all). Reviewed-by: mariusSO --- qmake/project.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index 7951d11..88d5962 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -237,6 +237,7 @@ static QStringList split_arg_list(QString params) const ushort RPAREN = ')'; const ushort SINGLEQUOTE = '\''; const ushort DOUBLEQUOTE = '"'; + const ushort BACKSLASH = '\\'; const ushort COMMA = ','; const ushort SPACE = ' '; //const ushort TAB = '\t'; @@ -255,14 +256,17 @@ static QStringList split_arg_list(QString params) return args; } ushort unicode = params_data[x].unicode(); - if(unicode == LPAREN) { - --parens; - } else if(unicode == RPAREN) { - ++parens; + if(x != (int)params_len-1 && unicode == BACKSLASH && + (params_data[x+1].unicode() == SINGLEQUOTE || params_data[x+1].unicode() == DOUBLEQUOTE)) { + x++; //get that 'escape' } else if(quote && unicode == quote) { quote = 0; } else if(!quote && (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE)) { quote = unicode; + } else if(unicode == RPAREN) { + --parens; + } else if(unicode == LPAREN) { + ++parens; } if(!parens && !quote && unicode == COMMA) { int prev = last; -- cgit v0.12 From e881b19ba3f2f4bfda460e1a043f461fb0517d70 Mon Sep 17 00:00:00 2001 From: Sergey Belyashov <Sergey.Belyashov@gmail.com> Date: Tue, 25 Jan 2011 20:41:07 +0100 Subject: Added scrollbars support to the Linguist form preview. Merge-request: 1030 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- tools/linguist/linguist/formpreviewview.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/linguist/linguist/formpreviewview.cpp b/tools/linguist/linguist/formpreviewview.cpp index d46cf76..a2a6002 100644 --- a/tools/linguist/linguist/formpreviewview.cpp +++ b/tools/linguist/linguist/formpreviewview.cpp @@ -463,6 +463,8 @@ FormPreviewView::FormPreviewView(QWidget *parent, MultiDataModel *dataModel) m_mdiArea = new QMdiArea(this); m_mdiArea->addSubWindow(m_mdiSubWindow); setCentralWidget(m_mdiArea); + m_mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + m_mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); } void FormPreviewView::setSourceContext(int model, MessageItem *messageItem) -- cgit v0.12 From ab0a2466d7e3998caad226197355b729f523764a Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Tue, 25 Jan 2011 22:12:07 +0100 Subject: Cocoa: non-native toolbar shows in window when hidden The reason is that we explicitly needs to tell it to hide which we do in the init function. But since QToolBar overrides setVisible, this fails. This patch makes sure we call the super version of the function --- src/gui/widgets/qmenubar.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/widgets/qmenubar.cpp b/src/gui/widgets/qmenubar.cpp index dda5aba..5bfac9a 100644 --- a/src/gui/widgets/qmenubar.cpp +++ b/src/gui/widgets/qmenubar.cpp @@ -1073,8 +1073,11 @@ void QMenuBar::paintEvent(QPaintEvent *e) void QMenuBar::setVisible(bool visible) { #if defined(Q_WS_MAC) || defined(Q_OS_WINCE) || defined(Q_WS_S60) - if (isNativeMenuBar()) + if (isNativeMenuBar()) { + if (!visible) + QWidget::setVisible(false); return; + } #endif QWidget::setVisible(visible); } -- cgit v0.12 From 54313b3ba81c276cf06c40c2420b1ff1f30e64c3 Mon Sep 17 00:00:00 2001 From: Sami Merila <sami.merila@nokia.com> Date: Wed, 26 Jan 2011 09:05:19 +0200 Subject: Application background is incorrect if app locked to landscape. If application orientation has been locked to landscape and application is started out while device orientation is portrait, QS60Style draws the QPalette::background like device would be in landscape. Style is incorrectly following device orientation, when it should follow application orientation. As a fix, style follows now application orientation. As a bonus, unnecessary fullscreen QPixmap creation is avoided when rotating the device. Task-number: QTBUG-16816 Reviewed-by: Jani Hautakangas --- src/gui/styles/qs60style_s60.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp index 04c40aa..605872e 100644 --- a/src/gui/styles/qs60style_s60.cpp +++ b/src/gui/styles/qs60style_s60.cpp @@ -1378,12 +1378,13 @@ QPixmap QS60StylePrivate::frame(SkinFrameElements frame, const QSize &size, Skin QPixmap QS60StylePrivate::backgroundTexture() { bool createNewBackground = false; + TRect applicationRect = (static_cast<CEikAppUi*>(S60->appUi())->ApplicationRect()); if (!m_background) { createNewBackground = true; } else { //if background brush does not match screensize, re-create it - if (m_background->width() != S60->screenWidthInPixels || - m_background->height() != S60->screenHeightInPixels) { + if (m_background->width() != applicationRect.Width() || + m_background->height() != applicationRect.Height()) { delete m_background; createNewBackground = true; } @@ -1391,7 +1392,7 @@ QPixmap QS60StylePrivate::backgroundTexture() if (createNewBackground) { QPixmap background = part(QS60StyleEnums::SP_QsnBgScreen, - QSize(S60->screenWidthInPixels, S60->screenHeightInPixels), 0, SkinElementFlags()); + QSize(applicationRect.Width(), applicationRect.Height()), 0, SkinElementFlags()); m_background = new QPixmap(background); } return *m_background; @@ -1411,7 +1412,6 @@ QS60Style::QS60Style() void QS60StylePrivate::handleDynamicLayoutVariantSwitch() { clearCaches(QS60StylePrivate::CC_LayoutChange); - setBackgroundTexture(qApp); setActiveLayout(); refreshUI(); foreach (QWidget *widget, QApplication::allWidgets()) -- cgit v0.12 From 977ed996677e6156df1a89011d2aefb1c475af4c Mon Sep 17 00:00:00 2001 From: Olivier Goffart <olivier.goffart@nokia.com> Date: Tue, 25 Jan 2011 18:24:58 +0100 Subject: Add util/xkbdatagen/README Reviewed-by: Joao --- src/gui/kernel/qkeymapper_x11_p.cpp | 1 + util/xkbdatagen/README | 1 + util/xkbdatagen/main.cpp | 1 + 3 files changed, 3 insertions(+) create mode 100644 util/xkbdatagen/README diff --git a/src/gui/kernel/qkeymapper_x11_p.cpp b/src/gui/kernel/qkeymapper_x11_p.cpp index 1fad4b0..2dbe1e7 100644 --- a/src/gui/kernel/qkeymapper_x11_p.cpp +++ b/src/gui/kernel/qkeymapper_x11_p.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ // This file is auto-generated, do not edit! +// (Generated using util/xkbdatagen) static struct { const char *layout; diff --git a/util/xkbdatagen/README b/util/xkbdatagen/README new file mode 100644 index 0000000..bae68b8 --- /dev/null +++ b/util/xkbdatagen/README @@ -0,0 +1 @@ +program used to generate qkeymapper_x11_p.cpp diff --git a/util/xkbdatagen/main.cpp b/util/xkbdatagen/main.cpp index 3ec2f57..b8ececc 100644 --- a/util/xkbdatagen/main.cpp +++ b/util/xkbdatagen/main.cpp @@ -456,6 +456,7 @@ int main(int argc, char **argv) "****************************************************************************/\n" "\n" "// This file is auto-generated, do not edit!\n" + "// (Generated using util/xkbdatagen)\n" "\n"); // data structure -- cgit v0.12 From 1c79a42d6b0f6c15a0472e0cde3742d0c504ead3 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Wed, 26 Jan 2011 12:01:19 +0100 Subject: Make sure QStateMachine stops when it's told to If QStateMachine::stop() was called by an event test or while transitioning to another state, the state machine could end up in an inconsistent internal state (stop==true, but the stopped() signal was not emitted). This also caused the machine to behave incorrectly if it was then restarted (it would immediately stop upon receiving the first event). Solution: Move the stop-handling after the event processing loop, so that it always takes precedence over other possible reasons for exiting the loop (event queues exhausted, final state entered). Task-number: QTBUG-16463 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/corelib/statemachine/qstatemachine.cpp | 7 ++- tests/auto/qstatemachine/tst_qstatemachine.cpp | 68 ++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index 392c45d..b2af5ca 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -1245,9 +1245,7 @@ void QStateMachinePrivate::_q_process() #endif while (processing) { if (stop) { - stop = false; processing = false; - stopProcessingReason = Stopped; break; } QSet<QAbstractTransition*> enabledTransitions; @@ -1299,6 +1297,11 @@ void QStateMachinePrivate::_q_process() #ifdef QSTATEMACHINE_DEBUG qDebug() << q << ": finished the event processing loop"; #endif + if (stop) { + stop = false; + stopProcessingReason = Stopped; + } + switch (stopProcessingReason) { case EventQueueEmpty: break; diff --git a/tests/auto/qstatemachine/tst_qstatemachine.cpp b/tests/auto/qstatemachine/tst_qstatemachine.cpp index a03657f..231cab0 100644 --- a/tests/auto/qstatemachine/tst_qstatemachine.cpp +++ b/tests/auto/qstatemachine/tst_qstatemachine.cpp @@ -211,6 +211,9 @@ private slots: void postEventFromOtherThread(); void eventFilterForApplication(); void eventClassesExported(); + void stopInTransitionToFinalState(); + void stopInEventTest_data(); + void stopInEventTest(); }; tst_QStateMachine::tst_QStateMachine() @@ -4374,5 +4377,70 @@ void tst_QStateMachine::eventClassesExported() QStateMachine::SignalEvent *signalEvent = new QStateMachine::SignalEvent(0, 0, QList<QVariant>()); } +void tst_QStateMachine::stopInTransitionToFinalState() +{ + QStateMachine machine; + QState *s1 = new QState(&machine); + QFinalState *s2 = new QFinalState(&machine); + QAbstractTransition *t1 = s1->addTransition(s2); + machine.setInitialState(s1); + + QObject::connect(t1, SIGNAL(triggered()), &machine, SLOT(stop())); + QSignalSpy stoppedSpy(&machine, SIGNAL(stopped())); + QSignalSpy finishedSpy(&machine, SIGNAL(finished())); + QSignalSpy s2EnteredSpy(s2, SIGNAL(entered())); + machine.start(); + + // Stopping should take precedence over finished. + QTRY_COMPARE(stoppedSpy.count(), 1); + QCOMPARE(finishedSpy.count(), 0); + QCOMPARE(s2EnteredSpy.count(), 1); + QCOMPARE(machine.configuration().size(), 1); + QVERIFY(machine.configuration().contains(s2)); +} + +class StopInEventTestTransition : public QAbstractTransition +{ +public: + bool eventTest(QEvent *e) + { + if (e->type() == QEvent::User) + machine()->stop(); + return false; + } + void onTransition(QEvent *) + { } +}; + +void tst_QStateMachine::stopInEventTest_data() +{ + QTest::addColumn<int>("eventPriority"); + QTest::newRow("NormalPriority") << int(QStateMachine::NormalPriority); + QTest::newRow("HighPriority") << int(QStateMachine::HighPriority); +} + +void tst_QStateMachine::stopInEventTest() +{ + QFETCH(int, eventPriority); + + QStateMachine machine; + QState *s1 = new QState(&machine); + s1->addTransition(new StopInEventTestTransition()); + machine.setInitialState(s1); + + QSignalSpy startedSpy(&machine, SIGNAL(started())); + machine.start(); + QTRY_COMPARE(startedSpy.count(), 1); + + QSignalSpy stoppedSpy(&machine, SIGNAL(stopped())); + QSignalSpy finishedSpy(&machine, SIGNAL(finished())); + machine.postEvent(new QEvent(QEvent::User), QStateMachine::EventPriority(eventPriority)); + + QTRY_COMPARE(stoppedSpy.count(), 1); + QCOMPARE(finishedSpy.count(), 0); + QCOMPARE(machine.configuration().size(), 1); + QVERIFY(machine.configuration().contains(s1)); +} + QTEST_MAIN(tst_QStateMachine) #include "tst_qstatemachine.moc" -- cgit v0.12 From 208e8e87d338e8956f4dbb7243a7cc5ec6553f13 Mon Sep 17 00:00:00 2001 From: Sami Merila <sami.merila@nokia.com> Date: Wed, 26 Jan 2011 14:27:35 +0200 Subject: QComboBox popup incorrectly opened in Sym^3 QCombobox popup opens into incorrect position in Sym^3. This is due to that there is a new layout in use, where softkeys are positioned at the bottom. The current implementation just checks if native stacon component is in use and if not, puts the popup to left/right border of the application area (depending on UI direction). Task-number: QTBUG-16886 Reviewed-by: Miikka Heikkinen --- src/gui/widgets/qcombobox.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/gui/widgets/qcombobox.cpp b/src/gui/widgets/qcombobox.cpp index 3e5f1b3..dbbf49a 100644 --- a/src/gui/widgets/qcombobox.cpp +++ b/src/gui/widgets/qcombobox.cpp @@ -2476,10 +2476,18 @@ void QComboBox::showPopup() listRect.setWidth(listRect.height()); //by default popup is centered on screen in landscape listRect.moveCenter(screen.center()); - if (staConTopRect.IsEmpty() && AknLayoutUtils::CbaLocation() != AknLayoutUtils::EAknCbaLocationBottom) { - // landscape without stacon, menu should be at the right - (opt.direction == Qt::LeftToRight) ? listRect.setRight(screen.right()) : - listRect.setLeft(screen.left()); + if (staConTopRect.IsEmpty()) { + TRect cbaRect = TRect(); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EControlPane, cbaRect); + AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation(); + switch (cbaLocation) { + case AknLayoutUtils::EAknCbaLocationRight: + listRect.setRight(screen.right()); + break; + case AknLayoutUtils::EAknCbaLocationLeft: + listRect.setLeft(screen.left()); + break; + } } } #endif -- cgit v0.12 From 121e2b39043a4ffc6583f250aebb9a3a746076c1 Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Mon, 13 Dec 2010 15:38:47 +0100 Subject: Improve timer ID safety by using a serial counter per ID. The high bits of the counter are not used, so we store a serial counter there. This has nothing to do with the serial counter used in nextFreeTimerId, which is there for ABA protection. Reviewed-by: Bradley T. Hughes --- src/corelib/kernel/qabstracteventdispatcher.cpp | 30 ++++++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp index e79f87a..cc08f092 100644 --- a/src/corelib/kernel/qabstracteventdispatcher.cpp +++ b/src/corelib/kernel/qabstracteventdispatcher.cpp @@ -137,6 +137,12 @@ void QAbstractEventDispatcherPrivate::init() // free list). As an added protection, we use the cell to store an invalid // (negative) value that we can later check for integrity. // +// ABA prevention simply adds a value to 7 of the top 8 bits when resetting +// nextFreeTimerId. +// +// The extra code is the bucket allocation which allows us to start with a +// very small bucket size and grow as needed. +// // (continues below). int QAbstractEventDispatcherPrivate::allocateTimerId() { @@ -164,6 +170,8 @@ int QAbstractEventDispatcherPrivate::allocateTimerId() newTimerId = prepareNewValueWithSerialNumber(timerId, b[at]); } while (!nextFreeTimerId.testAndSetRelaxed(timerId, newTimerId)); + timerId &= TimerIdMask; + timerId |= b[at] & TimerSerialMask; b[at] = -timerId; return timerId; @@ -174,12 +182,13 @@ int QAbstractEventDispatcherPrivate::allocateTimerId() // X[timerId] = nextFreeTimerId; // then we update nextFreeTimerId to the timer we've just released // -// The extra code in allocateTimerId and releaseTimerId are ABA prevention -// and bucket memory. The buckets are simply to make sure we allocate only -// the necessary number of timers. See above. -// // ABA prevention simply adds a value to 7 of the top 8 bits when resetting // nextFreeTimerId. +// +// In addition to that, we update the same 7 bits in each entry in the bucket +// as a counter. That way, a timer ID allocated and released will always be +// returned with a different ID. This reduces the chances of timers being released +// erroneously by application code. void QAbstractEventDispatcherPrivate::releaseTimerId(int timerId) { int which = timerId & TimerIdMask; @@ -187,12 +196,21 @@ void QAbstractEventDispatcherPrivate::releaseTimerId(int timerId) int at = bucketIndex(bucket, which); int *b = timerIds[bucket]; - Q_ASSERT(b[at] == -timerId); +#ifndef QT_NO_DEBUG + // debug code + Q_ASSERT_X(timerId == -b[at], "QAbstractEventDispatcher::releaseTimerId", "Timer ID was not found, fix application"); +#else + if (timerId != -b[at]) { + // release code + qWarning("Timer ID %d was not found, fix application", timerId); + return; + } +#endif int freeId, newTimerId; do { freeId = nextFreeTimerId;//.loadAcquire(); // ### FIXME Proper memory ordering semantics - b[at] = freeId & TimerIdMask; + b[at] = prepareNewValueWithSerialNumber(-b[at], freeId); newTimerId = prepareNewValueWithSerialNumber(freeId, timerId); } while (!nextFreeTimerId.testAndSetRelease(freeId, newTimerId)); -- cgit v0.12 From 861333040c252fa0f53894b604f7cb768c085281 Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Wed, 26 Jan 2011 14:06:11 +0100 Subject: Check if the interpolators have already been deleted. During application destruction, the order in which static destructors is run is undetermined. So avoid a null-pointer dereference. Task-number: QTBUG-16855 Reviewed-by: Robin Burchell Patch by task reporter --- src/corelib/animation/qvariantanimation.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp index 212e85d..c76cb89 100644 --- a/src/corelib/animation/qvariantanimation.cpp +++ b/src/corelib/animation/qvariantanimation.cpp @@ -431,12 +431,17 @@ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator fun { // will override any existing interpolators QInterpolatorVector *interpolators = registeredInterpolators(); + // When built on solaris with GCC, the destructors can be called + // in such an order that we get here with interpolators == NULL, + // to continue causes the app to crash on exit with a SEGV + if (interpolators) { #ifndef QT_NO_THREAD - QMutexLocker locker(QMutexPool::globalInstanceGet(interpolators)); + QMutexLocker locker(QMutexPool::globalInstanceGet(interpolators)); #endif - if (int(interpolationType) >= interpolators->count()) - interpolators->resize(int(interpolationType) + 1); - interpolators->replace(interpolationType, func); + if (int(interpolationType) >= interpolators->count()) + interpolators->resize(int(interpolationType) + 1); + interpolators->replace(interpolationType, func); + } } -- cgit v0.12 From db3d9b67ac543ddfdac649bec2c1287982d50a4e Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Mon, 20 Dec 2010 19:38:11 +0100 Subject: Change the D-Bus signal filter to return NOT_YET_HANDLED for signals --- src/dbus/qdbusintegrator.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index adc3408..2e7b052 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -558,8 +558,9 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg) switch (amsg.type()) { case QDBusMessage::SignalMessage: handleSignal(amsg); - return true; - break; + // if there are any other filters in this DBusConnection, + // let them see the signal too + return false; case QDBusMessage::MethodCallMessage: handleObjectCall(amsg); return true; -- cgit v0.12 From 7012b6697df8472df5d772394edb0fbf7219da42 Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Fri, 14 Jan 2011 20:15:37 +0100 Subject: QNAM FTP: switch to binary mode before sending a SIZE command With some servers, SIZE is not allowed in ASCII mode or it may return different sizes. Since we transfer in binary anyway, better get the size in binary too. Reviewed-by: Peter Hartmann --- src/network/access/qnetworkaccessftpbackend.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp index 42d2955..b0303aa 100644 --- a/src/network/access/qnetworkaccessftpbackend.cpp +++ b/src/network/access/qnetworkaccessftpbackend.cpp @@ -307,8 +307,10 @@ void QNetworkAccessFtpBackend::ftpDone() // logged in successfully, send the stat requests (if supported) QString command = url().path(); command.prepend(QLatin1String("%1 ")); - if (supportsSize) + if (supportsSize) { + ftp->rawCommand(QLatin1String("TYPE I")); sizeId = ftp->rawCommand(command.arg(QLatin1String("SIZE"))); // get size + } if (supportsMdtm) mdtmId = ftp->rawCommand(command.arg(QLatin1String("MDTM"))); // get modified time if (!supportsSize && !supportsMdtm) -- cgit v0.12 From af15d5e128c1216bafa4f9d0121bb4178354e35e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Mon, 10 Jan 2011 15:48:20 +0100 Subject: Lighthouse:Wayland Moving some logic into files --- config.tests/qpa/wayland/wayland.cpp | 40 ++ src/plugins/platforms/wayland/qwaylandcursor.cpp | 180 ++++++++ src/plugins/platforms/wayland/qwaylandcursor.h | 62 +++ src/plugins/platforms/wayland/qwaylanddisplay.cpp | 306 +++++++++++++ src/plugins/platforms/wayland/qwaylanddisplay.h | 125 ++++++ .../platforms/wayland/qwaylanddrmsurface.cpp | 4 +- .../platforms/wayland/qwaylandglcontext.cpp | 10 +- src/plugins/platforms/wayland/qwaylandglcontext.h | 72 +++ .../platforms/wayland/qwaylandinputdevice.cpp | 8 +- .../platforms/wayland/qwaylandintegration.cpp | 482 +-------------------- .../platforms/wayland/qwaylandintegration.h | 145 +------ src/plugins/platforms/wayland/qwaylandscreen.cpp | 43 ++ src/plugins/platforms/wayland/qwaylandscreen.h | 64 +++ .../platforms/wayland/qwaylandshmsurface.cpp | 3 +- src/plugins/platforms/wayland/qwaylandwindow.cpp | 113 +++++ src/plugins/platforms/wayland/qwaylandwindow.h | 80 ++++ .../platforms/wayland/qwaylandwindowsurface.h | 2 - src/plugins/platforms/wayland/wayland.pro | 13 +- 18 files changed, 1121 insertions(+), 631 deletions(-) create mode 100644 src/plugins/platforms/wayland/qwaylandcursor.cpp create mode 100644 src/plugins/platforms/wayland/qwaylandcursor.h create mode 100644 src/plugins/platforms/wayland/qwaylanddisplay.cpp create mode 100644 src/plugins/platforms/wayland/qwaylanddisplay.h create mode 100644 src/plugins/platforms/wayland/qwaylandglcontext.h create mode 100644 src/plugins/platforms/wayland/qwaylandscreen.cpp create mode 100644 src/plugins/platforms/wayland/qwaylandscreen.h create mode 100644 src/plugins/platforms/wayland/qwaylandwindow.cpp create mode 100644 src/plugins/platforms/wayland/qwaylandwindow.h diff --git a/config.tests/qpa/wayland/wayland.cpp b/config.tests/qpa/wayland/wayland.cpp index 28a904d..09f72c6 100644 --- a/config.tests/qpa/wayland/wayland.cpp +++ b/config.tests/qpa/wayland/wayland.cpp @@ -1,3 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ #include <wayland-client.h> int main(int, char **) diff --git a/src/plugins/platforms/wayland/qwaylandcursor.cpp b/src/plugins/platforms/wayland/qwaylandcursor.cpp new file mode 100644 index 0000000..2a1e9a9 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandcursor.cpp @@ -0,0 +1,180 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylandcursor.h" + +#include "qwaylanddisplay.h" +#include "qwaylandwindowsurface.h" +#include "qwaylandinputdevice.h" + +#include <QtGui/QImageReader> + +#define DATADIR "/usr/share" + +static const struct pointer_image { + const char *filename; + int hotspot_x, hotspot_y; +} pointer_images[] = { + /* FIXME: Half of these are wrong... */ + /* Qt::ArrowCursor */ + { DATADIR "/wayland/left_ptr.png", 10, 5 }, + /* Qt::UpArrowCursor */ + { DATADIR "/wayland/top_side.png", 18, 8 }, + /* Qt::CrossCursor */ + { DATADIR "/wayland/top_side.png", 18, 8 }, + /* Qt::WaitCursor */ + { DATADIR "/wayland/top_side.png", 18, 8 }, + /* Qt::IBeamCursor */ + { DATADIR "/wayland/xterm.png", 15, 15 }, + /* Qt::SizeVerCursor */ + { DATADIR "/wayland/top_side.png", 18, 8 }, + /* Qt::SizeHorCursor */ + { DATADIR "/wayland/bottom_left_corner.png", 6, 30 }, + /* Qt::SizeBDiagCursor */ + { DATADIR "/wayland/bottom_right_corner.png", 28, 28 }, + /* Qt::SizeFDiagCursor */ + { DATADIR "/wayland/bottom_side.png", 16, 20 }, + /* Qt::SizeAllCursor */ + { DATADIR "/wayland/left_side.png", 10, 20 }, + /* Qt::BlankCursor */ + { DATADIR "/wayland/right_side.png", 30, 19 }, + /* Qt::SplitVCursor */ + { DATADIR "/wayland/sb_v_double_arrow.png", 15, 15 }, + /* Qt::SplitHCursor */ + { DATADIR "/wayland/sb_h_double_arrow.png", 15, 15 }, + /* Qt::PointingHandCursor */ + { DATADIR "/wayland/hand2.png", 14, 8 }, + /* Qt::ForbiddenCursor */ + { DATADIR "/wayland/top_right_corner.png", 26, 8 }, + /* Qt::WhatsThisCursor */ + { DATADIR "/wayland/top_right_corner.png", 26, 8 }, + /* Qt::BusyCursor */ + { DATADIR "/wayland/top_right_corner.png", 26, 8 }, + /* Qt::OpenHandCursor */ + { DATADIR "/wayland/hand1.png", 18, 11 }, + /* Qt::ClosedHandCursor */ + { DATADIR "/wayland/grabbing.png", 20, 17 }, + /* Qt::DragCopyCursor */ + { DATADIR "/wayland/dnd-copy.png", 13, 13 }, + /* Qt::DragMoveCursor */ + { DATADIR "/wayland/dnd-move.png", 13, 13 }, + /* Qt::DragLinkCursor */ + { DATADIR "/wayland/dnd-link.png", 13, 13 }, +}; + +void QWaylandCursor::changeCursor(QCursor *cursor, QWidget *widget) +{ + const struct pointer_image *p; + + if (widget == NULL) + return; + + p = NULL; + + switch (cursor->shape()) { + case Qt::ArrowCursor: + p = &pointer_images[cursor->shape()]; + break; + case Qt::UpArrowCursor: + case Qt::CrossCursor: + case Qt::WaitCursor: + break; + case Qt::IBeamCursor: + p = &pointer_images[cursor->shape()]; + break; + case Qt::SizeVerCursor: /* 5 */ + case Qt::SizeHorCursor: + case Qt::SizeBDiagCursor: + case Qt::SizeFDiagCursor: + case Qt::SizeAllCursor: + case Qt::BlankCursor: /* 10 */ + break; + case Qt::SplitVCursor: + case Qt::SplitHCursor: + case Qt::PointingHandCursor: + p = &pointer_images[cursor->shape()]; + break; + case Qt::ForbiddenCursor: + case Qt::WhatsThisCursor: /* 15 */ + case Qt::BusyCursor: + break; + case Qt::OpenHandCursor: + case Qt::ClosedHandCursor: + case Qt::DragCopyCursor: + case Qt::DragMoveCursor: /* 20 */ + case Qt::DragLinkCursor: + p = &pointer_images[cursor->shape()]; + break; + + default: + case Qt::BitmapCursor: + break; + } + + if (!p) { + p = &pointer_images[0]; + qWarning("unhandled cursor %d", cursor->shape()); + } + + QImageReader reader(p->filename); + + if (mBuffer == NULL || mBuffer->mImage.size() != reader.size()) { + if (mBuffer) + delete mBuffer; + + mBuffer = new QWaylandShmBuffer(mDisplay, reader.size(), + QImage::Format_ARGB32); + } + + reader.read(&mBuffer->mImage); + + mDisplay->setCursor(mBuffer, p->hotspot_x, p->hotspot_y); +} + +void QWaylandDisplay::setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y) +{ + /* Qt doesn't tell us which input device we should set the cursor + * for, so set it for all devices. */ + for (int i = 0; i < mInputDevices.count(); i++) { + QWaylandInputDevice *inputDevice = mInputDevices.at(i); + inputDevice->attach(buffer, x, y); + } +} diff --git a/src/plugins/platforms/wayland/qwaylandcursor.h b/src/plugins/platforms/wayland/qwaylandcursor.h new file mode 100644 index 0000000..8c9d263 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandcursor.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDCURSOR_H +#define QWAYLANDCURSOR_H + +#include <QtGui/QPlatformCursor> + +class QWaylandShmBuffer; +class QWaylandDisplay; + +class QWaylandCursor : QPlatformCursor { +public: + QWaylandCursor(QWaylandDisplay *display, + QPlatformScreen *screen) + : QPlatformCursor(screen) + , mBuffer(0), mDisplay(display) { } + + void changeCursor(QCursor *cursor, QWidget *widget); + QWaylandShmBuffer *mBuffer; + QWaylandDisplay *mDisplay; +}; + +#endif // QWAYLANDCURSOR_H diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp new file mode 100644 index 0000000..8446777 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -0,0 +1,306 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylanddisplay.h" + +#include "qwaylandwindow.h" +#include "qwaylandscreen.h" +#include "qwaylandcursor.h" +#include "qwaylandinputdevice.h" + +#include <unistd.h> +#include <fcntl.h> +#include <stdio.h> + +extern "C" { +#include <xf86drm.h> +} + +struct wl_surface *QWaylandDisplay::createSurface() +{ + return wl_compositor_create_surface(mCompositor); +} + +struct wl_buffer *QWaylandDisplay::createShmBuffer(int fd, + int width, int height, + uint32_t stride, + struct wl_visual *visual) +{ + return wl_shm_create_buffer(mShm, fd, width, height, stride, visual); +} + +struct wl_buffer *QWaylandDisplay::createDrmBuffer(int name, + int width, int height, + uint32_t stride, + struct wl_visual *visual) +{ + return wl_drm_create_buffer(mDrm, name, width, height, stride, visual); +} + +struct wl_visual *QWaylandDisplay::rgbVisual() +{ + return wl_display_get_rgb_visual(mDisplay); +} + +struct wl_visual *QWaylandDisplay::argbVisual() +{ + return wl_display_get_argb_visual(mDisplay); +} + +struct wl_visual *QWaylandDisplay::argbPremultipliedVisual() +{ + return wl_display_get_premultiplied_argb_visual(mDisplay); +} + +void QWaylandDisplay::drmHandleDevice(void *data, + struct wl_drm *drm, const char *device) +{ + Q_UNUSED(drm); + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + drm_magic_t magic; + + qwd->mDeviceName = strdup(device); + + qwd->mFd = open(qwd->mDeviceName, O_RDWR); + if (qwd->mFd < 0) { + qWarning("drm open failed: %m"); + return; + } + + if (drmGetMagic(qwd->mFd, &magic)) { + qWarning("DRI2: failed to get drm magic"); + return; + } + + wl_drm_authenticate(qwd->mDrm, magic); +} + +void QWaylandDisplay::drmHandleAuthenticated(void *data, struct wl_drm *drm) +{ + Q_UNUSED(drm); + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + EGLint major, minor; + const char *extensions; + + qwd->mEglDisplay = eglGetDRMDisplayMESA(qwd->mFd); + if (qwd->mEglDisplay == NULL) { + qWarning("failed to create display"); + return; + } + + if (!eglInitialize(qwd->mEglDisplay, &major, &minor)) { + qWarning("failed to initialize display"); + qwd->mEglDisplay = NULL; + return; + } + + extensions = eglQueryString(qwd->mEglDisplay, EGL_EXTENSIONS); + if (!strstr(extensions, "EGL_KHR_surfaceless_gles2")) { + qWarning("EGL_KHR_surfaceless_opengles2 not available"); + eglTerminate(qwd->mEglDisplay); + qwd->mEglDisplay = NULL; + return; + } +} + +const struct wl_drm_listener QWaylandDisplay::drmListener = { + QWaylandDisplay::drmHandleDevice, + QWaylandDisplay::drmHandleAuthenticated +}; + +void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell, + uint32_t time, uint32_t edges, + struct wl_surface *surface, + int32_t width, int32_t height) +{ + Q_UNUSED(data); + Q_UNUSED(shell); + Q_UNUSED(time); + Q_UNUSED(edges); + QWaylandWindow *ww = (QWaylandWindow *) wl_surface_get_user_data(surface); + + ww->configure(time, edges, 0, 0, width, height); +} + +const struct wl_shell_listener QWaylandDisplay::shellListener = { + QWaylandDisplay::shellHandleConfigure, +}; + +void QWaylandDisplay::outputHandleGeometry(void *data, + struct wl_output *output, + int32_t x, int32_t y, + int32_t width, int32_t height) +{ + Q_UNUSED(output); + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + QWaylandScreen *screen; + + screen = new QWaylandScreen(); + screen->mGeometry = QRect(x, y, width, height); + screen->mDepth = 32; + screen->mFormat = QImage::Format_ARGB32_Premultiplied; + screen->mOutput = output; + + new QWaylandCursor(qwd, screen); + + qwd->mScreens.append(screen); +} + +const struct wl_output_listener QWaylandDisplay::outputListener = { + QWaylandDisplay::outputHandleGeometry +}; + +void QWaylandDisplay::displayHandleGlobal(struct wl_display *display, + uint32_t id, + const char *interface, + uint32_t version, void *data) +{ + Q_UNUSED(version); + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + + if (strcmp(interface, "compositor") == 0) { + qwd->mCompositor = wl_compositor_create(display, id); + } else if (strcmp(interface, "drm") == 0) { + qwd->mDrm = wl_drm_create(display, id); + wl_drm_add_listener(qwd->mDrm, &drmListener, qwd); + } else if (strcmp(interface, "shm") == 0) { + qwd->mShm = wl_shm_create(display, id); + } else if (strcmp(interface, "shell") == 0) { + qwd->mShell = wl_shell_create(display, id); + wl_shell_add_listener(qwd->mShell, &shellListener, qwd); + } else if (strcmp(interface, "output") == 0) { + struct wl_output *output = wl_output_create(display, id); + wl_output_add_listener(output, &outputListener, qwd); + } else if (strcmp(interface, "input_device") == 0) { + QWaylandInputDevice *inputDevice = + new QWaylandInputDevice(display, id); + qwd->mInputDevices.append(inputDevice); + } +} + +static void roundtripCallback(void *data) +{ + bool *done = (bool *) data; + + *done = true; +} + +static void forceRoundtrip(struct wl_display *display) +{ + bool done; + + wl_display_sync_callback(display, roundtripCallback, &done); + wl_display_iterate(display, WL_DISPLAY_WRITABLE); + done = false; + while (!done) + wl_display_iterate(display, WL_DISPLAY_READABLE); +} + +static const char *socket_name = NULL; + +void QWaylandDisplay::eventDispatcher(void) +{ + wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); +} + +int +QWaylandDisplay::sourceUpdate(uint32_t mask, void *data) +{ + QWaylandDisplay *qwd = (QWaylandDisplay *) data; + + /* FIXME: We get a callback here when we ask wl_display for the + * fd, but at that point we don't have the socket notifier as we + * need the fd to create that. We'll probably need to split that + * API into get_fd and set_update_func functions. */ + if (qwd->mWriteNotifier == NULL) + return 0; + + qwd->mWriteNotifier->setEnabled(mask & WL_DISPLAY_WRITABLE); + + return 0; +} + +void QWaylandDisplay::flushRequests(void) +{ + wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE); +} + +QWaylandDisplay::QWaylandDisplay(void) + : mWriteNotifier(0) +{ + mDisplay = wl_display_connect(socket_name); + if (mDisplay == NULL) { + fprintf(stderr, "failed to create display: %m\n"); + return; + } + + wl_display_add_global_listener(mDisplay, + QWaylandDisplay::displayHandleGlobal, this); + + /* Process connection events. */ + wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); + if (!mShm || !mDeviceName) + forceRoundtrip(mDisplay); + + /* Force a roundtrip to finish the drm authentication so we + * initialize EGL before proceeding */ + forceRoundtrip(mDisplay); + if (mEglDisplay == NULL) + qDebug("EGL not available"); + else + qDebug("EGL initialized"); + + int fd = wl_display_get_fd(mDisplay, sourceUpdate, this); + mReadNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this); + connect(mReadNotifier, + SIGNAL(activated(int)), this, SLOT(eventDispatcher())); + + mWriteNotifier = new QSocketNotifier(fd, QSocketNotifier::Write, this); + connect(mWriteNotifier, + SIGNAL(activated(int)), this, SLOT(flushRequests())); + mWriteNotifier->setEnabled(false); +} + +QWaylandDisplay::~QWaylandDisplay(void) +{ + close(mFd); + wl_display_destroy(mDisplay); +} diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h new file mode 100644 index 0000000..7d989a9 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylanddisplay.h @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDDISPLAY_H +#define QWAYLANDDISPLAY_H + +#include <QtCore/QObject> + +#include <wayland-client.h> + +#define MESA_EGL_NO_X11_HEADERS +#define EGL_EGLEXT_PROTOTYPES +#include <EGL/egl.h> +#include <EGL/eglext.h> + +class QWaylandInputDevice; +class QSocketNotifier; +class QWaylandBuffer; +class QPlatformScreen; + +class QWaylandDisplay : public QObject { + Q_OBJECT; + +public: + QWaylandDisplay(void); + ~QWaylandDisplay(void); + + QList<QPlatformScreen *> screens() const { return mScreens; } + struct wl_surface *createSurface(); + struct wl_buffer *createShmBuffer(int fd, int width, int height, + uint32_t stride, + struct wl_visual *visual); + struct wl_buffer *createDrmBuffer(int name, int width, int height, + uint32_t stride, + struct wl_visual *visual); + struct wl_visual *rgbVisual(); + struct wl_visual *argbVisual(); + struct wl_visual *argbPremultipliedVisual(); + EGLDisplay eglDisplay() { return mEglDisplay; } + + void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y); + +public slots: + void eventDispatcher(void); + void flushRequests(void); + +private: + struct wl_display *mDisplay; + struct wl_compositor *mCompositor; + struct wl_drm *mDrm; + struct wl_shm *mShm; + struct wl_shell *mShell; + char *mDeviceName; + int mFd; + QList<QPlatformScreen *> mScreens; + QList<QWaylandInputDevice *> mInputDevices; + QSocketNotifier *mReadNotifier; + QSocketNotifier *mWriteNotifier; + EGLDisplay mEglDisplay; + + static void displayHandleGlobal(struct wl_display *display, + uint32_t id, + const char *interface, + uint32_t version, void *data); + + static void drmHandleDevice(void *data, + struct wl_drm *drm, const char *device); + static void drmHandleAuthenticated(void *data, struct wl_drm *drm); + + static void outputHandleGeometry(void *data, + struct wl_output *output, + int32_t x, int32_t y, + int32_t width, int32_t height); + + static void shellHandleConfigure(void *data, struct wl_shell *shell, + uint32_t time, uint32_t edges, + struct wl_surface *surface, + int32_t width, int32_t height); + + static int sourceUpdate(uint32_t mask, void *data); + + static const struct wl_drm_listener drmListener; + static const struct wl_output_listener outputListener; + static const struct wl_shell_listener shellListener; +}; + +#endif // QWAYLANDDISPLAY_H diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp index cb4445c..1a7683e 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp @@ -49,8 +49,10 @@ #include <QtOpenGL/private/qgl_p.h> #include <QtOpenGL/private/qglpaintdevice_p.h> -#include "qwaylandintegration.h" +#include "qwaylanddisplay.h" #include "qwaylandwindowsurface.h" +#include "qwaylandwindow.h" +#include "qwaylandscreen.h" #include <wayland-client.h> #include <unistd.h> diff --git a/src/plugins/platforms/wayland/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/qwaylandglcontext.cpp index 264da2e..24abcf8 100644 --- a/src/plugins/platforms/wayland/qwaylandglcontext.cpp +++ b/src/plugins/platforms/wayland/qwaylandglcontext.cpp @@ -1,7 +1,8 @@ -#define GL_GLEXT_PROTOTYPES -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> +#include "qwaylandglcontext.h" +#include "qwaylanddisplay.h" +#include "qwaylandwindow.h" +#include "qwaylandwindowsurface.h" #include "qfontconfigdatabase.h" #include <QImageReader> @@ -19,9 +20,6 @@ #include <private/qpixmapdata_gl_p.h> #include <private/qpaintengineex_opengl2_p.h> -#include "qwaylandintegration.h" -#include "qwaylandwindowsurface.h" - #include <unistd.h> #include <fcntl.h> diff --git a/src/plugins/platforms/wayland/qwaylandglcontext.h b/src/plugins/platforms/wayland/qwaylandglcontext.h new file mode 100644 index 0000000..6e3c108 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandglcontext.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDGLCONTEXT_H +#define QWAYLANDGLCONTEXT_H + +#include <QtGui/QPlatformGLContext> + +class QWaylandDisplay; +class QWaylandWindow; + +#define GL_GLEXT_PROTOTYPES +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + +class QWaylandGLContext : public QPlatformGLContext { +public: + QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format); + ~QWaylandGLContext(); + void makeCurrent(); + void doneCurrent(); + void swapBuffers(); + void* getProcAddress(const QString&); + QPlatformWindowFormat platformWindowFormat() const { return mFormat; } + +private: + QPlatformWindowFormat mFormat; + QWaylandDisplay *mDisplay; + QWaylandWindow *mWindow; + GLuint parentFbo, parentRbo; +}; + + +#endif // QWAYLANDGLCONTEXT_H diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp index 6d489b6..77c5815 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp @@ -1,6 +1,10 @@ -#include <QWindowSystemInterface> +#include "qwaylandinputdevice.h" + #include "qwaylandintegration.h" #include "qwaylandwindowsurface.h" +#include "qwaylandwindow.h" + +#include <QWindowSystemInterface> #include <QtGui/private/qpixmap_raster_p.h> #include <QtGui/QPlatformWindow> @@ -51,7 +55,7 @@ void QWaylandInputDevice::inputHandleMotion(void *data, time, inputDevice->mSurfacePos, inputDevice->mGlobalPos, - inputDevice->mButtons); + inputDevice->mButtons); } void QWaylandInputDevice::inputHandleButton(void *data, diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 61f696c..a6fdc2e 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -1,419 +1,17 @@ -#include "qfontconfigdatabase.h" - -#include <QImageReader> -#include <QWindowSystemInterface> -#include <QPlatformCursor> -#include <QPaintEngine> - -#include <QtGui/QPlatformWindowFormat> - -#include <QtGui/private/qpixmap_raster_p.h> -#include <QtGui/QPlatformWindow> - #include "qwaylandintegration.h" -#include "qwaylandwindowsurface.h" - -#include <unistd.h> -#include <fcntl.h> - -extern "C" { -#include <xf86drm.h> -} - -class QWaylandCursor : QPlatformCursor { -public: - QWaylandCursor(QWaylandDisplay *display, - QPlatformScreen *screen) - : QPlatformCursor(screen) - , mBuffer(0), mDisplay(display) { } - - void changeCursor(QCursor *cursor, QWidget *widget); - QWaylandShmBuffer *mBuffer; - QWaylandDisplay *mDisplay; -}; - -#define DATADIR "/usr/share" - -static const struct pointer_image { - const char *filename; - int hotspot_x, hotspot_y; -} pointer_images[] = { - /* FIXME: Half of these are wrong... */ - /* Qt::ArrowCursor */ - { DATADIR "/wayland/left_ptr.png", 10, 5 }, - /* Qt::UpArrowCursor */ - { DATADIR "/wayland/top_side.png", 18, 8 }, - /* Qt::CrossCursor */ - { DATADIR "/wayland/top_side.png", 18, 8 }, - /* Qt::WaitCursor */ - { DATADIR "/wayland/top_side.png", 18, 8 }, - /* Qt::IBeamCursor */ - { DATADIR "/wayland/xterm.png", 15, 15 }, - /* Qt::SizeVerCursor */ - { DATADIR "/wayland/top_side.png", 18, 8 }, - /* Qt::SizeHorCursor */ - { DATADIR "/wayland/bottom_left_corner.png", 6, 30 }, - /* Qt::SizeBDiagCursor */ - { DATADIR "/wayland/bottom_right_corner.png", 28, 28 }, - /* Qt::SizeFDiagCursor */ - { DATADIR "/wayland/bottom_side.png", 16, 20 }, - /* Qt::SizeAllCursor */ - { DATADIR "/wayland/left_side.png", 10, 20 }, - /* Qt::BlankCursor */ - { DATADIR "/wayland/right_side.png", 30, 19 }, - /* Qt::SplitVCursor */ - { DATADIR "/wayland/sb_v_double_arrow.png", 15, 15 }, - /* Qt::SplitHCursor */ - { DATADIR "/wayland/sb_h_double_arrow.png", 15, 15 }, - /* Qt::PointingHandCursor */ - { DATADIR "/wayland/hand2.png", 14, 8 }, - /* Qt::ForbiddenCursor */ - { DATADIR "/wayland/top_right_corner.png", 26, 8 }, - /* Qt::WhatsThisCursor */ - { DATADIR "/wayland/top_right_corner.png", 26, 8 }, - /* Qt::BusyCursor */ - { DATADIR "/wayland/top_right_corner.png", 26, 8 }, - /* Qt::OpenHandCursor */ - { DATADIR "/wayland/hand1.png", 18, 11 }, - /* Qt::ClosedHandCursor */ - { DATADIR "/wayland/grabbing.png", 20, 17 }, - /* Qt::DragCopyCursor */ - { DATADIR "/wayland/dnd-copy.png", 13, 13 }, - /* Qt::DragMoveCursor */ - { DATADIR "/wayland/dnd-move.png", 13, 13 }, - /* Qt::DragLinkCursor */ - { DATADIR "/wayland/dnd-link.png", 13, 13 }, -}; - -void QWaylandCursor::changeCursor(QCursor *cursor, QWidget *widget) -{ - const struct pointer_image *p; - - if (widget == NULL) - return; - - p = NULL; - - switch (cursor->shape()) { - case Qt::ArrowCursor: - p = &pointer_images[cursor->shape()]; - break; - case Qt::UpArrowCursor: - case Qt::CrossCursor: - case Qt::WaitCursor: - break; - case Qt::IBeamCursor: - p = &pointer_images[cursor->shape()]; - break; - case Qt::SizeVerCursor: /* 5 */ - case Qt::SizeHorCursor: - case Qt::SizeBDiagCursor: - case Qt::SizeFDiagCursor: - case Qt::SizeAllCursor: - case Qt::BlankCursor: /* 10 */ - break; - case Qt::SplitVCursor: - case Qt::SplitHCursor: - case Qt::PointingHandCursor: - p = &pointer_images[cursor->shape()]; - break; - case Qt::ForbiddenCursor: - case Qt::WhatsThisCursor: /* 15 */ - case Qt::BusyCursor: - break; - case Qt::OpenHandCursor: - case Qt::ClosedHandCursor: - case Qt::DragCopyCursor: - case Qt::DragMoveCursor: /* 20 */ - case Qt::DragLinkCursor: - p = &pointer_images[cursor->shape()]; - break; - - default: - case Qt::BitmapCursor: - break; - } - - if (!p) { - p = &pointer_images[0]; - qWarning("unhandled cursor %d", cursor->shape()); - } - - QImageReader reader(p->filename); - - if (mBuffer == NULL || mBuffer->mImage.size() != reader.size()) { - if (mBuffer) - delete mBuffer; - - mBuffer = new QWaylandShmBuffer(mDisplay, reader.size(), - QImage::Format_ARGB32); - } - - reader.read(&mBuffer->mImage); - - mDisplay->setCursor(mBuffer, p->hotspot_x, p->hotspot_y); -} - -void QWaylandDisplay::setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y) -{ - /* Qt doesn't tell us which input device we should set the cursor - * for, so set it for all devices. */ - for (int i = 0; i < mInputDevices.count(); i++) { - QWaylandInputDevice *inputDevice = mInputDevices.at(i); - inputDevice->attach(buffer, x, y); - } -} - -struct wl_surface *QWaylandDisplay::createSurface() -{ - return wl_compositor_create_surface(mCompositor); -} - -struct wl_buffer *QWaylandDisplay::createShmBuffer(int fd, - int width, int height, - uint32_t stride, - struct wl_visual *visual) -{ - return wl_shm_create_buffer(mShm, fd, width, height, stride, visual); -} - -struct wl_buffer *QWaylandDisplay::createDrmBuffer(int name, - int width, int height, - uint32_t stride, - struct wl_visual *visual) -{ - return wl_drm_create_buffer(mDrm, name, width, height, stride, visual); -} - -struct wl_visual *QWaylandDisplay::rgbVisual() -{ - return wl_display_get_rgb_visual(mDisplay); -} - -struct wl_visual *QWaylandDisplay::argbVisual() -{ - return wl_display_get_argb_visual(mDisplay); -} - -struct wl_visual *QWaylandDisplay::argbPremultipliedVisual() -{ - return wl_display_get_premultiplied_argb_visual(mDisplay); -} - -void QWaylandDisplay::drmHandleDevice(void *data, - struct wl_drm *drm, const char *device) -{ - Q_UNUSED(drm); - QWaylandDisplay *qwd = (QWaylandDisplay *) data; - drm_magic_t magic; - - qwd->mDeviceName = strdup(device); - - qwd->mFd = open(qwd->mDeviceName, O_RDWR); - if (qwd->mFd < 0) { - qWarning("drm open failed: %m"); - return; - } - - if (drmGetMagic(qwd->mFd, &magic)) { - qWarning("DRI2: failed to get drm magic"); - return; - } - - wl_drm_authenticate(qwd->mDrm, magic); -} - -void QWaylandDisplay::drmHandleAuthenticated(void *data, struct wl_drm *drm) -{ - Q_UNUSED(drm); - QWaylandDisplay *qwd = (QWaylandDisplay *) data; - EGLint major, minor; - const char *extensions; - - qwd->mEglDisplay = eglGetDRMDisplayMESA(qwd->mFd); - if (qwd->mEglDisplay == NULL) { - qWarning("failed to create display"); - return; - } - - if (!eglInitialize(qwd->mEglDisplay, &major, &minor)) { - qWarning("failed to initialize display"); - qwd->mEglDisplay = NULL; - return; - } - - extensions = eglQueryString(qwd->mEglDisplay, EGL_EXTENSIONS); - if (!strstr(extensions, "EGL_KHR_surfaceless_gles2")) { - qWarning("EGL_KHR_surfaceless_opengles2 not available"); - eglTerminate(qwd->mEglDisplay); - qwd->mEglDisplay = NULL; - return; - } -} - -const struct wl_drm_listener QWaylandDisplay::drmListener = { - QWaylandDisplay::drmHandleDevice, - QWaylandDisplay::drmHandleAuthenticated -}; - -void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell, - uint32_t time, uint32_t edges, - struct wl_surface *surface, - int32_t width, int32_t height) -{ - Q_UNUSED(data); - Q_UNUSED(shell); - Q_UNUSED(time); - Q_UNUSED(edges); - QWaylandWindow *ww = (QWaylandWindow *) wl_surface_get_user_data(surface); - - ww->configure(time, edges, 0, 0, width, height); -} -const struct wl_shell_listener QWaylandDisplay::shellListener = { - QWaylandDisplay::shellHandleConfigure, -}; - -void QWaylandDisplay::outputHandleGeometry(void *data, - struct wl_output *output, - int32_t x, int32_t y, - int32_t width, int32_t height) -{ - Q_UNUSED(output); - QWaylandDisplay *qwd = (QWaylandDisplay *) data; - QWaylandScreen *screen; - - screen = new QWaylandScreen(); - screen->mGeometry = QRect(x, y, width, height); - screen->mDepth = 32; - screen->mFormat = QImage::Format_ARGB32_Premultiplied; - screen->mOutput = output; - - new QWaylandCursor(qwd, screen); - - qwd->mScreens.append(screen); -} - -const struct wl_output_listener QWaylandDisplay::outputListener = { - QWaylandDisplay::outputHandleGeometry -}; - -void QWaylandDisplay::displayHandleGlobal(struct wl_display *display, - uint32_t id, - const char *interface, - uint32_t version, void *data) -{ - Q_UNUSED(version); - QWaylandDisplay *qwd = (QWaylandDisplay *) data; - - if (strcmp(interface, "compositor") == 0) { - qwd->mCompositor = wl_compositor_create(display, id); - } else if (strcmp(interface, "drm") == 0) { - qwd->mDrm = wl_drm_create(display, id); - wl_drm_add_listener(qwd->mDrm, &drmListener, qwd); - } else if (strcmp(interface, "shm") == 0) { - qwd->mShm = wl_shm_create(display, id); - } else if (strcmp(interface, "shell") == 0) { - qwd->mShell = wl_shell_create(display, id); - wl_shell_add_listener(qwd->mShell, &shellListener, qwd); - } else if (strcmp(interface, "output") == 0) { - struct wl_output *output = wl_output_create(display, id); - wl_output_add_listener(output, &outputListener, qwd); - } else if (strcmp(interface, "input_device") == 0) { - QWaylandInputDevice *inputDevice = - new QWaylandInputDevice(display, id); - qwd->mInputDevices.append(inputDevice); - } -} - -static void roundtripCallback(void *data) -{ - bool *done = (bool *) data; - - *done = true; -} - -static void forceRoundtrip(struct wl_display *display) -{ - bool done; - - wl_display_sync_callback(display, roundtripCallback, &done); - wl_display_iterate(display, WL_DISPLAY_WRITABLE); - done = false; - while (!done) - wl_display_iterate(display, WL_DISPLAY_READABLE); -} - -static const char *socket_name = NULL; - -void QWaylandDisplay::eventDispatcher(void) -{ - wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); -} - -int -QWaylandDisplay::sourceUpdate(uint32_t mask, void *data) -{ - QWaylandDisplay *qwd = (QWaylandDisplay *) data; - - /* FIXME: We get a callback here when we ask wl_display for the - * fd, but at that point we don't have the socket notifier as we - * need the fd to create that. We'll probably need to split that - * API into get_fd and set_update_func functions. */ - if (qwd->mWriteNotifier == NULL) - return 0; - - qwd->mWriteNotifier->setEnabled(mask & WL_DISPLAY_WRITABLE); - - return 0; -} - -void QWaylandDisplay::flushRequests(void) -{ - wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE); -} - -QWaylandDisplay::QWaylandDisplay(void) - : mWriteNotifier(0) -{ - mDisplay = wl_display_connect(socket_name); - if (mDisplay == NULL) { - fprintf(stderr, "failed to create display: %m\n"); - return; - } - - wl_display_add_global_listener(mDisplay, - QWaylandDisplay::displayHandleGlobal, this); - - /* Process connection events. */ - wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); - if (!mShm || !mDeviceName) - forceRoundtrip(mDisplay); - - /* Force a roundtrip to finish the drm authentication so we - * initialize EGL before proceeding */ - forceRoundtrip(mDisplay); - if (mEglDisplay == NULL) - qDebug("EGL not available"); - else - qDebug("EGL initialized"); +#include "qwaylanddisplay.h" +#include "qwaylandwindowsurface.h" +#include "qwaylandwindow.h" - int fd = wl_display_get_fd(mDisplay, sourceUpdate, this); - mReadNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this); - connect(mReadNotifier, - SIGNAL(activated(int)), this, SLOT(eventDispatcher())); +#include "qfontconfigdatabase.h" - mWriteNotifier = new QSocketNotifier(fd, QSocketNotifier::Write, this); - connect(mWriteNotifier, - SIGNAL(activated(int)), this, SLOT(flushRequests())); - mWriteNotifier->setEnabled(false); -} +#include <QtGui/QWindowSystemInterface> +#include <QtGui/QPlatformCursor> +#include <QtGui/QPlatformWindowFormat> -QWaylandDisplay::~QWaylandDisplay(void) -{ - close(mFd); - wl_display_destroy(mDisplay); -} +#include <QtGui/private/qpixmap_raster_p.h> +#include <QtOpenGL/private/qpixmapdata_gl_p.h> QWaylandIntegration::QWaylandIntegration(bool useOpenGL) : mFontDb(new QFontconfigDatabase()) @@ -435,69 +33,7 @@ QPixmapData *QWaylandIntegration::createPixmapData(QPixmapData::PixelType type) return new QRasterPixmapData(type); } -QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) - : QPlatformWindow(window) - , mSurface(0) - , mDisplay(display) - , mGLContext(0) - , mBuffer(0) -{ - static WId id = 1; - - mWindowId = id++; -} - -QWaylandWindow::~QWaylandWindow() -{ - if (mGLContext) - delete mGLContext; -} -WId QWaylandWindow::winId() const -{ - return mWindowId; -} - -void QWaylandWindow::setParent(const QPlatformWindow *parent) -{ - QWaylandWindow *wParent = (QWaylandWindow *)parent; - - mParentWindow = wParent; -} - -void QWaylandWindow::setVisible(bool visible) -{ - if (visible) { - mSurface = mDisplay->createSurface(); - wl_surface_set_user_data(mSurface, this); - attach(mBuffer); - } else { - wl_surface_destroy(mSurface); - mSurface = NULL; - } -} - -void QWaylandWindow::attach(QWaylandBuffer *buffer) -{ - QRect geometry = widget()->geometry(); - - mBuffer = buffer; - if (mSurface) { - wl_surface_attach(mSurface, mBuffer->mBuffer,geometry.x(),geometry.y()); - wl_surface_map_toplevel(mSurface); - } -} - -void QWaylandWindow::configure(uint32_t time, uint32_t edges, - int32_t x, int32_t y, - int32_t width, int32_t height) -{ - Q_UNUSED(time); - Q_UNUSED(edges); - QRect geometry = QRect(x, y, width, height); - - QWindowSystemInterface::handleGeometryChange(widget(), geometry); -} QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const { diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 84afcb4..d707612 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -42,138 +42,12 @@ #ifndef QPLATFORMINTEGRATION_WAYLAND_H #define QPLATFORMINTEGRATION_WAYLAND_H -#include <QSocketNotifier> -#include <QObject> #include <QtGui/QPlatformIntegration> -#include <QtGui/QPlatformScreen> -#include <QtGui/QPlatformGLContext> -#include <QtGui/QPlatformWindowFormat> -#include "qgl.h" - -#include <private/qpixmapdata_gl_p.h> - -#include <wayland-client.h> -#include "qwaylandinputdevice.h" - -#define MESA_EGL_NO_X11_HEADERS -#define EGL_EGLEXT_PROTOTYPES -#include <EGL/egl.h> -#include <EGL/eglext.h> QT_BEGIN_NAMESPACE class QWaylandBuffer; - -class QWaylandDisplay : public QObject { - Q_OBJECT; - -public: - QWaylandDisplay(void); - ~QWaylandDisplay(void); - - QList<QPlatformScreen *> screens() const { return mScreens; } - struct wl_surface *createSurface(); - struct wl_buffer *createShmBuffer(int fd, int width, int height, - uint32_t stride, - struct wl_visual *visual); - struct wl_buffer *createDrmBuffer(int name, int width, int height, - uint32_t stride, - struct wl_visual *visual); - struct wl_visual *rgbVisual(); - struct wl_visual *argbVisual(); - struct wl_visual *argbPremultipliedVisual(); - EGLDisplay eglDisplay() { return mEglDisplay; } - - void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y); - -public slots: - void eventDispatcher(void); - void flushRequests(void); - -private: - struct wl_display *mDisplay; - struct wl_compositor *mCompositor; - struct wl_drm *mDrm; - struct wl_shm *mShm; - struct wl_shell *mShell; - char *mDeviceName; - int mFd; - QList<QPlatformScreen *> mScreens; - QList<QWaylandInputDevice *> mInputDevices; - QSocketNotifier *mReadNotifier; - QSocketNotifier *mWriteNotifier; - EGLDisplay mEglDisplay; - - static void displayHandleGlobal(struct wl_display *display, - uint32_t id, - const char *interface, - uint32_t version, void *data); - - static void drmHandleDevice(void *data, - struct wl_drm *drm, const char *device); - static void drmHandleAuthenticated(void *data, struct wl_drm *drm); - - static void outputHandleGeometry(void *data, - struct wl_output *output, - int32_t x, int32_t y, - int32_t width, int32_t height); - - static void shellHandleConfigure(void *data, struct wl_shell *shell, - uint32_t time, uint32_t edges, - struct wl_surface *surface, - int32_t width, int32_t height); - - static int sourceUpdate(uint32_t mask, void *data); - - static const struct wl_drm_listener drmListener; - static const struct wl_output_listener outputListener; - static const struct wl_shell_listener shellListener; -}; - -class QWaylandScreen : public QPlatformScreen -{ -public: - QWaylandScreen() {} - - QRect geometry() const { return mGeometry; } - int depth() const { return mDepth; } - QImage::Format format() const { return mFormat; } - -public: - QRect mGeometry; - int mDepth; - QImage::Format mFormat; - QSize mPhysicalSize; - struct wl_output *mOutput; -}; - - -class QWaylandWindow : public QPlatformWindow -{ -public: - QWaylandWindow(QWidget *window, QWaylandDisplay *display); - ~QWaylandWindow(); - struct wl_surface *surface() { return mSurface; } - - void setVisible(bool visible); - void configure(uint32_t time, uint32_t edges, - int32_t x, int32_t y, int32_t width, int32_t height); - WId winId() const; - void setParent(const QPlatformWindow *parent); - QPlatformGLContext *glContext() const; - void attach(QWaylandBuffer *buffer); - QWaylandBuffer *getBuffer(void) { return mBuffer; } - QWaylandWindow *getParentWindow(void) { return mParentWindow; } - -private: - struct wl_surface *mSurface; - QWaylandDisplay *mDisplay; - QPlatformGLContext *mGLContext; - WId mWindowId; - - QWaylandBuffer *mBuffer; - QWaylandWindow *mParentWindow; -}; +class QWaylandDisplay; class QWaylandIntegration : public QPlatformIntegration { @@ -194,23 +68,6 @@ private: bool mUseOpenGL; }; -class QWaylandGLContext : public QPlatformGLContext { -public: - QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format); - ~QWaylandGLContext(); - void makeCurrent(); - void doneCurrent(); - void swapBuffers(); - void* getProcAddress(const QString&); - QPlatformWindowFormat platformWindowFormat() const { return mFormat; } - -private: - QPlatformWindowFormat mFormat; - QWaylandDisplay *mDisplay; - QWaylandWindow *mWindow; - GLuint parentFbo, parentRbo; -}; - QT_END_NAMESPACE #endif diff --git a/src/plugins/platforms/wayland/qwaylandscreen.cpp b/src/plugins/platforms/wayland/qwaylandscreen.cpp new file mode 100644 index 0000000..4a7e727 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandscreen.cpp @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylandscreen.h" + diff --git a/src/plugins/platforms/wayland/qwaylandscreen.h b/src/plugins/platforms/wayland/qwaylandscreen.h new file mode 100644 index 0000000..808266e --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandscreen.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDSCREEN_H +#define QWAYLANDSCREEN_H + +#include <QtGui/QPlatformScreen> + +class QWaylandScreen : public QPlatformScreen +{ +public: + QWaylandScreen() {} + + QRect geometry() const { return mGeometry; } + int depth() const { return mDepth; } + QImage::Format format() const { return mFormat; } + +public: + QRect mGeometry; + int mDepth; + QImage::Format mFormat; + QSize mPhysicalSize; + struct wl_output *mOutput; +}; + +#endif // QWAYLANDSCREEN_H diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp index 004b93a..1c3a26c 100644 --- a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp @@ -42,8 +42,9 @@ #include <QtCore/qdebug.h> #include <QtGui/private/qapplication_p.h> -#include "qwaylandintegration.h" +#include "qwaylanddisplay.h" #include "qwaylandwindowsurface.h" +#include "qwaylandwindow.h" #include <wayland-client.h> #include <unistd.h> diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp new file mode 100644 index 0000000..4f696b0 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylandwindow.h" + +#include "qwaylanddisplay.h" +#include "qwaylandwindowsurface.h" +#include "qwaylandglcontext.h" + +#include <QtGui/QWidget> +#include <QtGui/QWindowSystemInterface> + +QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) + : QPlatformWindow(window) + , mSurface(0) + , mDisplay(display) + , mGLContext(0) + , mBuffer(0) +{ + static WId id = 1; + + mWindowId = id++; +} + +QWaylandWindow::~QWaylandWindow() +{ + if (mGLContext) + delete mGLContext; +} + +WId QWaylandWindow::winId() const +{ + return mWindowId; +} + +void QWaylandWindow::setParent(const QPlatformWindow *parent) +{ + QWaylandWindow *wParent = (QWaylandWindow *)parent; + + mParentWindow = wParent; +} + +void QWaylandWindow::setVisible(bool visible) +{ + if (visible) { + mSurface = mDisplay->createSurface(); + wl_surface_set_user_data(mSurface, this); + attach(mBuffer); + } else { + wl_surface_destroy(mSurface); + mSurface = NULL; + } +} + +void QWaylandWindow::attach(QWaylandBuffer *buffer) +{ + QRect geometry = widget()->geometry(); + + mBuffer = buffer; + if (mSurface) { + wl_surface_attach(mSurface, mBuffer->mBuffer,geometry.x(),geometry.y()); + wl_surface_map_toplevel(mSurface); + } +} + +void QWaylandWindow::configure(uint32_t time, uint32_t edges, + int32_t x, int32_t y, + int32_t width, int32_t height) +{ + Q_UNUSED(time); + Q_UNUSED(edges); + QRect geometry = QRect(x, y, width, height); + + QWindowSystemInterface::handleGeometryChange(widget(), geometry); +} diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h new file mode 100644 index 0000000..d5cc923 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandwindow.h @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDWINDOW_H +#define QWAYLANDWINDOW_H + +#include <QtGui/QPlatformWindow> + +#include <stdint.h> + +class QWaylandDisplay; +class QWaylandBuffer; + +class QWaylandWindow : public QPlatformWindow +{ +public: + QWaylandWindow(QWidget *window, QWaylandDisplay *display); + ~QWaylandWindow(); + struct wl_surface *surface() { return mSurface; } + + void setVisible(bool visible); + void configure(uint32_t time, uint32_t edges, + int32_t x, int32_t y, int32_t width, int32_t height); + WId winId() const; + void setParent(const QPlatformWindow *parent); + QPlatformGLContext *glContext() const; + void attach(QWaylandBuffer *buffer); + QWaylandBuffer *getBuffer(void) { return mBuffer; } + QWaylandWindow *getParentWindow(void) { return mParentWindow; } + +private: + struct wl_surface *mSurface; + QWaylandDisplay *mDisplay; + QPlatformGLContext *mGLContext; + WId mWindowId; + + QWaylandBuffer *mBuffer; + QWaylandWindow *mParentWindow; +}; + + +#endif // QWAYLANDWINDOW_H diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h index 21c48f9..db57619 100644 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ b/src/plugins/platforms/wayland/qwaylandwindowsurface.h @@ -52,8 +52,6 @@ #include <EGL/egl.h> #include <EGL/eglext.h> -#include <QtOpenGL/qgl.h> - QT_BEGIN_NAMESPACE class QWaylandDisplay; diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index 4c01fa2..784a248 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -8,10 +8,19 @@ SOURCES = main.cpp \ qwaylandshmsurface.cpp \ qwaylanddrmsurface.cpp \ qwaylandinputdevice.cpp \ - qwaylandglcontext.cpp + qwaylandglcontext.cpp \ + qwaylandcursor.cpp \ + qwaylanddisplay.cpp \ + qwaylandwindow.cpp \ + qwaylandscreen.cpp HEADERS = qwaylandintegration.h \ - qwaylandwindowsurface.h + qwaylandwindowsurface.h \ + qwaylandcursor.h \ + qwaylanddisplay.h \ + qwaylandwindow.h \ + qwaylandscreen.h \ + qwaylandglcontext.h contains(QT_CONFIG, opengl) { QT += opengl -- cgit v0.12 From d39662822785484ec8e76066f4f2b65ef8778b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Tue, 18 Jan 2011 15:15:05 +0100 Subject: Make it possible to vertically mirror gl painting The GLPaintDevice gets a flip property. If this is set, the pvr matrix is altered to paint "upside down" Reviewed-by: sroedal --- .../gl2paintengineex/qpaintengineex_opengl2.cpp | 21 ++++++++++++++++++--- src/opengl/qglpaintdevice.cpp | 6 ++++-- src/opengl/qglpaintdevice_p.h | 1 + 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index cf63626..d07fc54 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -337,7 +337,13 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms() matrix.translate(brushOrigin.x(), brushOrigin.y()); QTransform translate(1, 0, 0, 1, -translationPoint.x(), -translationPoint.y()); - QTransform gl_to_qt(1, 0, 0, -1, 0, height); + qreal m22 = -1; + qreal dy = height; + if (device->isFlipped()) { + m22 = 1; + dy = 0; + } + QTransform gl_to_qt(1, 0, 0, m22, 0, dy); QTransform inv_matrix; if (style == Qt::TexturePattern && textureInvertedY == -1) inv_matrix = gl_to_qt * (QTransform(1, 0, 0, -1, 0, currentBrush.texture().height()) * brushQTransform * matrix).inverted() * translate; @@ -376,10 +382,16 @@ void QGL2PaintEngineExPrivate::updateMatrix() // NOTE: The resultant matrix is also transposed, as GL expects column-major matracies const GLfloat wfactor = 2.0f / width; - const GLfloat hfactor = -2.0f / height; + GLfloat hfactor = -2.0f / height; + GLfloat dx = transform.dx(); GLfloat dy = transform.dy(); + if (device->isFlipped()) { + hfactor *= -1; + dy -= height; + } + // Non-integer translates can have strange effects for some rendering operations such as // anti-aliased text rendering. In such cases, we snap the translate to the pixel grid. if (snapToPixelGrid && transform.type() == QTransform::TxTranslate) { @@ -2059,7 +2071,10 @@ void QGL2PaintEngineExPrivate::setScissor(const QRect &rect) { const int left = rect.left(); const int width = rect.width(); - const int bottom = height - (rect.top() + rect.height()); + int bottom = height - (rect.top() + rect.height()); + if (device->isFlipped()) { + bottom = rect.top(); + } const int height = rect.height(); glScissor(left, bottom, width, height); diff --git a/src/opengl/qglpaintdevice.cpp b/src/opengl/qglpaintdevice.cpp index e1dcbfd..c2b2adf 100644 --- a/src/opengl/qglpaintdevice.cpp +++ b/src/opengl/qglpaintdevice.cpp @@ -145,8 +145,10 @@ bool QGLPaintDevice::alphaRequested() const return context()->d_func()->reqFormat.alpha(); } - - +bool QGLPaintDevice::isFlipped() const +{ + return false; +} ////////////////// QGLWidgetGLPaintDevice ////////////////// diff --git a/src/opengl/qglpaintdevice_p.h b/src/opengl/qglpaintdevice_p.h index 04f9c3c..39b91c9 100644 --- a/src/opengl/qglpaintdevice_p.h +++ b/src/opengl/qglpaintdevice_p.h @@ -76,6 +76,7 @@ public: virtual QGLFormat format() const; virtual QSize size() const = 0; virtual bool alphaRequested() const; + virtual bool isFlipped() const; // returns the QGLPaintDevice for the given QPaintDevice static QGLPaintDevice* getDevice(QPaintDevice*); -- cgit v0.12 From 0bf84a428ab6199ae1bb98460b6a8ffb842cba88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Fri, 21 Jan 2011 15:52:02 +0100 Subject: Making clearer separation between responsibility of different classes Ie. Moving code into different files and refactoring some of the classes. The Drmbuffer was most affected. It has a depth and stencil buffer. QWaylandGLContext contain the context. The drm buffer class has to be bound to the context before used. --- src/plugins/platforms/wayland/qwaylandbuffer.h | 60 +++++ src/plugins/platforms/wayland/qwaylandcursor.cpp | 8 +- src/plugins/platforms/wayland/qwaylanddisplay.cpp | 10 + src/plugins/platforms/wayland/qwaylanddisplay.h | 3 + .../platforms/wayland/qwaylanddrmsurface.cpp | 188 ++++++++------- src/plugins/platforms/wayland/qwaylanddrmsurface.h | 106 +++++++++ .../platforms/wayland/qwaylandglcontext.cpp | 262 ++++++++------------- src/plugins/platforms/wayland/qwaylandglcontext.h | 20 +- .../platforms/wayland/qwaylandinputdevice.cpp | 55 ++++- .../platforms/wayland/qwaylandinputdevice.h | 44 +++- .../platforms/wayland/qwaylandintegration.cpp | 46 +++- .../platforms/wayland/qwaylandshmsurface.cpp | 6 +- src/plugins/platforms/wayland/qwaylandshmsurface.h | 82 +++++++ src/plugins/platforms/wayland/qwaylandwindow.cpp | 27 ++- .../platforms/wayland/qwaylandwindowsurface.h | 121 ---------- src/plugins/platforms/wayland/wayland.pro | 8 +- 16 files changed, 641 insertions(+), 405 deletions(-) create mode 100644 src/plugins/platforms/wayland/qwaylandbuffer.h create mode 100644 src/plugins/platforms/wayland/qwaylanddrmsurface.h create mode 100644 src/plugins/platforms/wayland/qwaylandshmsurface.h delete mode 100644 src/plugins/platforms/wayland/qwaylandwindowsurface.h diff --git a/src/plugins/platforms/wayland/qwaylandbuffer.h b/src/plugins/platforms/wayland/qwaylandbuffer.h new file mode 100644 index 0000000..643e89c --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandbuffer.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDBUFFER_H +#define QWAYLANDBUFFER_H + +#include <QtCore/QSize> + +#include <wayland-client-protocol.h> + +class QWaylandBuffer { +public: + QWaylandBuffer() { } + virtual ~QWaylandBuffer() { } + wl_buffer *buffer() {return mBuffer;} + virtual QSize size() const = 0; + +protected: + struct wl_buffer *mBuffer; +}; + +#endif // QWAYLANDBUFFER_H diff --git a/src/plugins/platforms/wayland/qwaylandcursor.cpp b/src/plugins/platforms/wayland/qwaylandcursor.cpp index 2a1e9a9..f4bae88 100644 --- a/src/plugins/platforms/wayland/qwaylandcursor.cpp +++ b/src/plugins/platforms/wayland/qwaylandcursor.cpp @@ -42,12 +42,12 @@ #include "qwaylandcursor.h" #include "qwaylanddisplay.h" -#include "qwaylandwindowsurface.h" #include "qwaylandinputdevice.h" +#include "qwaylandshmsurface.h" #include <QtGui/QImageReader> -#define DATADIR "/usr/share" +#define DATADIR "/home/jlind/install/share" static const struct pointer_image { const char *filename; @@ -156,7 +156,7 @@ void QWaylandCursor::changeCursor(QCursor *cursor, QWidget *widget) QImageReader reader(p->filename); - if (mBuffer == NULL || mBuffer->mImage.size() != reader.size()) { + if (mBuffer == NULL || mBuffer->size() != reader.size()) { if (mBuffer) delete mBuffer; @@ -164,7 +164,7 @@ void QWaylandCursor::changeCursor(QCursor *cursor, QWidget *widget) QImage::Format_ARGB32); } - reader.read(&mBuffer->mImage); + reader.read(mBuffer->image()); mDisplay->setCursor(mBuffer, p->hotspot_x, p->hotspot_y); } diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index 8446777..e5adb499 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -304,3 +304,13 @@ QWaylandDisplay::~QWaylandDisplay(void) close(mFd); wl_display_destroy(mDisplay); } + +void QWaylandDisplay::syncCallback(wl_display_sync_func_t func, void *data) +{ + wl_display_sync_callback(mDisplay, func, data); +} + +void QWaylandDisplay::frameCallback(wl_display_frame_func_t func, void *data) +{ + wl_display_frame_callback(mDisplay, func, data); +} diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h index 7d989a9..a95e9c0 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.h +++ b/src/plugins/platforms/wayland/qwaylanddisplay.h @@ -78,6 +78,9 @@ public: void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y); + void syncCallback(wl_display_sync_func_t func, void *data); + void frameCallback(wl_display_frame_func_t func, void *data); + public slots: void eventDispatcher(void); void flushRequests(void); diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp index 1a7683e..5803abf 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp @@ -38,21 +38,17 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +#include "qwaylanddrmsurface.h" -#define GL_GLEXT_PROTOTYPES -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> +#include "qwaylanddisplay.h" +#include "qwaylandwindow.h" +#include "qwaylandscreen.h" -#include <QGLFramebufferObject> #include <QtCore/qdebug.h> #include <QtGui/private/qapplication_p.h> #include <QtOpenGL/private/qgl_p.h> #include <QtOpenGL/private/qglpaintdevice_p.h> - -#include "qwaylanddisplay.h" -#include "qwaylandwindowsurface.h" -#include "qwaylandwindow.h" -#include "qwaylandscreen.h" +#include <QtGui/private/qpaintengine_p.h> #include <wayland-client.h> #include <unistd.h> @@ -65,46 +61,29 @@ QT_BEGIN_NAMESPACE class QWaylandPaintDevice : public QGLPaintDevice { public: - QWaylandPaintDevice(QWaylandDisplay *display, QWidget *widget) - : QGLPaintDevice(), mDisplay(display), mWidget(widget) - { - QGLFormat format; - mContext = new QGLContext(format, widget); - mContext->create(); - } - - QSize size() const { return mWidget->size(); } - QGLContext *context() const { return mContext; } + QWaylandPaintDevice(QWaylandDisplay *display, QWaylandDrmWindowSurface *windowSurface, QPlatformGLContext *context) + : QGLPaintDevice() + , mDisplay(display) + , mPlatformGLContext(context) + , mWindowSurface(windowSurface) + { + } + + QSize size() const { return mWindowSurface->size(); } + QGLContext *context() const { return QGLContext::fromPlatformGLContext(mPlatformGLContext); } + void beginPaint() { mWindowSurface->currentPaintBuffer()->bindToCurrentContext(); } + void ensureActiveTarget() { } + void endPaint() { } QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); } + bool isFlipped()const {return true;} + - void beginPaint(); - void endPaint(); private: QWaylandDisplay *mDisplay; - QWidget *mWidget; - QGLContext *mContext; -}; - -void QWaylandPaintDevice::beginPaint(void) -{ - QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); - QPlatformGLContext *ctx = mWindow->glContext(); + QPlatformGLContext *mPlatformGLContext; + QWaylandDrmWindowSurface *mWindowSurface; - QGLPaintDevice::beginPaint(); - - ctx->makeCurrent(); -} - -void QWaylandPaintDevice::endPaint(void) -{ - QWaylandWindow *mWindow = (QWaylandWindow *)mWidget->platformWindow(); - QPlatformGLContext *ctx = mWindow->glContext(); - QRect geometry = mWidget->geometry(); - - ctx->doneCurrent(); - - QGLPaintDevice::endPaint(); -} +}; /* * Shared DRM surface for GL based drawing @@ -117,33 +96,36 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, struct wl_visual *visual; EGLint name, stride; - static const EGLint contextAttribs[] = { - EGL_CONTEXT_CLIENT_VERSION, 2, - EGL_NONE - }; + EGLint imageAttribs[] = { - EGL_WIDTH, 0, - EGL_HEIGHT, 0, + EGL_WIDTH, size.width(), + EGL_HEIGHT, size.height(), EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, - EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA, + EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SCANOUT_MESA, EGL_NONE }; - eglBindAPI(EGL_OPENGL_ES_API); - mContext = eglCreateContext(mDisplay->eglDisplay(), NULL, - EGL_NO_CONTEXT, contextAttribs); - eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mContext); - - imageAttribs[1] = size.width(); - imageAttribs[3] = size.height(); mImage = eglCreateDRMImageMESA(mDisplay->eglDisplay(), imageAttribs); + glGenFramebuffers(1, &mFbo); + glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); + + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); + glGenRenderbuffers(1,&mDepthStencil); + glBindRenderbuffer(GL_RENDERBUFFER_EXT,mDepthStencil); + glRenderbufferStorage(GL_RENDERBUFFER_EXT, + GL_DEPTH24_STENCIL8_EXT, size.width(), size.height()); + glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, mDepthStencil); + glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, mDepthStencil); + eglExportDRMImageMESA(mDisplay->eglDisplay(), - mImage, &name, NULL, &stride); + mImage, &name, NULL, &stride); switch (format) { case QImage::Format_ARGB32: @@ -160,6 +142,20 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, mBuffer = display->createDrmBuffer(name, size.width(), size.height(), stride, visual); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT); + + switch(status) { + case GL_NO_ERROR: + case GL_FRAMEBUFFER_COMPLETE_EXT: + qDebug() << "fbo ok"; + break; + default: + qDebug() <<"QWaylandDrmBuffer error: "<< status; + break; + } + QT_CHECK_GLERROR(); + } QWaylandDrmBuffer::~QWaylandDrmBuffer(void) @@ -168,22 +164,31 @@ QWaylandDrmBuffer::~QWaylandDrmBuffer(void) glDeleteTextures(1, &mTexture); eglDestroyImageKHR(mDisplay->eglDisplay(), mImage); wl_buffer_destroy(mBuffer); - eglDestroyContext(mDisplay->eglDisplay(), mContext); } +void QWaylandDrmBuffer::bindToCurrentContext() +{ + Q_ASSERT(QPlatformGLContext::currentContext()); + glViewport(0, 0, size().width(), size().height()); + glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); + glBindTexture(GL_TEXTURE_2D, mTexture); + glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, mTexture, 0); + QT_CHECK_GLERROR(); + +} QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window, QWaylandDisplay *display) : QWindowSurface(window) - , mBuffer(0) + , mBufferList(1) // there is something wrong with the buffer flush. keeping it single buffered for now. + , mCurrentPaintBuffer(0) , mDisplay(display) + , mPaintDevice(new QWaylandPaintDevice(mDisplay, this,window->platformWindow()->glContext())) { - QWaylandWindow *ww = (QWaylandWindow *) window->platformWindow(); - QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); - - mPaintDevice = new QWaylandPaintDevice(display, window); - mBuffer = new QWaylandDrmBuffer(mDisplay, window->size(), format); - ww->attach(mBuffer); + for (int i = 0; i < mBufferList.size(); i++) { + mBufferList[i] = 0; + } } QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface() @@ -191,6 +196,11 @@ QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface() delete mPaintDevice; } +void QWaylandDrmWindowSurface::beginPaint(const QRegion &) +{ + window()->platformWindow()->glContext()->makeCurrent(); +} + QPaintDevice *QWaylandDrmWindowSurface::paintDevice() { return mPaintDevice; @@ -200,42 +210,40 @@ void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion ®ion, con { Q_UNUSED(offset); QWaylandWindow *ww = (QWaylandWindow *) widget->platformWindow(); - QVector<QRect> rects = region.rects(); - const QRect *r; - int i; - for (i = 0; i < rects.size(); i++) { - r = &rects.at(i); - wl_surface_damage(ww->surface(), - r->x(), r->y(), r->width(), r->height()); + QVector<QRect> rects = region.rects(); + for (int i = 0; i < rects.size(); i++) { + QRect r = rects.at(i); + wl_surface_damage(ww->surface(), + r.x(), r.y(), r.width(), r.height()); } + + mCurrentPaintBuffer = ++mCurrentPaintBuffer % mBufferList.size(); + ww->attach(currentPaintBuffer()); } void QWaylandDrmWindowSurface::resize(const QSize &requestedSize) { + QWindowSurface::resize(requestedSize); QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); QWaylandScreen *screen = (QWaylandScreen *)QApplicationPrivate::platformIntegration()->screens().first(); QImage::Format format = screen->format(); - QSize screenSize = screen->geometry().size(); - QSize size = requestedSize; - - if (mBuffer != NULL && mBuffer->mSize == size) - return; - - if (mBuffer != NULL) - delete mBuffer; - /* Clamp to screen size */ - if (size.width() > screenSize.width()) - size.setWidth(screenSize.width()); - if (size.height() > screenSize.height()) - size.setHeight(screenSize.height()); + ww->glContext()->makeCurrent(); - QWindowSurface::resize(size); + for (int i = 0; i < mBufferList.size(); i++) { + if (!mBufferList.at(i) || mBufferList.at(i)->size() != requestedSize) { + delete mBufferList[i]; + mBufferList[i] = new QWaylandDrmBuffer(mDisplay, requestedSize, format); + } + } - mBuffer = new QWaylandDrmBuffer(mDisplay, size, format); + ww->attach(currentPaintBuffer()); +} - ww->attach(mBuffer); +QWaylandDrmBuffer * QWaylandDrmWindowSurface::currentPaintBuffer() const +{ + return mBufferList[mCurrentPaintBuffer]; } QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.h b/src/plugins/platforms/wayland/qwaylanddrmsurface.h new file mode 100644 index 0000000..c67f16f --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.h @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDDRMSURFACE_H +#define QWAYLANDDRMSURFACE_H + +#include "qwaylanddisplay.h" +#include "qwaylandbuffer.h" + +#include <QtGui/private/qwindowsurface_p.h> +#include <QtCore/QVarLengthArray> + +#define GL_GLEXT_PROTOTYPES +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + +#define QT_RESET_GLERROR() \ +{ \ + while (glGetError() != GL_NO_ERROR) {} \ +} +#define QT_CHECK_GLERROR() \ +{ \ + GLenum err = glGetError(); \ + if (err != GL_NO_ERROR) { \ + qDebug("[%s line %d] GL Error: 0x%x", \ + __FILE__, __LINE__, (int)err); \ + } \ +} + +class QWaylandDrmBuffer : public QWaylandBuffer { +public: + QWaylandDrmBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format); + ~QWaylandDrmBuffer(); + + void bindToCurrentContext(); + QSize size() const { return mSize; } + +private: + EGLImageKHR mImage; + QWaylandDisplay *mDisplay; + QSize mSize; + GLuint mFbo; + GLuint mTexture; + GLuint mDepthStencil; +}; + +class QWaylandDrmWindowSurface : public QWindowSurface +{ +public: + QWaylandDrmWindowSurface(QWidget *window, QWaylandDisplay *display); + ~QWaylandDrmWindowSurface(); + + void beginPaint(const QRegion &); + + QPaintDevice *paintDevice(); + void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); + void resize(const QSize &size); + + QWaylandDrmBuffer *currentPaintBuffer() const; +private: + QVarLengthArray<QWaylandDrmBuffer *> mBufferList; + int mCurrentPaintBuffer; + QWaylandDisplay *mDisplay; + QPaintDevice *mPaintDevice; +}; + +#endif // QWAYLANDDRMSURFACE_H diff --git a/src/plugins/platforms/wayland/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/qwaylandglcontext.cpp index 24abcf8..4bf68c4 100644 --- a/src/plugins/platforms/wayland/qwaylandglcontext.cpp +++ b/src/plugins/platforms/wayland/qwaylandglcontext.cpp @@ -1,25 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "qwaylandglcontext.h" #include "qwaylanddisplay.h" #include "qwaylandwindow.h" -#include "qwaylandwindowsurface.h" -#include "qfontconfigdatabase.h" - -#include <QImageReader> -#include <QWindowSystemInterface> -#include <QPlatformCursor> -#include <QPaintEngine> +#include "qwaylanddrmsurface.h" #include <QtGui/QPlatformGLContext> #include <QtGui/QPlatformWindowFormat> -#include <QtGui/private/qpixmap_raster_p.h> -#include <QtGui/QPlatformWindow> - -#include <private/qwindowsurface_gl_p.h> -#include <private/qpixmapdata_gl_p.h> -#include <private/qpaintengineex_opengl2_p.h> - #include <unistd.h> #include <fcntl.h> @@ -27,165 +55,80 @@ extern "C" { #include <xf86drm.h> } -QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format) +Q_GLOBAL_STATIC(QMutex,qt_defaultSharedContextMutex); + +EGLint QWaylandGLContext::contextAttibutes[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE +}; + +QWaylandGLContext::QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowFormat &format) : QPlatformGLContext() , mFormat(format) , mDisplay(wd) - , mWindow(window) - , parentFbo(0) - , parentRbo(0) { + QPlatformGLContext *sharePlatformContext; + if (format.useDefaultSharedContext()) { + if (!QPlatformGLContext::defaultSharedContext()) { + if (qt_defaultSharedContextMutex()->tryLock()){ + createDefaultSharedContex(wd); + qt_defaultSharedContextMutex()->unlock(); + } else { + qt_defaultSharedContextMutex()->lock(); //wait to the the shared context is created + qt_defaultSharedContextMutex()->unlock(); + } + } + sharePlatformContext = QPlatformGLContext::defaultSharedContext(); + } else { + sharePlatformContext = format.sharedGLContext(); + } + mFormat.setSharedContext(sharePlatformContext); + EGLContext shareEGLContext = EGL_NO_CONTEXT; + if (sharePlatformContext) + shareEGLContext = static_cast<const QWaylandGLContext*>(sharePlatformContext)->mContext; + + eglBindAPI(EGL_OPENGL_ES_API); + mContext = eglCreateContext(mDisplay->eglDisplay(), NULL, + shareEGLContext, contextAttibutes); + + mFormat.setAccum(false); + mFormat.setAlphaBufferSize(8); + mFormat.setRedBufferSize(8); + mFormat.setGreenBufferSize(8); + mFormat.setBlueBufferSize(8); + mFormat.setDepth(false); +// mFormat.setDepthBufferSize(8); + mFormat.setStencil(false); +// mFormat.setStencilBufferSize(24); +// mFormat.setSampleBuffers(false); + } +QWaylandGLContext::QWaylandGLContext() + : QPlatformGLContext() + , mDisplay(0) + , mContext(EGL_NO_CONTEXT) +{ } + QWaylandGLContext::~QWaylandGLContext() { - glDeleteRenderbuffers(1, &parentRbo); - glDeleteFramebuffers(1, &parentFbo); + eglDestroyContext(mDisplay->eglDisplay(),mContext); } void QWaylandGLContext::makeCurrent() { - QWaylandDrmBuffer *mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); - QRect geometry = mWindow->geometry(); - - if (!mBuffer) - return; - - eglMakeCurrent(mDisplay->eglDisplay(), 0, 0, mBuffer->mContext); - - glViewport(0, 0, geometry.width(), geometry.height()); - glBindFramebuffer(GL_FRAMEBUFFER, mBuffer->mFbo); - glBindTexture(GL_TEXTURE_2D, mBuffer->mTexture); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, mBuffer->mTexture, 0); + QPlatformGLContext::makeCurrent(); + eglMakeCurrent(mDisplay->eglDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE, mContext); } void QWaylandGLContext::doneCurrent() { -} - -/* drawTexture - Draw from a texture into a the current framebuffer - * @rect: GL normalized coords for drawing (between -1.0f and 1.0f) - * @tex_id: texture source - * @texSize: size of source rectangle in Qt coords - * @br: bounding rect for drawing - */ -static void drawTexture(const QRectF &rect, GLuint tex_id, - const QSize &texSize, const QRectF &br) -{ - QRectF src = br.isEmpty() - ? QRectF(QPointF(), texSize) - : QRectF(QPointF(br.x(), texSize.height() - br.bottom()), br.size()); - qreal width = texSize.width(); - qreal height = texSize.height(); - - src.setLeft(src.left() / width); - src.setRight(src.right() / width); - src.setTop(src.top() / height); - src.setBottom(src.bottom() / height); - - const GLfloat tx1 = src.left(); - const GLfloat tx2 = src.right(); - const GLfloat ty1 = src.top(); - const GLfloat ty2 = src.bottom(); - - GLfloat texCoordArray[4*2] = { - tx1, ty2, tx2, ty2, tx2, ty1, tx1, ty1 - }; - - GLfloat vertexArray[4*2]; - extern void qt_add_rect_to_array(const QRectF &r, GLfloat *array); - qt_add_rect_to_array(rect, vertexArray); - - glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexArray); - glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, texCoordArray); - - glBindTexture(GL_TEXTURE_2D, tex_id); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR); - glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR); - glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); - - glBindTexture(GL_TEXTURE_2D, 0); + QPlatformGLContext::doneCurrent(); + eglMakeCurrent(mDisplay->eglDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); } void QWaylandGLContext::swapBuffers() { - QWaylandWindow *mParentWindow = mWindow->getParentWindow(); - QWaylandDrmBuffer *mBuffer, *mParentBuffer; - QRect geometry = mWindow->geometry(), parentGeometry; - QGLShaderProgram *blitProgram; - QRectF r; - qreal w; - qreal h; - - if (!mParentWindow) { - qDebug("swap without parent widget?\n"); - return; - } - - if (!mParentWindow->surface()) { - qDebug("parent has no surface??\n"); - return; - } - - parentGeometry = mParentWindow->geometry(); - mBuffer = (QWaylandDrmBuffer *)mWindow->getBuffer(); - mParentBuffer = (QWaylandDrmBuffer *)mParentWindow->getBuffer(); - - glDisable(GL_DEPTH_TEST); - - /* These need to be generated against the src context */ - if (!parentFbo) - glGenFramebuffers(1, &parentFbo); - if (!parentRbo) - glGenRenderbuffers(1, &parentRbo); - - glBindFramebuffer(GL_FRAMEBUFFER, parentFbo); - glBindRenderbuffer(GL_RENDERBUFFER, parentRbo); - glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, - mParentBuffer->mImage); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, parentRbo); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mBuffer->mImage); - glViewport(0, 0, parentGeometry.width(), parentGeometry.height()); - - blitProgram = QGLEngineSharedShaders::shadersForContext(QGLContext::currentContext())->blitProgram(); - blitProgram->bind(); - blitProgram->setUniformValue("imageTexture", 0); - - /* Transform the target rect to the appropriate coords on the parent */ - w = parentGeometry.width(); - h = parentGeometry.height(); - - r.setLeft((geometry.left() / w) * 2.0f - 1.0f); - if (geometry.right() == (parentGeometry.width() - 1)) - r.setRight(1.0f); - else - r.setRight((geometry.right() / w) * 2.0f - 1.0f); - - r.setTop((geometry.top() / h) * 2.0f - 1.0f); - if (geometry.bottom() == (parentGeometry.height() - 1)) - r.setBottom(-1.0f); - else - r.setBottom((geometry.bottom() / h) * 2.0f - 1.0f); - - drawTexture(r, mBuffer->mTexture, mParentWindow->widget()->size(), parentGeometry); - - wl_surface_damage(mParentWindow->surface(), geometry.left(), geometry.top(), - geometry.right(), geometry.bottom()); - /* restore things to the last valid GL state */ - makeCurrent(); - /* hack: avoid tight swapBuffers loops */ - usleep(20000); } void *QWaylandGLContext::getProcAddress(const QString &string) @@ -193,13 +136,12 @@ void *QWaylandGLContext::getProcAddress(const QString &string) return (void *) eglGetProcAddress(string.toLatin1().data()); } -QPlatformGLContext *QWaylandWindow::glContext() const +void QWaylandGLContext::createDefaultSharedContex(QWaylandDisplay *display) { - if (!mGLContext) { - QWaylandWindow *that = const_cast<QWaylandWindow *>(this); - that->mGLContext = new QWaylandGLContext(mDisplay, that, widget()->platformWindowFormat()); - } - - return mGLContext; + QWaylandGLContext *defaultSharedContext = new QWaylandGLContext; + defaultSharedContext->mDisplay = display; + defaultSharedContext->mContext = eglCreateContext(mDisplay->eglDisplay(), NULL, + EGL_NO_CONTEXT, contextAttibutes); + QPlatformGLContext::setDefaultSharedContext(defaultSharedContext); } diff --git a/src/plugins/platforms/wayland/qwaylandglcontext.h b/src/plugins/platforms/wayland/qwaylandglcontext.h index 6e3c108..d9ba323 100644 --- a/src/plugins/platforms/wayland/qwaylandglcontext.h +++ b/src/plugins/platforms/wayland/qwaylandglcontext.h @@ -44,16 +44,19 @@ #include <QtGui/QPlatformGLContext> +#include <QtCore/QMutex> class QWaylandDisplay; class QWaylandWindow; +class QWaylandDrmWindowSurface; -#define GL_GLEXT_PROTOTYPES -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> +#define MESA_EGL_NO_X11_HEADERS +#define EGL_EGLEXT_PROTOTYPES +#include <EGL/egl.h> +#include <EGL/eglext.h> class QWaylandGLContext : public QPlatformGLContext { public: - QWaylandGLContext(QWaylandDisplay *wd, QWaylandWindow *window, const QPlatformWindowFormat &format); + QWaylandGLContext(QWaylandDisplay *wd, const QPlatformWindowFormat &format); ~QWaylandGLContext(); void makeCurrent(); void doneCurrent(); @@ -64,8 +67,13 @@ public: private: QPlatformWindowFormat mFormat; QWaylandDisplay *mDisplay; - QWaylandWindow *mWindow; - GLuint parentFbo, parentRbo; + + static EGLint contextAttibutes[]; + EGLContext mContext; + + void createDefaultSharedContex(QWaylandDisplay *display); + QWaylandGLContext(); + }; diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp index 77c5815..03edc07 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp @@ -1,8 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "qwaylandinputdevice.h" #include "qwaylandintegration.h" -#include "qwaylandwindowsurface.h" #include "qwaylandwindow.h" +#include "qwaylandbuffer.h" #include <QWindowSystemInterface> @@ -197,10 +238,12 @@ void QWaylandInputDevice::inputHandleKey(void *data, qWarning("keycode %d, sym %d, string %d, modifiers 0x%x", code, sym, s[0], (int) inputDevice->mModifiers); - QWindowSystemInterface::handleKeyEvent(window->widget(), - time, type, sym, - inputDevice->mModifiers, - QString::fromLatin1(s)); + if (window) { + QWindowSystemInterface::handleKeyEvent(window->widget(), + time, type, sym, + inputDevice->mModifiers, + QString::fromLatin1(s)); + } } void QWaylandInputDevice::inputHandlePointerFocus(void *data, @@ -264,5 +307,5 @@ const struct wl_input_device_listener QWaylandInputDevice::inputDeviceListener = void QWaylandInputDevice::attach(QWaylandBuffer *buffer, int x, int y) { - wl_input_device_attach(mInputDevice, mTime, buffer->mBuffer, x, y); + wl_input_device_attach(mInputDevice, mTime, buffer->buffer(), x, y); } diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.h b/src/plugins/platforms/wayland/qwaylandinputdevice.h index 749ef70..2328db8 100644 --- a/src/plugins/platforms/wayland/qwaylandinputdevice.h +++ b/src/plugins/platforms/wayland/qwaylandinputdevice.h @@ -1,13 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #ifndef QWAYLANDINPUTDEVICE_H #define QWAYLANDINPUTDEVICE_H +#include "qwaylandwindow.h" + #include <QSocketNotifier> #include <QObject> #include <QtGui/QPlatformIntegration> #include <QtGui/QPlatformScreen> #include <wayland-client.h> -#include "qwaylandwindowsurface.h" QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index a6fdc2e..e647880 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -1,7 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "qwaylandintegration.h" #include "qwaylanddisplay.h" -#include "qwaylandwindowsurface.h" +#include "qwaylandshmsurface.h" +#include "qwaylanddrmsurface.h" #include "qwaylandwindow.h" #include "qfontconfigdatabase.h" @@ -29,7 +71,7 @@ QWaylandIntegration::screens() const QPixmapData *QWaylandIntegration::createPixmapData(QPixmapData::PixelType type) const { if (mUseOpenGL) - return new QGLPixmapData(type); + return new QGLPixmapData(type); return new QRasterPixmapData(type); } diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp index 1c3a26c..7112424 100644 --- a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp @@ -38,12 +38,12 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +#include "qwaylandshmsurface.h" #include <QtCore/qdebug.h> #include <QtGui/private/qapplication_p.h> #include "qwaylanddisplay.h" -#include "qwaylandwindowsurface.h" #include "qwaylandwindow.h" #include <wayland-client.h> @@ -104,7 +104,7 @@ QWaylandShmWindowSurface::~QWaylandShmWindowSurface() QPaintDevice *QWaylandShmWindowSurface::paintDevice() { - return &mBuffer->mImage; + return mBuffer->image(); } void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) @@ -129,7 +129,7 @@ void QWaylandShmWindowSurface::resize(const QSize &size) QWindowSurface::resize(size); QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); - if (mBuffer != NULL && mBuffer->mImage.size() == size) + if (mBuffer != NULL && mBuffer->size() == size) return; if (mBuffer != NULL) diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.h b/src/plugins/platforms/wayland/qwaylandshmsurface.h new file mode 100644 index 0000000..8c24e9f --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandshmsurface.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSURFACE_WAYLAND_H +#define QWINDOWSURFACE_WAYLAND_H + +#include "qwaylandbuffer.h" +#include <QtGui/private/qwindowsurface_p.h> + +#include <QtGui/QPlatformWindow> + +QT_BEGIN_NAMESPACE + +class QWaylandDisplay; + +class QWaylandShmBuffer : public QWaylandBuffer { +public: + QWaylandShmBuffer(QWaylandDisplay *display, + const QSize &size, QImage::Format format); + ~QWaylandShmBuffer(); + QSize size() const { return mImage.size(); } + QImage *image() { return &mImage; } +private: + QImage mImage; +}; + +class QWaylandShmWindowSurface : public QWindowSurface +{ +public: + QWaylandShmWindowSurface(QWidget *window, QWaylandDisplay *display); + ~QWaylandShmWindowSurface(); + + QPaintDevice *paintDevice(); + void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); + void resize(const QSize &size); + +private: + QWaylandShmBuffer *mBuffer; + QWaylandDisplay *mDisplay; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index 4f696b0..fa62330 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -42,15 +42,19 @@ #include "qwaylandwindow.h" #include "qwaylanddisplay.h" -#include "qwaylandwindowsurface.h" #include "qwaylandglcontext.h" +#include "qwaylandbuffer.h" + +#include "qwaylanddrmsurface.h" #include <QtGui/QWidget> #include <QtGui/QWindowSystemInterface> +#include <QDebug> + QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) : QPlatformWindow(window) - , mSurface(0) + , mSurface(display->createSurface()) , mDisplay(display) , mGLContext(0) , mBuffer(0) @@ -81,9 +85,8 @@ void QWaylandWindow::setParent(const QPlatformWindow *parent) void QWaylandWindow::setVisible(bool visible) { if (visible) { - mSurface = mDisplay->createSurface(); wl_surface_set_user_data(mSurface, this); - attach(mBuffer); + wl_surface_map_toplevel(mSurface); } else { wl_surface_destroy(mSurface); mSurface = NULL; @@ -92,12 +95,8 @@ void QWaylandWindow::setVisible(bool visible) void QWaylandWindow::attach(QWaylandBuffer *buffer) { - QRect geometry = widget()->geometry(); - - mBuffer = buffer; if (mSurface) { - wl_surface_attach(mSurface, mBuffer->mBuffer,geometry.x(),geometry.y()); - wl_surface_map_toplevel(mSurface); + wl_surface_attach(mSurface, buffer->buffer(),0,0); } } @@ -111,3 +110,13 @@ void QWaylandWindow::configure(uint32_t time, uint32_t edges, QWindowSystemInterface::handleGeometryChange(widget(), geometry); } + +QPlatformGLContext *QWaylandWindow::glContext() const +{ + if (!mGLContext) { + QWaylandWindow *that = const_cast<QWaylandWindow *>(this); + that->mGLContext = new QWaylandGLContext(mDisplay, widget()->platformWindowFormat()); + } + + return mGLContext; +} diff --git a/src/plugins/platforms/wayland/qwaylandwindowsurface.h b/src/plugins/platforms/wayland/qwaylandwindowsurface.h deleted file mode 100644 index db57619..0000000 --- a/src/plugins/platforms/wayland/qwaylandwindowsurface.h +++ /dev/null @@ -1,121 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtOpenVG module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWINDOWSURFACE_WAYLAND_H -#define QWINDOWSURFACE_WAYLAND_H - -#include <QGLFramebufferObject> -#include <QtGui/private/qwindowsurface_p.h> - -#include <QtGui/QPlatformWindow> - -#define MESA_EGL_NO_X11_HEADERS -#define EGL_EGLEXT_PROTOTYPES -#include <EGL/egl.h> -#include <EGL/eglext.h> - -QT_BEGIN_NAMESPACE - -class QWaylandDisplay; - -class QWaylandBuffer { -public: - QWaylandBuffer() { } - virtual ~QWaylandBuffer() { } - struct wl_buffer *mBuffer; -}; - -class QWaylandShmBuffer : public QWaylandBuffer { -public: - QWaylandShmBuffer(QWaylandDisplay *display, - const QSize &size, QImage::Format format); - ~QWaylandShmBuffer(); - QImage mImage; -}; - -class QWaylandShmWindowSurface : public QWindowSurface -{ -public: - QWaylandShmWindowSurface(QWidget *window, QWaylandDisplay *display); - ~QWaylandShmWindowSurface(); - - QPaintDevice *paintDevice(); - void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); - void resize(const QSize &size); - -private: - QWaylandShmBuffer *mBuffer; - QWaylandDisplay *mDisplay; -}; - -class QWaylandDrmBuffer : public QWaylandBuffer { -public: - QWaylandDrmBuffer(QWaylandDisplay *display, - const QSize &size, QImage::Format format); - ~QWaylandDrmBuffer(); - EGLContext mContext; - EGLImageKHR mImage; - GLuint mTexture; - QWaylandDisplay *mDisplay; - QSize mSize; - GLuint mFbo; -}; - -class QWaylandDrmWindowSurface : public QWindowSurface -{ -public: - QWaylandDrmWindowSurface(QWidget *window, QWaylandDisplay *display); - ~QWaylandDrmWindowSurface(); - - QPaintDevice *paintDevice(); - void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); - void resize(const QSize &size); - -private: - QWaylandDrmBuffer *mBuffer; - QWaylandDisplay *mDisplay; - QPaintDevice *mPaintDevice; -}; - - -QT_END_NAMESPACE - -#endif diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index 784a248..8ba1408 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -15,17 +15,19 @@ SOURCES = main.cpp \ qwaylandscreen.cpp HEADERS = qwaylandintegration.h \ - qwaylandwindowsurface.h \ qwaylandcursor.h \ qwaylanddisplay.h \ qwaylandwindow.h \ qwaylandscreen.h \ - qwaylandglcontext.h + qwaylandglcontext.h \ + qwaylandshmsurface.h \ + qwaylanddrmsurface.h \ + qwaylandbuffer.h contains(QT_CONFIG, opengl) { QT += opengl } -LIBS += -lwayland-client -lxkbcommon -lEGL -lGLESv2 +LIBS += -lwayland-client -lxkbcommon -lEGL unix { CONFIG += link_pkgconfig PKGCONFIG += libdrm -- cgit v0.12 From 2d65cd502fb5508426748d9ef7af4697051f1c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Tue, 25 Jan 2011 14:48:25 +0100 Subject: Lighthouse: Wayland, only make one fbo for the WaylandPaintDevice Actually the fbo belongs to the QWaylandPaintDevice, which also holds n QWaylandDrmBuffers. Then the QWaylandDrmWindowSurface gets the current drmbuffer used on flush and attaches it to the window and calls wl_surface_damage --- .../platforms/wayland/qwaylanddrmsurface.cpp | 185 ++++++++++++--------- src/plugins/platforms/wayland/qwaylanddrmsurface.h | 40 ++++- 2 files changed, 138 insertions(+), 87 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp index 5803abf..0725919 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp @@ -47,7 +47,6 @@ #include <QtCore/qdebug.h> #include <QtGui/private/qapplication_p.h> #include <QtOpenGL/private/qgl_p.h> -#include <QtOpenGL/private/qglpaintdevice_p.h> #include <QtGui/private/qpaintengine_p.h> #include <wayland-client.h> @@ -58,33 +57,6 @@ QT_BEGIN_NAMESPACE -class QWaylandPaintDevice : public QGLPaintDevice -{ -public: - QWaylandPaintDevice(QWaylandDisplay *display, QWaylandDrmWindowSurface *windowSurface, QPlatformGLContext *context) - : QGLPaintDevice() - , mDisplay(display) - , mPlatformGLContext(context) - , mWindowSurface(windowSurface) - { - } - - QSize size() const { return mWindowSurface->size(); } - QGLContext *context() const { return QGLContext::fromPlatformGLContext(mPlatformGLContext); } - void beginPaint() { mWindowSurface->currentPaintBuffer()->bindToCurrentContext(); } - void ensureActiveTarget() { } - void endPaint() { } - QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); } - bool isFlipped()const {return true;} - - -private: - QWaylandDisplay *mDisplay; - QPlatformGLContext *mPlatformGLContext; - QWaylandDrmWindowSurface *mWindowSurface; - -}; - /* * Shared DRM surface for GL based drawing */ @@ -94,9 +66,7 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, , mSize(size) { struct wl_visual *visual; - EGLint name, stride; - EGLint imageAttribs[] = { EGL_WIDTH, size.width(), EGL_HEIGHT, size.height(), @@ -107,23 +77,11 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, mImage = eglCreateDRMImageMESA(mDisplay->eglDisplay(), imageAttribs); - glGenFramebuffers(1, &mFbo); - glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); - glGenRenderbuffers(1,&mDepthStencil); - glBindRenderbuffer(GL_RENDERBUFFER_EXT,mDepthStencil); - glRenderbufferStorage(GL_RENDERBUFFER_EXT, - GL_DEPTH24_STENCIL8_EXT, size.width(), size.height()); - glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, mDepthStencil); - glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, mDepthStencil); - eglExportDRMImageMESA(mDisplay->eglDisplay(), mImage, &name, NULL, &stride); @@ -142,6 +100,99 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, mBuffer = display->createDrmBuffer(name, size.width(), size.height(), stride, visual); +} + +QWaylandDrmBuffer::~QWaylandDrmBuffer(void) +{ + glDeleteTextures(1, &mTexture); + eglDestroyImageKHR(mDisplay->eglDisplay(), mImage); + wl_buffer_destroy(mBuffer); +} + +void QWaylandDrmBuffer::bindToCurrentFbo() +{ + Q_ASSERT(QPlatformGLContext::currentContext()); + glBindTexture(GL_TEXTURE_2D, mTexture); + glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, mTexture, 0); + QT_CHECK_GLERROR(); +} + +QWaylandPaintDevice::QWaylandPaintDevice(QWaylandDisplay *display, QWindowSurface *windowSurface, QPlatformGLContext *context) + : QGLPaintDevice() + , mDisplay(display) + , mPlatformGLContext(context) + , mWindowSurface(windowSurface) + , mBufferList(1) + , mCurrentPaintBuffer(0) + , mDepthStencil(0) +{ + for (int i = 0; i < mBufferList.size(); i++) { + mBufferList[i] = 0; + } + + mPlatformGLContext->makeCurrent(); + glGenFramebuffers(1, &m_thisFBO); + glBindFramebuffer(GL_FRAMEBUFFER_EXT, m_thisFBO); + + if (windowSurface->size().isValid()) + resize(windowSurface->size()); +} + +QWaylandPaintDevice::~QWaylandPaintDevice() +{ + for(int i = 0; i < mBufferList.size(); i++) { + delete mBufferList[i]; + } + glDeleteRenderbuffers(1,&mDepthStencil); + glDeleteFramebuffers(1,&m_thisFBO); +} + +QSize QWaylandPaintDevice::size() const +{ + return mSize; +} +QGLContext *QWaylandPaintDevice::context() const +{ + return QGLContext::fromPlatformGLContext(mPlatformGLContext); +} +QPaintEngine *QWaylandPaintDevice::paintEngine() const +{ + return qt_qgl_paint_engine(); +} + +void QWaylandPaintDevice::beginPaint() +{ + QGLPaintDevice::beginPaint(); + currentDrmBuffer()->bindToCurrentFbo(); +} + +bool QWaylandPaintDevice::isFlipped()const +{ + return true; +} + +void QWaylandPaintDevice::resize(const QSize &size) +{ + QImage::Format format = QPlatformScreen::platformScreenForWidget(mWindowSurface->window())->format(); + mPlatformGLContext->makeCurrent(); + mSize = size; + for (int i = 0; i < mBufferList.size(); i++) { + if (!mBufferList.at(i) || mBufferList.at(i)->size() != size) { + delete mBufferList[i]; + mBufferList[i] = new QWaylandDrmBuffer(mDisplay, size, format); + } + } + + glDeleteRenderbuffers(1,&mDepthStencil); + glGenRenderbuffers(1,&mDepthStencil); + glBindRenderbuffer(GL_RENDERBUFFER_EXT,mDepthStencil); + glRenderbufferStorage(GL_RENDERBUFFER_EXT, + GL_DEPTH24_STENCIL8_EXT, size.width(), size.height()); + glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, mDepthStencil); + glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, mDepthStencil); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT); @@ -155,40 +206,26 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, break; } QT_CHECK_GLERROR(); - } -QWaylandDrmBuffer::~QWaylandDrmBuffer(void) +QWaylandDrmBuffer *QWaylandPaintDevice::currentDrmBuffer() const { - glDeleteFramebuffers(1, &mFbo); - glDeleteTextures(1, &mTexture); - eglDestroyImageKHR(mDisplay->eglDisplay(), mImage); - wl_buffer_destroy(mBuffer); + return mBufferList[mCurrentPaintBuffer]; } - -void QWaylandDrmBuffer::bindToCurrentContext() +QWaylandDrmBuffer *QWaylandPaintDevice::currentDrmBufferAndSwap() { - Q_ASSERT(QPlatformGLContext::currentContext()); - glViewport(0, 0, size().width(), size().height()); - glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); - glBindTexture(GL_TEXTURE_2D, mTexture); - glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, mTexture, 0); - QT_CHECK_GLERROR(); - + QWaylandDrmBuffer *currentDrmBuffer = mBufferList[mCurrentPaintBuffer]; + mCurrentPaintBuffer = (mCurrentPaintBuffer +1) % mBufferList.size(); + return currentDrmBuffer; } QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window, QWaylandDisplay *display) : QWindowSurface(window) - , mBufferList(1) // there is something wrong with the buffer flush. keeping it single buffered for now. - , mCurrentPaintBuffer(0) , mDisplay(display) , mPaintDevice(new QWaylandPaintDevice(mDisplay, this,window->platformWindow()->glContext())) { - for (int i = 0; i < mBufferList.size(); i++) { - mBufferList[i] = 0; - } + } QWaylandDrmWindowSurface::~QWaylandDrmWindowSurface() @@ -211,39 +248,25 @@ void QWaylandDrmWindowSurface::flush(QWidget *widget, const QRegion ®ion, con Q_UNUSED(offset); QWaylandWindow *ww = (QWaylandWindow *) widget->platformWindow(); + ww->attach(mPaintDevice->currentDrmBufferAndSwap()); + QVector<QRect> rects = region.rects(); for (int i = 0; i < rects.size(); i++) { QRect r = rects.at(i); wl_surface_damage(ww->surface(), r.x(), r.y(), r.width(), r.height()); } - - mCurrentPaintBuffer = ++mCurrentPaintBuffer % mBufferList.size(); - ww->attach(currentPaintBuffer()); } void QWaylandDrmWindowSurface::resize(const QSize &requestedSize) { QWindowSurface::resize(requestedSize); QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); - QWaylandScreen *screen = (QWaylandScreen *)QApplicationPrivate::platformIntegration()->screens().first(); - QImage::Format format = screen->format(); ww->glContext()->makeCurrent(); - for (int i = 0; i < mBufferList.size(); i++) { - if (!mBufferList.at(i) || mBufferList.at(i)->size() != requestedSize) { - delete mBufferList[i]; - mBufferList[i] = new QWaylandDrmBuffer(mDisplay, requestedSize, format); - } - } - - ww->attach(currentPaintBuffer()); -} - -QWaylandDrmBuffer * QWaylandDrmWindowSurface::currentPaintBuffer() const -{ - return mBufferList[mCurrentPaintBuffer]; + mPaintDevice->resize(requestedSize); + ww->attach(mPaintDevice->currentDrmBuffer()); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.h b/src/plugins/platforms/wayland/qwaylanddrmsurface.h index c67f16f..aa3dbe7 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.h +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.h @@ -47,6 +47,7 @@ #include <QtGui/private/qwindowsurface_p.h> #include <QtCore/QVarLengthArray> +#include <QtOpenGL/private/qglpaintdevice_p.h> #define GL_GLEXT_PROTOTYPES #include <GLES2/gl2.h> @@ -71,16 +72,45 @@ public: const QSize &size, QImage::Format format); ~QWaylandDrmBuffer(); - void bindToCurrentContext(); + void bindToCurrentFbo(); QSize size() const { return mSize; } private: EGLImageKHR mImage; QWaylandDisplay *mDisplay; QSize mSize; - GLuint mFbo; GLuint mTexture; + +}; + +class QWaylandPaintDevice : public QGLPaintDevice +{ +public: + QWaylandPaintDevice(QWaylandDisplay *display, QWindowSurface *windowSurface, QPlatformGLContext *context); + ~QWaylandPaintDevice(); + + QSize size() const; + QGLContext *context() const; + QPaintEngine *paintEngine() const; + + void beginPaint(); + + bool isFlipped()const; + + void resize(const QSize &size); + + QWaylandDrmBuffer *currentDrmBuffer() const; + QWaylandDrmBuffer *currentDrmBufferAndSwap(); + +private: + QWaylandDisplay *mDisplay; + QPlatformGLContext *mPlatformGLContext; + QWindowSurface *mWindowSurface; + QVarLengthArray<QWaylandDrmBuffer *> mBufferList; + int mCurrentPaintBuffer; GLuint mDepthStencil; + QSize mSize; + }; class QWaylandDrmWindowSurface : public QWindowSurface @@ -95,12 +125,10 @@ public: void flush(QWidget *widget, const QRegion ®ion, const QPoint &offset); void resize(const QSize &size); - QWaylandDrmBuffer *currentPaintBuffer() const; private: - QVarLengthArray<QWaylandDrmBuffer *> mBufferList; - int mCurrentPaintBuffer; + QWaylandDisplay *mDisplay; - QPaintDevice *mPaintDevice; + QWaylandPaintDevice *mPaintDevice; }; #endif // QWAYLANDDRMSURFACE_H -- cgit v0.12 From d36a3a6ebc17935371cfca2a9f22dcd683205b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Tue, 25 Jan 2011 17:01:21 +0100 Subject: Lighthouse: Wayland. Make the wayland integration closer to Lighthosue Today there is a connection between QWidget and QPlatformScreen. So I added a accessor in QWaylandScreen to get the corresponding QWaylandDisplay. So now it should be possible to have different QWaylandDisplays. But also its possible to use the internal Lighthouse api closer in the wayland plugin if that should be of interest ;) --- src/plugins/platforms/wayland/qwaylandcursor.cpp | 8 ++++ src/plugins/platforms/wayland/qwaylandcursor.h | 6 +-- src/plugins/platforms/wayland/qwaylanddisplay.cpp | 21 +++++------ src/plugins/platforms/wayland/qwaylanddisplay.h | 5 ++- .../platforms/wayland/qwaylanddrmsurface.cpp | 5 +-- src/plugins/platforms/wayland/qwaylanddrmsurface.h | 2 +- .../platforms/wayland/qwaylandintegration.cpp | 6 +-- src/plugins/platforms/wayland/qwaylandscreen.cpp | 44 ++++++++++++++++++++++ src/plugins/platforms/wayland/qwaylandscreen.h | 22 ++++++++--- .../platforms/wayland/qwaylandshmsurface.cpp | 6 +-- src/plugins/platforms/wayland/qwaylandshmsurface.h | 2 +- src/plugins/platforms/wayland/qwaylandwindow.cpp | 9 +++-- src/plugins/platforms/wayland/qwaylandwindow.h | 2 +- 13 files changed, 99 insertions(+), 39 deletions(-) diff --git a/src/plugins/platforms/wayland/qwaylandcursor.cpp b/src/plugins/platforms/wayland/qwaylandcursor.cpp index f4bae88..29c6abd 100644 --- a/src/plugins/platforms/wayland/qwaylandcursor.cpp +++ b/src/plugins/platforms/wayland/qwaylandcursor.cpp @@ -44,6 +44,7 @@ #include "qwaylanddisplay.h" #include "qwaylandinputdevice.h" #include "qwaylandshmsurface.h" +#include "qwaylandscreen.h" #include <QtGui/QImageReader> @@ -100,6 +101,13 @@ static const struct pointer_image { { DATADIR "/wayland/dnd-link.png", 13, 13 }, }; +QWaylandCursor::QWaylandCursor(QWaylandScreen *screen) + : QPlatformCursor(screen) + , mBuffer(0) + , mDisplay(screen->display()) +{ +} + void QWaylandCursor::changeCursor(QCursor *cursor, QWidget *widget) { const struct pointer_image *p; diff --git a/src/plugins/platforms/wayland/qwaylandcursor.h b/src/plugins/platforms/wayland/qwaylandcursor.h index 8c9d263..19e6047 100644 --- a/src/plugins/platforms/wayland/qwaylandcursor.h +++ b/src/plugins/platforms/wayland/qwaylandcursor.h @@ -46,13 +46,11 @@ class QWaylandShmBuffer; class QWaylandDisplay; +class QWaylandScreen; class QWaylandCursor : QPlatformCursor { public: - QWaylandCursor(QWaylandDisplay *display, - QPlatformScreen *screen) - : QPlatformCursor(screen) - , mBuffer(0), mDisplay(display) { } + QWaylandCursor(QWaylandScreen *screen); void changeCursor(QCursor *cursor, QWidget *widget); QWaylandShmBuffer *mBuffer; diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index e5adb499..70713ec 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -169,19 +169,10 @@ void QWaylandDisplay::outputHandleGeometry(void *data, int32_t x, int32_t y, int32_t width, int32_t height) { - Q_UNUSED(output); - QWaylandDisplay *qwd = (QWaylandDisplay *) data; - QWaylandScreen *screen; - - screen = new QWaylandScreen(); - screen->mGeometry = QRect(x, y, width, height); - screen->mDepth = 32; - screen->mFormat = QImage::Format_ARGB32_Premultiplied; - screen->mOutput = output; - - new QWaylandCursor(qwd, screen); + QWaylandDisplay *waylandDisplay = (QWaylandDisplay *) data; - qwd->mScreens.append(screen); + QRect outputRect = QRect(x, y, width, height); + waylandDisplay->createNewScreen(output, outputRect); } const struct wl_output_listener QWaylandDisplay::outputListener = { @@ -305,6 +296,12 @@ QWaylandDisplay::~QWaylandDisplay(void) wl_display_destroy(mDisplay); } +void QWaylandDisplay::createNewScreen(struct wl_output *output, QRect geometry) +{ + QWaylandScreen *waylandScreen = new QWaylandScreen(this,output,geometry); + mScreens.append(waylandScreen); +} + void QWaylandDisplay::syncCallback(wl_display_sync_func_t func, void *data) { wl_display_sync_callback(mDisplay, func, data); diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h index a95e9c0..f179713 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.h +++ b/src/plugins/platforms/wayland/qwaylanddisplay.h @@ -43,6 +43,7 @@ #define QWAYLANDDISPLAY_H #include <QtCore/QObject> +#include <QtCore/QRect> #include <wayland-client.h> @@ -55,14 +56,16 @@ class QWaylandInputDevice; class QSocketNotifier; class QWaylandBuffer; class QPlatformScreen; +class QWaylandScreen; class QWaylandDisplay : public QObject { - Q_OBJECT; + Q_OBJECT public: QWaylandDisplay(void); ~QWaylandDisplay(void); + void createNewScreen(struct wl_output *output, QRect geometry); QList<QPlatformScreen *> screens() const { return mScreens; } struct wl_surface *createSurface(); struct wl_buffer *createShmBuffer(int fd, int width, int height, diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp index 0725919..76c8c33 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp @@ -219,10 +219,9 @@ QWaylandDrmBuffer *QWaylandPaintDevice::currentDrmBufferAndSwap() return currentDrmBuffer; } -QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window, - QWaylandDisplay *display) +QWaylandDrmWindowSurface::QWaylandDrmWindowSurface(QWidget *window) : QWindowSurface(window) - , mDisplay(display) + , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display()) , mPaintDevice(new QWaylandPaintDevice(mDisplay, this,window->platformWindow()->glContext())) { diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.h b/src/plugins/platforms/wayland/qwaylanddrmsurface.h index aa3dbe7..eafea13 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.h +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.h @@ -116,7 +116,7 @@ private: class QWaylandDrmWindowSurface : public QWindowSurface { public: - QWaylandDrmWindowSurface(QWidget *window, QWaylandDisplay *display); + QWaylandDrmWindowSurface(QWidget *window); ~QWaylandDrmWindowSurface(); void beginPaint(const QRegion &); diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index e647880..02bc680 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -80,7 +80,7 @@ QPixmapData *QWaylandIntegration::createPixmapData(QPixmapData::PixelType type) QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const { Q_UNUSED(winId); - return new QWaylandWindow(widget, mDisplay); + return new QWaylandWindow(widget); } QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId winId) const @@ -89,8 +89,8 @@ QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId wi Q_UNUSED(winId); if (mUseOpenGL) - return new QWaylandDrmWindowSurface(widget, mDisplay); - return new QWaylandShmWindowSurface(widget, mDisplay); + return new QWaylandDrmWindowSurface(widget); + return new QWaylandShmWindowSurface(widget); } QPlatformFontDatabase *QWaylandIntegration::fontDatabase() const diff --git a/src/plugins/platforms/wayland/qwaylandscreen.cpp b/src/plugins/platforms/wayland/qwaylandscreen.cpp index 4a7e727..aa1083f 100644 --- a/src/plugins/platforms/wayland/qwaylandscreen.cpp +++ b/src/plugins/platforms/wayland/qwaylandscreen.cpp @@ -41,3 +41,47 @@ #include "qwaylandscreen.h" +#include "qwaylanddisplay.h" +#include "qwaylandcursor.h" + +QWaylandScreen::QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output *output, QRect geometry) + : QPlatformScreen() + , mWaylandDisplay(waylandDisplay) + , mOutput(output) + , mGeometry(geometry) + , mDepth(32) + , mFormat(QImage::Format_ARGB32_Premultiplied) + , mWaylandCursor(new QWaylandCursor(this)) +{ +} + +QWaylandScreen::~QWaylandScreen() +{ + delete mWaylandCursor; +} + +QWaylandDisplay * QWaylandScreen::display() const +{ + return mWaylandDisplay; +} + +QRect QWaylandScreen::geometry() const +{ + return mGeometry; +} + +int QWaylandScreen::depth() const +{ + return mDepth; +} + +QImage::Format QWaylandScreen::format() const +{ + return mFormat; +} + +QWaylandScreen * QWaylandScreen::waylandScreenFromWidget(QWidget *widget) +{ + QPlatformScreen *platformScreen = QPlatformScreen::platformScreenForWidget(widget); + return static_cast<QWaylandScreen *>(platformScreen); +} diff --git a/src/plugins/platforms/wayland/qwaylandscreen.h b/src/plugins/platforms/wayland/qwaylandscreen.h index 808266e..368859f 100644 --- a/src/plugins/platforms/wayland/qwaylandscreen.h +++ b/src/plugins/platforms/wayland/qwaylandscreen.h @@ -44,21 +44,31 @@ #include <QtGui/QPlatformScreen> +class QWaylandDisplay; +class QWaylandCursor; + class QWaylandScreen : public QPlatformScreen { public: - QWaylandScreen() {} + QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output *output, QRect geometry); + ~QWaylandScreen(); - QRect geometry() const { return mGeometry; } - int depth() const { return mDepth; } - QImage::Format format() const { return mFormat; } + QWaylandDisplay *display() const; -public: + QRect geometry() const; + int depth() const; + QImage::Format format() const; + + static QWaylandScreen *waylandScreenFromWidget(QWidget *widget); + +private: + QWaylandDisplay *mWaylandDisplay; + struct wl_output *mOutput; QRect mGeometry; int mDepth; QImage::Format mFormat; QSize mPhysicalSize; - struct wl_output *mOutput; + QWaylandCursor *mWaylandCursor; }; #endif // QWAYLANDSCREEN_H diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp index 7112424..83bb993 100644 --- a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp @@ -45,6 +45,7 @@ #include "qwaylanddisplay.h" #include "qwaylandwindow.h" +#include "qwaylandscreen.h" #include <wayland-client.h> #include <unistd.h> @@ -90,11 +91,10 @@ QWaylandShmBuffer::~QWaylandShmBuffer(void) wl_buffer_destroy(mBuffer); } -QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window, - QWaylandDisplay *display) +QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window) : QWindowSurface(window) , mBuffer(0) - , mDisplay(display) + , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display()) { } diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.h b/src/plugins/platforms/wayland/qwaylandshmsurface.h index 8c24e9f..266b290 100644 --- a/src/plugins/platforms/wayland/qwaylandshmsurface.h +++ b/src/plugins/platforms/wayland/qwaylandshmsurface.h @@ -65,7 +65,7 @@ private: class QWaylandShmWindowSurface : public QWindowSurface { public: - QWaylandShmWindowSurface(QWidget *window, QWaylandDisplay *display); + QWaylandShmWindowSurface(QWidget *window); ~QWaylandShmWindowSurface(); QPaintDevice *paintDevice(); diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index fa62330..a28bdfe 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -42,6 +42,7 @@ #include "qwaylandwindow.h" #include "qwaylanddisplay.h" +#include "qwaylandscreen.h" #include "qwaylandglcontext.h" #include "qwaylandbuffer.h" @@ -52,16 +53,16 @@ #include <QDebug> -QWaylandWindow::QWaylandWindow(QWidget *window, QWaylandDisplay *display) +QWaylandWindow::QWaylandWindow(QWidget *window) : QPlatformWindow(window) - , mSurface(display->createSurface()) - , mDisplay(display) + , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display()) , mGLContext(0) , mBuffer(0) { static WId id = 1; - mWindowId = id++; + + mSurface = mDisplay->createSurface(); } QWaylandWindow::~QWaylandWindow() diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h index d5cc923..8b047d7 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.h +++ b/src/plugins/platforms/wayland/qwaylandwindow.h @@ -52,7 +52,7 @@ class QWaylandBuffer; class QWaylandWindow : public QPlatformWindow { public: - QWaylandWindow(QWidget *window, QWaylandDisplay *display); + QWaylandWindow(QWidget *window); ~QWaylandWindow(); struct wl_surface *surface() { return mSurface; } -- cgit v0.12 From de5b07606c1fbc2330efc6915ad7d1ac866752f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Wed, 26 Jan 2011 13:03:27 +0100 Subject: Make sure we blit the fbo on flush in QGLWindowSurface Reviewed-by: sroedal --- src/opengl/qwindowsurface_gl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp index ea5e9a7..04cc358 100644 --- a/src/opengl/qwindowsurface_gl.cpp +++ b/src/opengl/qwindowsurface_gl.cpp @@ -473,6 +473,8 @@ static void drawTexture(const QRectF &rect, GLuint tex_id, const QSize &texSize, void QGLWindowSurface::beginPaint(const QRegion &) { + d_ptr->did_paint = true; + if (!context()) return; @@ -487,8 +489,6 @@ void QGLWindowSurface::beginPaint(const QRegion &) glClearColor(0.0, 0.0, 0.0, 0.0); glClear(clearFlags); } - - d_ptr->did_paint = true; } void QGLWindowSurface::endPaint(const QRegion &rgn) -- cgit v0.12 From 537312d5dea24bd404666789119a5ad1bab04396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com> Date: Wed, 26 Jan 2011 14:11:40 +0100 Subject: Lighthouse: License headers to new files in testlite --- .../platforms/testlite/qtestliteclipboard.cpp | 41 ++++++++++++++++++++++ .../platforms/testlite/qtestliteclipboard.h | 41 ++++++++++++++++++++++ src/plugins/platforms/testlite/qtestlitecursor.cpp | 2 +- .../platforms/testlite/qtestliteeglintegration.cpp | 41 ++++++++++++++++++++++ .../platforms/testlite/qtestliteeglintegration.h | 41 ++++++++++++++++++++++ .../platforms/testlite/qtestlitekeyboard.cpp | 41 ++++++++++++++++++++++ src/plugins/platforms/testlite/qtestlitekeyboard.h | 41 ++++++++++++++++++++++ src/plugins/platforms/testlite/qtestlitemime.cpp | 41 ++++++++++++++++++++++ src/plugins/platforms/testlite/qtestlitemime.h | 41 ++++++++++++++++++++++ .../platforms/testlite/qtestlitestaticinfo.cpp | 41 ++++++++++++++++++++++ .../platforms/testlite/qtestlitestaticinfo.h | 41 ++++++++++++++++++++++ 11 files changed, 411 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/testlite/qtestliteclipboard.cpp b/src/plugins/platforms/testlite/qtestliteclipboard.cpp index d77d45a..9bab7f9 100644 --- a/src/plugins/platforms/testlite/qtestliteclipboard.cpp +++ b/src/plugins/platforms/testlite/qtestliteclipboard.cpp @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "qtestliteclipboard.h" #include "qtestlitescreen.h" diff --git a/src/plugins/platforms/testlite/qtestliteclipboard.h b/src/plugins/platforms/testlite/qtestliteclipboard.h index 22d3734..76065a2 100644 --- a/src/plugins/platforms/testlite/qtestliteclipboard.h +++ b/src/plugins/platforms/testlite/qtestliteclipboard.h @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #ifndef QTESTLITECLIPBOARD_H #define QTESTLITECLIPBOARD_H diff --git a/src/plugins/platforms/testlite/qtestlitecursor.cpp b/src/plugins/platforms/testlite/qtestlitecursor.cpp index e9e6eb7..e7ef673 100644 --- a/src/plugins/platforms/testlite/qtestlitecursor.cpp +++ b/src/plugins/platforms/testlite/qtestlitecursor.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/src/plugins/platforms/testlite/qtestliteeglintegration.cpp b/src/plugins/platforms/testlite/qtestliteeglintegration.cpp index 3cbcc05..532c63d 100644 --- a/src/plugins/platforms/testlite/qtestliteeglintegration.cpp +++ b/src/plugins/platforms/testlite/qtestliteeglintegration.cpp @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "qtestliteeglintegration.h" static int countBits(unsigned long mask) diff --git a/src/plugins/platforms/testlite/qtestliteeglintegration.h b/src/plugins/platforms/testlite/qtestliteeglintegration.h index 3717976..99e9018 100644 --- a/src/plugins/platforms/testlite/qtestliteeglintegration.h +++ b/src/plugins/platforms/testlite/qtestliteeglintegration.h @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #ifndef QTESTLITEEGLINTEGRATION_H #define QTESTLITEEGLINTEGRATION_H diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp index 72e6d50..5b4ebd7 100644 --- a/src/plugins/platforms/testlite/qtestlitekeyboard.cpp +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.cpp @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "qtestlitekeyboard.h" #include "qtestlitescreen.h" diff --git a/src/plugins/platforms/testlite/qtestlitekeyboard.h b/src/plugins/platforms/testlite/qtestlitekeyboard.h index 65ead16..6873a09 100644 --- a/src/plugins/platforms/testlite/qtestlitekeyboard.h +++ b/src/plugins/platforms/testlite/qtestlitekeyboard.h @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #ifndef QTESTLITEKEYBOARD_H #define QTESTLITEKEYBOARD_H diff --git a/src/plugins/platforms/testlite/qtestlitemime.cpp b/src/plugins/platforms/testlite/qtestlitemime.cpp index 32cacce..c509991 100644 --- a/src/plugins/platforms/testlite/qtestlitemime.cpp +++ b/src/plugins/platforms/testlite/qtestlitemime.cpp @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "qtestlitemime.h" #include "qtestlitestaticinfo.h" diff --git a/src/plugins/platforms/testlite/qtestlitemime.h b/src/plugins/platforms/testlite/qtestlitemime.h index 449bbf3..f11070f 100644 --- a/src/plugins/platforms/testlite/qtestlitemime.h +++ b/src/plugins/platforms/testlite/qtestlitemime.h @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #ifndef QTESTLITEMIME_H #define QTESTLITEMIME_H diff --git a/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp b/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp index 875ac9e..2c6404d 100644 --- a/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp +++ b/src/plugins/platforms/testlite/qtestlitestaticinfo.cpp @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "qtestlitestaticinfo.h" #include "qtestlitescreen.h" diff --git a/src/plugins/platforms/testlite/qtestlitestaticinfo.h b/src/plugins/platforms/testlite/qtestlitestaticinfo.h index 328de60..0876768 100644 --- a/src/plugins/platforms/testlite/qtestlitestaticinfo.h +++ b/src/plugins/platforms/testlite/qtestlitestaticinfo.h @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenVG module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #ifndef QTESTLITESTATICINFO_H #define QTESTLITESTATICINFO_H -- cgit v0.12 From 88c1670a658d55257d50181d741afe562e44344b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com> Date: Wed, 26 Jan 2011 13:37:45 +0100 Subject: Fixed hslHue / hslHueF returning the wrong value for achromatic QColors. Made toHsl() work the same way as toHsv(), ensuring the hue gets set to USHRT_MAX and not 0. Task-number: QTBUG-16530 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/painting/qcolor.cpp | 2 +- tests/auto/qcolor/tst_qcolor.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp index dea3a72..173fb71 100644 --- a/src/gui/painting/qcolor.cpp +++ b/src/gui/painting/qcolor.cpp @@ -1781,7 +1781,7 @@ QColor QColor::toHsl() const color.ct.ahsl.lightness = qRound(lightness * USHRT_MAX); if (qFuzzyIsNull(delta)) { // achromatic case, hue is undefined - color.ct.ahsl.hue = 0; + color.ct.ahsl.hue = USHRT_MAX; color.ct.ahsl.saturation = 0; } else { // chromatic case diff --git a/tests/auto/qcolor/tst_qcolor.cpp b/tests/auto/qcolor/tst_qcolor.cpp index fcd608b..d42c26c 100644 --- a/tests/auto/qcolor/tst_qcolor.cpp +++ b/tests/auto/qcolor/tst_qcolor.cpp @@ -148,6 +148,8 @@ private slots: void specConstructor_data(); void specConstructor(); + void achromaticHslHue(); + #ifdef Q_WS_X11 void allowX11ColorNames(); void setallowX11ColorNames(); @@ -1459,6 +1461,14 @@ void tst_QColor::specConstructor() QCOMPARE(color.spec(), spec); } +void tst_QColor::achromaticHslHue() +{ + QColor color = Qt::black; + + QColor hsl = color.toHsl(); + QCOMPARE(hsl.hslHue(), -1); +} + #ifdef Q_WS_X11 void tst_QColor::allowX11ColorNames() { -- cgit v0.12 From b7de076b698a1e0a61c6b1597db860c88dd3ee86 Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Fri, 21 Jan 2011 23:04:33 +0100 Subject: Fix warning in ODBC driver: passing NULL to non-pointer. Warning was: passing NULL to non-pointer argument 7 of 'SQLRETURN SQLGetDiagRecW(SQLSMALLINT, void*, SQLSMALLINT, SQLWCHAR*, SQLINTEGER*, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*)' --- src/sql/drivers/odbc/qsql_odbc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index c91aa54..8cff61b 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -223,7 +223,7 @@ static QString qWarnODBCHandle(int handleType, SQLHANDLE handle, int *nativeCode state_, &nativeCode_, 0, - NULL, + 0, &msgLen); if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && msgLen > 0) description_.resize(msgLen+1); @@ -400,7 +400,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni // colSize-1: remove 0 termination when there is more data to fetch int rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : lengthIndicator/sizeof(SQLTCHAR); fieldVal += fromSQLTCHAR(buf, rSize); - if (lengthIndicator < (unsigned int)colSize*sizeof(SQLTCHAR)) { + if ((unsigned)lengthIndicator < colSize*sizeof(SQLTCHAR)) { // workaround for Drivermanagers that don't return SQL_NO_DATA break; } -- cgit v0.12 From f34e2b62b03e35015b0eaa6b96dc982caf0f230d Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Fri, 21 Jan 2011 23:05:37 +0100 Subject: Fix warnings in PSQL driver: handle VersionUnknown in switch --- src/sql/drivers/psql/qsql_psql.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp index 0a7d5bf..a044c7f 100644 --- a/src/sql/drivers/psql/qsql_psql.cpp +++ b/src/sql/drivers/psql/qsql_psql.cpp @@ -1021,6 +1021,9 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const stmt = stmt.arg(QString::fromLatin1("pg_class.relnamespace = (select oid from " "pg_namespace where pg_namespace.nspname = '%1') AND ").arg(schema)); break; + case QPSQLDriver::VersionUnknown: + qFatal("PSQL version is unknown"); + break; } i.exec(stmt.arg(tbl)); @@ -1110,6 +1113,9 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const stmt = stmt.arg(QString::fromLatin1("pg_class.relnamespace = (select oid from " "pg_namespace where pg_namespace.nspname = '%1')").arg(schema)); break; + case QPSQLDriver::VersionUnknown: + qFatal("PSQL version is unknown"); + break; } QSqlQuery query(createResult()); -- cgit v0.12 From 78a7a02b3b85435bc28eb23e9210522467171e42 Mon Sep 17 00:00:00 2001 From: Robert Griebl <robert.griebl@nokia.com> Date: Wed, 26 Jan 2011 15:17:44 +0100 Subject: Fixed a stupid typo --- examples/scroller/plot/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/scroller/plot/main.cpp b/examples/scroller/plot/main.cpp index 6166505..1e7db64 100644 --- a/examples/scroller/plot/main.cpp +++ b/examples/scroller/plot/main.cpp @@ -214,7 +214,7 @@ int main(int argc, char **argv) else mw.show(); #if defined(Q_WS_MAC) - mw->raise(); + mw.raise(); #endif return a.exec(); } -- cgit v0.12 From 1d85e1ce92e6df1af97bde7542467f40f7003975 Mon Sep 17 00:00:00 2001 From: Zeno Albisser <zeno.albisser@nokia.com> Date: Thu, 20 Jan 2011 14:54:06 +0100 Subject: Fix: define hotSpot for Gestures on Mac If there is no hotSpot defined for a gesture it cannot be propagated propperly within GraphicsView. Task-number: QTBUG-16618 Reviewed-by: Denis Dzyubenko --- examples/gestures/imagegestures/imagewidget.cpp | 1 + src/gui/kernel/qmacgesturerecognizer_mac.mm | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/examples/gestures/imagegestures/imagewidget.cpp b/examples/gestures/imagegestures/imagewidget.cpp index 12e6216..8bbb965 100644 --- a/examples/gestures/imagegestures/imagewidget.cpp +++ b/examples/gestures/imagegestures/imagewidget.cpp @@ -1,3 +1,4 @@ + /**************************************************************************** ** ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). diff --git a/src/gui/kernel/qmacgesturerecognizer_mac.mm b/src/gui/kernel/qmacgesturerecognizer_mac.mm index 0e432f3..6a4f0bb 100644 --- a/src/gui/kernel/qmacgesturerecognizer_mac.mm +++ b/src/gui/kernel/qmacgesturerecognizer_mac.mm @@ -69,6 +69,7 @@ QMacSwipeGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *e case QNativeGestureEvent::Swipe: { QSwipeGesture *g = static_cast<QSwipeGesture *>(gesture); g->setSwipeAngle(ev->angle); + g->setHotSpot(ev->position); return QGestureRecognizer::FinishGesture | QGestureRecognizer::ConsumeEventHint; break; } default: @@ -110,6 +111,7 @@ QMacPinchGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *e g->setCenterPoint(g->startCenterPoint()); g->setChangeFlags(QPinchGesture::CenterPointChanged); g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags()); + g->setHotSpot(ev->position); return QGestureRecognizer::MayBeGesture | QGestureRecognizer::ConsumeEventHint; case QNativeGestureEvent::Rotate: { g->setLastScaleFactor(g->scaleFactor()); @@ -117,6 +119,7 @@ QMacPinchGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *e g->setRotationAngle(g->rotationAngle() + ev->percentage); g->setChangeFlags(QPinchGesture::RotationAngleChanged); g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags()); + g->setHotSpot(ev->position); return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint; } case QNativeGestureEvent::Zoom: @@ -125,6 +128,7 @@ QMacPinchGestureRecognizer::recognize(QGesture *gesture, QObject *obj, QEvent *e g->setScaleFactor(g->scaleFactor() * (1 + ev->percentage)); g->setChangeFlags(QPinchGesture::ScaleFactorChanged); g->setTotalChangeFlags(g->totalChangeFlags() | g->changeFlags()); + g->setHotSpot(ev->position); return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint; case QNativeGestureEvent::GestureEnd: return QGestureRecognizer::FinishGesture | QGestureRecognizer::ConsumeEventHint; @@ -221,6 +225,7 @@ QMacPanGestureRecognizer::recognize(QGesture *gesture, QObject *target, QEvent * const QPointF posOffset = p - _startPos; g->setLastOffset(g->offset()); g->setOffset(QPointF(posOffset.x(), posOffset.y())); + g->setHotSpot(_startPos); return QGestureRecognizer::TriggerGesture; } } else if (_panTimer.isActive()) { @@ -239,6 +244,7 @@ QMacPanGestureRecognizer::recognize(QGesture *gesture, QObject *target, QEvent * break; // Begin new pan session! _startPos = QCursor::pos(); + g->setHotSpot(_startPos); return QGestureRecognizer::TriggerGesture | QGestureRecognizer::ConsumeEventHint; } break; } -- cgit v0.12 From 4c263772fa92cb270e32d5b1519b278f780f2635 Mon Sep 17 00:00:00 2001 From: Rohan McGovern <rohan.mcgovern@nokia.com> Date: Thu, 27 Jan 2011 11:42:22 +1000 Subject: configure: fixed configure on mac. Broken due to conflict resolution in 5422e929cad04633a06c156cba96cfcd69262522 Since we now support compiling QPA (lighthouse) on Mac, the platform logic in configure becomes a bit more complicated. --- configure | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index d88e920..1f28146 100755 --- a/configure +++ b/configure @@ -187,9 +187,10 @@ fi PLATFORM_X11=no PLATFORM_QWS=maybe PLATFORM_QPA=maybe -BUILD_ON_MAC=no; +BUILD_ON_MAC=no if [ -d /System/Library/Frameworks/Carbon.framework ]; then PLATFORM_MAC=maybe + BUILD_ON_MAC=yes else PLATFORM_MAC=no fi -- cgit v0.12 From bd6c9225328b6042ff14dfddb28e2e1279ba0e46 Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Thu, 27 Jan 2011 10:01:48 +0100 Subject: Make syncqt not complain about missing header macros. qsharedpointer_impl.h contains class definitions that are also mirrored in qsharedpointer.h (which is there for qdoc3), so we have a macro to stop processing. Task-number: QTBUG-16912 Reviewed-by: Olivier Goffart --- src/corelib/tools/qsharedpointer_impl.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 2404d2a..0337c1f 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -44,7 +44,17 @@ #ifndef QSHAREDPOINTER_H #error Do not include qsharedpointer_impl.h directly #endif + #if 0 +// These macros are duplicated here to make syncqt not complain a about +// this header, as we have a "qt_sync_stop_processing" below, which in turn +// is here because this file contains a template mess and duplicates the +// classes found in qsharedpointer.h +QT_BEGIN_HEADER +QT_BEGIN_NAMESPACE +QT_MODULE(Core) +QT_END_NAMESPACE +QT_END_HEADER #pragma qt_sync_stop_processing #endif -- cgit v0.12 From c31d67a7d69d3781fa6dc7601200ce0ba12a4760 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Wed, 26 Jan 2011 11:12:17 +0100 Subject: reduce some symbian-specific TS files for qt to RTL marker that's their only purpose. the rest of the contents is just nonsense. --- config.profiles/symbian/translations/qt_ar.ts | 7817 +---------------------- config.profiles/symbian/translations/qt_fa.ts | 8510 +------------------------ config.profiles/symbian/translations/qt_he.ts | 7777 +--------------------- config.profiles/symbian/translations/qt_ur.ts | 8510 +------------------------ 4 files changed, 24 insertions(+), 32590 deletions(-) diff --git a/config.profiles/symbian/translations/qt_ar.ts b/config.profiles/symbian/translations/qt_ar.ts index f44dc98..aca2bd7 100644 --- a/config.profiles/symbian/translations/qt_ar.ts +++ b/config.profiles/symbian/translations/qt_ar.ts @@ -2,7820 +2,11 @@ <!DOCTYPE TS> <TS version="2.0"> <context> - <name>AudioOutput</name> - <message> - <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/> - <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Revert back to device '%1'</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>CloseButton</name> - <message> - <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/> - <source>Close Tab</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>PPDOptionsModel</name> - <message> - <source>Name</source> - <translation type="obsolete">الإسم</translation> - </message> -</context> -<context> - <name>Phonon::</name> - <message> - <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/> - <source>Notifications</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Music</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Video</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Communication</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Games</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Accessibility</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Phonon::Gstreamer::Backend</name> - <message> - <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/> - <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. - Some video features have been disabled.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Warning: You do not seem to have the base GStreamer plugins installed. - All audio and video support has been disabled</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Phonon::Gstreamer::MediaObject</name> - <message> - <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/> - <source>Cannot start playback. - -Check your Gstreamer installation and make sure you -have libgstreamer-plugins-base installed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+113"/> - <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+676"/> - <location line="+8"/> - <location line="+15"/> - <location line="+9"/> - <location line="+6"/> - <location line="+19"/> - <location line="+335"/> - <location line="+24"/> - <source>Could not open media source.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-403"/> - <source>Invalid source type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+377"/> - <source>Could not locate media source.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Could not open audio device. The device is already in use.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Could not decode media source.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Phonon::VolumeSlider</name> - <message> - <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/> - <location line="+18"/> - <source>Volume: %1%</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-15"/> - <location line="+18"/> - <location line="+54"/> - <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Q3Accel</name> - <message> - <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/> - <source>%1, %2 not defined</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+36"/> - <source>Ambiguous %1 not handled</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Q3DataTable</name> - <message> - <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/> - <source>True</source> - <translation type="unfinished">صحيح</translation> - </message> - <message> - <location line="+1"/> - <source>False</source> - <translation type="unfinished">خاطئ</translation> - </message> - <message> - <location line="+505"/> - <source>Insert</source> - <translation type="unfinished">إدراج</translation> - </message> - <message> - <location line="+1"/> - <source>Update</source> - <translation type="unfinished">تحديث</translation> - </message> - <message> - <location line="+1"/> - <source>Delete</source> - <translation type="unfinished">حذف</translation> - </message> -</context> -<context> - <name>Q3FileDialog</name> - <message> - <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/> - <source>Copy or Move a File</source> - <translation type="unfinished">نسخ أو تحريك ملفّ</translation> - </message> - <message> - <location line="+8"/> - <source>Read: %1</source> - <translation type="unfinished">قراءة: %1</translation> - </message> - <message> - <location line="+6"/> - <location line="+30"/> - <source>Write: %1</source> - <translation type="unfinished">كتابة: %1</translation> - </message> - <message> - <location line="-22"/> - <location line="+1575"/> - <source>Cancel</source> - <translation type="unfinished">إلغاء</translation> - </message> - <message> - <location line="-157"/> - <location line="+49"/> - <location line="+2153"/> - <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/> - <source>All Files (*)</source> - <translation type="unfinished">جميع الملفّات (*)</translation> - </message> - <message> - <location line="-2089"/> - <source>Name</source> - <translation type="unfinished">الإسم</translation> - </message> - <message> - <location line="+1"/> - <source>Size</source> - <translation type="unfinished">السّعة</translation> - </message> - <message> - <location line="+2"/> - <source>Type</source> - <translation type="unfinished">الطّراز</translation> - </message> - <message> - <location line="+1"/> - <source>Date</source> - <translation type="unfinished">التّاريخ</translation> - </message> - <message> - <location line="+1"/> - <source>Attributes</source> - <translation type="unfinished">الخاصّيات</translation> - </message> - <message> - <location line="+35"/> - <location line="+2031"/> - <source>&OK</source> - <translation type="unfinished">&موافقة</translation> - </message> - <message> - <location line="-1991"/> - <source>Look &in:</source> - <translation type="unfinished">بحث &في:</translation> - </message> - <message> - <location line="+1"/> - <location line="+1981"/> - <location line="+16"/> - <source>File &name:</source> - <translation type="unfinished">إ&سم الملفّ:</translation> - </message> - <message> - <location line="-1996"/> - <source>File &type:</source> - <translation type="unfinished">&طراز الملفّ:</translation> - </message> - <message> - <location line="+7"/> - <source>Back</source> - <translation type="unfinished">رجوع</translation> - </message> - <message> - <location line="+7"/> - <source>One directory up</source> - <translation type="unfinished">دليل للأعلى</translation> - </message> - <message> - <location line="+9"/> - <source>Create New Folder</source> - <translation type="unfinished">صنع دليل جديد</translation> - </message> - <message> - <location line="+18"/> - <source>List View</source> - <translation type="unfinished">معاينة بالقائمة</translation> - </message> - <message> - <location line="+8"/> - <source>Detail View</source> - <translation type="unfinished">معاينة مفصّلة</translation> - </message> - <message> - <location line="+9"/> - <source>Preview File Info</source> - <translation type="unfinished">عرض مقدّم لمعلومات الملفّ</translation> - </message> - <message> - <location line="+23"/> - <source>Preview File Contents</source> - <translation type="unfinished">عرض مقدّم لمحتويات الملفّ</translation> - </message> - <message> - <location line="+88"/> - <source>Read-write</source> - <translation type="unfinished">قراءة-كتابة</translation> - </message> - <message> - <location line="+1"/> - <source>Read-only</source> - <translation type="unfinished">قراءة فقط</translation> - </message> - <message> - <location line="+1"/> - <source>Write-only</source> - <translation type="unfinished">كتابة فقط</translation> - </message> - <message> - <location line="+1"/> - <source>Inaccessible</source> - <translation type="unfinished">مستحيل التّوصّل إليه</translation> - </message> - <message> - <location line="+2"/> - <source>Symlink to File</source> - <translation type="unfinished">وصل رمزي لملفّ</translation> - </message> - <message> - <location line="+1"/> - <source>Symlink to Directory</source> - <translation type="unfinished">وصل رمزي لدليل</translation> - </message> - <message> - <location line="+1"/> - <source>Symlink to Special</source> - <translation type="unfinished">وصل رمزي لملفّ خاصّ</translation> - </message> - <message> - <location line="+1"/> - <source>File</source> - <translation type="unfinished">ملفّ</translation> - </message> - <message> - <location line="+1"/> - <source>Dir</source> - <translation type="unfinished">دليل</translation> - </message> - <message> - <location line="+1"/> - <source>Special</source> - <translation type="unfinished">ملفّ خاصّ</translation> - </message> - <message> - <location line="+704"/> - <location line="+2100"/> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/> - <source>Open</source> - <translation type="unfinished">فتح</translation> - </message> - <message> - <location line="-1990"/> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/> - <source>Save As</source> - <translation type="unfinished">حفظ تحت</translation> - </message> - <message> - <location line="+642"/> - <location line="+5"/> - <location line="+355"/> - <source>&Open</source> - <translation type="unfinished">&فتح</translation> - </message> - <message> - <location line="-357"/> - <location line="+341"/> - <source>&Save</source> - <translation type="unfinished">&حفظ</translation> - </message> - <message> - <location line="-334"/> - <source>&Rename</source> - <translation type="unfinished">ت&غيير الإسم</translation> - </message> - <message> - <location line="+1"/> - <source>&Delete</source> - <translation type="unfinished">ح&ذف</translation> - </message> - <message> - <location line="+20"/> - <source>R&eload</source> - <translation type="unfinished">إ&عادة التّحميل</translation> - </message> - <message> - <location line="+4"/> - <source>Sort by &Name</source> - <translation type="unfinished">فرز بال&إسم</translation> - </message> - <message> - <location line="+2"/> - <source>Sort by &Size</source> - <translation type="unfinished">فرز بالسّ&عة</translation> - </message> - <message> - <location line="+1"/> - <source>Sort by &Date</source> - <translation type="unfinished">فرز بالتّا&ريخ</translation> - </message> - <message> - <location line="+2"/> - <source>&Unsorted</source> - <translation type="unfinished">غير &مفروز</translation> - </message> - <message> - <location line="+15"/> - <source>Sort</source> - <translation type="unfinished">فرز</translation> - </message> - <message> - <location line="+4"/> - <source>Show &hidden files</source> - <translation type="unfinished">ع&رض الملفّات المخفية</translation> - </message> - <message> - <location line="+31"/> - <source>the file</source> - <translation type="unfinished">الملفّ</translation> - </message> - <message> - <location line="+2"/> - <source>the directory</source> - <translation type="unfinished">الدّليل</translation> - </message> - <message> - <location line="+2"/> - <source>the symlink</source> - <translation type="unfinished">الوصل الرّمزي</translation> - </message> - <message> - <location line="+3"/> - <source>Delete %1</source> - <translation type="unfinished">حذف %1</translation> - </message> - <message> - <location line="+1"/> - <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> - <translation type="unfinished"><qt>هل تريد فعلا حذف %1 "%2"؟</qt></translation> - </message> - <message> - <location line="+2"/> - <source>&Yes</source> - <translation type="unfinished">&نعم</translation> - </message> - <message> - <location line="+0"/> - <source>&No</source> - <translation type="unfinished">&لا</translation> - </message> - <message> - <location line="+36"/> - <source>New Folder 1</source> - <translation type="unfinished">دليل جديد 1</translation> - </message> - <message> - <location line="+5"/> - <source>New Folder</source> - <translation type="unfinished">دليل جديد</translation> - </message> - <message> - <location line="+5"/> - <source>New Folder %1</source> - <translation type="unfinished">دليل جديد %1</translation> - </message> - <message> - <location line="+98"/> - <source>Find Directory</source> - <translation type="unfinished">إيجاد الدّليل</translation> - </message> - <message> - <location line="+5"/> - <location line="+108"/> - <source>Directories</source> - <translation type="unfinished">دلائل</translation> - </message> - <message> - <location line="-2"/> - <source>Directory:</source> - <translation type="unfinished">دليل:</translation> - </message> - <message> - <location line="+40"/> - <location line="+1110"/> - <source>Error</source> - <translation type="unfinished">خطأ</translation> - </message> - <message> - <location line="-1109"/> - <source>%1 -File not found. -Check path and filename.</source> - <translation type="unfinished">%1 -لم يتمّ إيجاد الملفّ. -تحقّق من المسار و إسم الملفّ.</translation> - </message> - <message> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/> - <source>All Files (*.*)</source> - <translation type="unfinished">جميع الملفّات (*.*)</translation> - </message> - <message> - <location line="+375"/> - <source>Open </source> - <translation type="unfinished">فتح</translation> - </message> - <message> - <location line="+155"/> - <source>Select a Directory</source> - <translation type="unfinished">انتقاء دليل</translation> - </message> -</context> -<context> - <name>Q3LocalFs</name> - <message> - <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/> - <location line="+10"/> - <source>Could not read directory -%1</source> - <translation type="unfinished">لم أستطع قراءة الدّليل -%1</translation> - </message> - <message> - <location line="+45"/> - <source>Could not create directory -%1</source> - <translation type="unfinished">لم أستطع صنع الدّليل -%1</translation> - </message> - <message> - <location line="+34"/> - <source>Could not remove file or directory -%1</source> - <translation type="unfinished">لم أستطع نزع الملفّ أو الدّليل -%1</translation> - </message> - <message> - <location line="+27"/> - <source>Could not rename -%1 -to -%2</source> - <translation type="unfinished">لم أستطع إعادة تسمية -%1 -إلى -%2</translation> - </message> - <message> - <location line="+25"/> - <source>Could not open -%1</source> - <translation type="unfinished">لم أستطع فتح -%1</translation> - </message> - <message> - <location line="+68"/> - <source>Could not write -%1</source> - <translation type="unfinished">لم أستطع كتابة -%1</translation> - </message> -</context> -<context> - <name>Q3MainWindow</name> - <message> - <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/> - <source>Line up</source> - <translation type="unfinished">تصفيف</translation> - </message> - <message> - <location line="+2"/> - <source>Customize...</source> - <translation type="unfinished">تخصيص...</translation> - </message> -</context> -<context> - <name>Q3NetworkProtocol</name> - <message> - <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/> - <source>Operation stopped by the user</source> - <translation type="unfinished">أوقفت العمليّة من طرف المستعمل</translation> - </message> -</context> -<context> - <name>Q3ProgressDialog</name> - <message> - <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/> - <location line="+61"/> - <source>Cancel</source> - <translation type="unfinished">إلغاء</translation> - </message> -</context> -<context> - <name>Q3TabDialog</name> - <message> - <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/> - <location line="+814"/> - <source>OK</source> - <translation type="unfinished">موافقة</translation> - </message> - <message> - <location line="-356"/> - <source>Apply</source> - <translation type="unfinished">تطبيق</translation> - </message> - <message> - <location line="+43"/> - <source>Help</source> - <translation type="unfinished">مساعدة</translation> - </message> - <message> - <location line="+45"/> - <source>Defaults</source> - <translation type="unfinished">افتراضيات</translation> - </message> - <message> - <location line="+50"/> - <source>Cancel</source> - <translation type="unfinished">إلغاء</translation> - </message> -</context> -<context> - <name>Q3TextEdit</name> - <message> - <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/> - <source>&Undo</source> - <translation type="unfinished">&تراجع</translation> - </message> - <message> - <location line="+1"/> - <source>&Redo</source> - <translation type="unfinished">إ&عادة</translation> - </message> - <message> - <location line="+5"/> - <source>Cu&t</source> - <translation type="unfinished">&قصّ</translation> - </message> - <message> - <location line="+1"/> - <source>&Copy</source> - <translation type="unfinished">&نسخ</translation> - </message> - <message> - <location line="+2"/> - <source>&Paste</source> - <translation type="unfinished">ت&لصيق</translation> - </message> - <message> - <location line="+3"/> - <source>Clear</source> - <translation type="unfinished">محو</translation> - </message> - <message> - <location line="+4"/> - <location line="+2"/> - <source>Select All</source> - <translation type="unfinished">انتقاء الجميع</translation> - </message> -</context> -<context> - <name>Q3TitleBar</name> - <message> - <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/> - <source>System</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Restore up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Minimize</source> - <translation type="unfinished">تصغير</translation> - </message> - <message> - <location line="+3"/> - <source>Restore down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Maximize</source> - <translation type="unfinished">تكبير</translation> - </message> - <message> - <location line="+2"/> - <source>Close</source> - <translation type="unfinished">إغلاق</translation> - </message> - <message> - <location line="+18"/> - <source>Contains commands to manipulate the window</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Puts a minimized back to normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Moves the window out of the way</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Puts a maximized window back to normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Makes the window full screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Closes the window</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Displays the name of the window and contains controls to manipulate it</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Q3ToolBar</name> - <message> - <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/> - <source>More...</source> - <translation type="unfinished">أكثر...</translation> - </message> -</context> -<context> - <name>Q3UrlOperator</name> - <message> - <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/> - <location line="+260"/> - <location line="+4"/> - <source>The protocol `%1' is not supported</source> - <translation type="unfinished">المراسم '%1' غير مدعومة</translation> - </message> - <message> - <location line="-260"/> - <source>The protocol `%1' does not support listing directories</source> - <translation type="unfinished">المراسم '%1' لا تدعم وضع قوائم الدّلائل</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support creating new directories</source> - <translation type="unfinished">المراسم '%1' لا تدعم صنع دلائل جديدة</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support removing files or directories</source> - <translation type="unfinished">المراسم '%1' لا تدعم نزع الملفّات أو الدّلائل</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support renaming files or directories</source> - <translation type="unfinished">المراسم '%1' لا تدعم إعادة تسمية الملفّات أو الدّلائل</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support getting files</source> - <translation type="unfinished">المراسم '%1' لا تدعم استخلاص الملفّات</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support putting files</source> - <translation type="unfinished">المراسم '%1' لا تدعم وضع الملفّات</translation> - </message> - <message> - <location line="+243"/> - <location line="+4"/> - <source>The protocol `%1' does not support copying or moving files or directories</source> - <translation type="unfinished">المراسم '%1' لا تدعم نسخ أو تحريك الملفّات أو الدّلائل</translation> - </message> - <message> - <location line="+237"/> - <location line="+1"/> - <source>(unknown)</source> - <translation type="unfinished">(مجهول)</translation> - </message> -</context> -<context> - <name>Q3Wizard</name> - <message> - <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/> - <source>&Cancel</source> - <translation type="unfinished">&إلغاء</translation> - </message> - <message> - <location line="+1"/> - <source>< &Back</source> - <translation type="unfinished">< &رجوع</translation> - </message> - <message> - <location line="+1"/> - <source>&Next ></source> - <translation type="unfinished">ال&تّالي ></translation> - </message> - <message> - <location line="+1"/> - <source>&Finish</source> - <translation type="unfinished">إ&نهاء</translation> - </message> - <message> - <location line="+1"/> - <source>&Help</source> - <translation type="unfinished">&مساعدة</translation> - </message> -</context> -<context> - <name>QAbstractSocket</name> - <message> - <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/> - <location line="+26"/> - <source>Host not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+50"/> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/> - <source>Connection refused</source> - <translation type="unfinished">رفض الوصل</translation> - </message> - <message> - <location line="+141"/> - <source>Connection timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-547"/> - <location line="+787"/> - <location line="+208"/> - <source>Operation on socket is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+137"/> - <source>Socket operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+380"/> - <source>Socket is not connected</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/> - <source>Network unreachable</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QAbstractSpinBox</name> - <message> - <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/> - <source>&Step up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Step &down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-8"/> - <source>&Select All</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QApplication</name> - <message> - <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/> - <source>QT_LAYOUT_DIRECTION</source> - <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> - <translation>RTL</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/> - <source>Executable '%1' requires Qt %2, found Qt %3.</source> - <translation>البرنامج '%1' يتطلّب Qt %2، تمّ إيجاد Qt %3.</translation> - </message> - <message> - <location line="+2"/> - <source>Incompatible Qt Library Error</source> - <translation>خطأ: مكتبة Qt غير موافقة</translation> - </message> - <message> - <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/> - <source>Activate</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Activates the program's main window</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QAxSelect</name> - <message> - <location filename="../src/activeqt/container/qaxselect.ui"/> - <source>Select ActiveX Control</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>OK</source> - <translation type="unfinished">موافقة</translation> - </message> - <message> - <location/> - <source>&Cancel</source> - <translation type="unfinished">&إلغاء</translation> - </message> - <message> - <location/> - <source>COM &Object:</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QCheckBox</name> - <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/> - <source>Uncheck</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Check</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Toggle</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QColorDialog</name> - <message> - <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/> - <source>Hu&e:</source> - <translation>ال&صّبغة:</translation> - </message> - <message> - <location line="+1"/> - <source>&Sat:</source> - <translation>التّ&شبّع:</translation> - </message> - <message> - <location line="+1"/> - <source>&Val:</source> - <translation>ال&قيمة:</translation> - </message> - <message> - <location line="+1"/> - <source>&Red:</source> - <translation>أ&حمر:</translation> - </message> - <message> - <location line="+1"/> - <source>&Green:</source> - <translation>أ&خضر:</translation> - </message> - <message> - <location line="+1"/> - <source>Bl&ue:</source> - <translation>أ&زرق:</translation> - </message> - <message> - <location line="+1"/> - <source>A&lpha channel:</source> - <translation>قناة أ&لفا:</translation> - </message> - <message> - <location line="+101"/> - <source>Select Color</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+137"/> - <source>&Basic colors</source> - <translation>الألوان القا&عديّة</translation> - </message> - <message> - <location line="+1"/> - <source>&Custom colors</source> - <translation>الأل&وان المخصّصة</translation> - </message> - <message> - <source>&Define Custom Colors >></source> - <translation type="obsolete">تع&ريف الألوان المخصّصة >></translation> - </message> - <message> - <source>OK</source> - <translation type="obsolete">موافقة</translation> - </message> - <message> - <source>Cancel</source> - <translation type="obsolete">إلغاء</translation> - </message> - <message> - <location line="+1"/> - <source>&Add to Custom Colors</source> - <translation>الإ&ضافة إلى الألوان المخصّصة</translation> - </message> - <message> - <source>Select color</source> - <translation type="obsolete">إنتقاء اللّون</translation> - </message> -</context> -<context> - <name>QComboBox</name> - <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/> - <location line="+65"/> - <source>Open</source> - <translation type="unfinished">فتح</translation> - </message> - <message> - <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/> - <source>False</source> - <translation type="unfinished">خاطئ</translation> - </message> - <message> - <location line="+1"/> - <source>True</source> - <translation type="unfinished">صحيح</translation> - </message> - <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/> - <source>Close</source> - <translation type="unfinished">إغلاق</translation> - </message> -</context> -<context> - <name>QCoreApplication</name> - <message> - <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/> - <source>%1: key is empty</source> - <comment>QSystemSemaphore</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>%1: unable to make key</source> - <comment>QSystemSemaphore</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>%1: ftok failed</source> - <comment>QSystemSemaphore</comment> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDB2Driver</name> - <message> - <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/> - <source>Unable to connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+303"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to set autocommit</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDB2Result</name> - <message> - <location line="-1043"/> - <location line="+243"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-206"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+196"/> - <source>Unable to bind variable</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+92"/> - <source>Unable to fetch record %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to fetch next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Unable to fetch first</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDateTimeEdit</name> - <message> - <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/> - <source>AM</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>am</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>PM</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>pm</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDial</name> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/> - <source>QDial</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>SpeedoMeter</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>SliderHandle</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDialog</name> - <message> - <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/> - <source>What's This?</source> - <translation>ما هذا؟</translation> - </message> - <message> - <location line="-115"/> - <source>Done</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDialogButtonBox</name> - <message> - <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/> - <location line="+464"/> - <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/> - <source>OK</source> - <translation type="unfinished">موافقة</translation> - </message> - <message> - <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/> - <source>Save</source> - <translation type="unfinished">حفظ</translation> - </message> - <message> - <location line="+0"/> - <source>&Save</source> - <translation type="unfinished">&حفظ</translation> - </message> - <message> - <location line="+3"/> - <source>Open</source> - <translation type="unfinished">فتح</translation> - </message> - <message> - <location line="+3"/> - <source>Cancel</source> - <translation type="unfinished">إلغاء</translation> - </message> - <message> - <location line="+0"/> - <source>&Cancel</source> - <translation type="unfinished">&إلغاء</translation> - </message> - <message> - <location line="+3"/> - <source>Close</source> - <translation type="unfinished">إغلاق</translation> - </message> - <message> - <location line="+0"/> - <source>&Close</source> - <translation type="unfinished">إ&غلاق</translation> - </message> - <message> - <location line="+3"/> - <source>Apply</source> - <translation type="unfinished">تطبيق</translation> - </message> - <message> - <location line="+3"/> - <source>Reset</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Help</source> - <translation type="unfinished">مساعدة</translation> - </message> - <message> - <location line="+4"/> - <source>Don't Save</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Discard</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>&Yes</source> - <translation type="unfinished">&نعم</translation> - </message> - <message> - <location line="+3"/> - <source>Yes to &All</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>&No</source> - <translation type="unfinished">&لا</translation> - </message> - <message> - <location line="+3"/> - <source>N&o to All</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Save All</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Abort</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Retry</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Ignore</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Restore Defaults</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-29"/> - <source>Close without Saving</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-27"/> - <source>&OK</source> - <translation type="unfinished">&موافقة</translation> - </message> -</context> -<context> - <name>QDirModel</name> - <message> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/> - <source>Name</source> - <translation type="unfinished">الإسم</translation> - </message> - <message> - <location line="+1"/> - <source>Size</source> - <translation type="unfinished">السّعة</translation> - </message> - <message> - <location line="+3"/> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Type</source> - <comment>All other platforms</comment> - <translation type="unfinished">الطّراز</translation> - </message> - <message> - <location line="+6"/> - <source>Date Modified</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDockWidget</name> - <message> - <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/> - <source>Close</source> - <translation type="unfinished">إغلاق</translation> - </message> - <message> - <location line="+2"/> - <source>Dock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Float</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDoubleSpinBox</name> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/> - <source>More</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Less</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QErrorMessage</name> - <message> - <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+391"/> - <source>&Show this message again</source> - <translation>أ&عرض مجدّداهذاالبلاغ</translation> - </message> - <message> - <location line="+1"/> - <source>&OK</source> - <translation>&موافقة</translation> - </message> - <message> - <location line="-200"/> - <source>Debug Message:</source> - <translation>بلاغ تصحيح الأخطاء:</translation> - </message> - <message> - <location line="+3"/> - <source>Warning:</source> - <translation>إنذار:</translation> - </message> - <message> - <location line="+3"/> - <source>Fatal Error:</source> - <translation>خطأ قاتل:</translation> - </message> -</context> -<context> - <name>QFile</name> - <message> - <location filename="../src/corelib/io/qfile.cpp" line="+708"/> - <location line="+141"/> - <source>Destination file exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-108"/> - <source>Cannot remove source file</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+120"/> - <source>Cannot open %1 for input</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Cannot open for output</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Failure to write block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Cannot create %1 for output</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFileDialog</name> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/> - <location line="+444"/> - <source>All Files (*)</source> - <translation>جميع الملفّات (*)</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Back</source> - <translation type="unfinished">رجوع</translation> - </message> - <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>List View</source> - <translation type="unfinished">معاينة بالقائمة</translation> - </message> - <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Detail View</source> - <translation type="unfinished">معاينة مفصّلة</translation> - </message> - <message> - <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+414"/> - <location line="+1"/> - <source>File</source> - <translation type="unfinished">ملفّ</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-461"/> - <source>Open</source> - <translation>فتح</translation> - </message> - <message> - <location line="+2"/> - <source>Save As</source> - <translation type="unfinished">حفظ تحت</translation> - </message> - <message> - <location line="+678"/> - <location line="+50"/> - <location line="+1471"/> - <location line="+75"/> - <source>&Open</source> - <translation>&فتح</translation> - </message> - <message> - <location line="-1596"/> - <location line="+50"/> - <source>&Save</source> - <translation>&حفظ</translation> - </message> - <message> - <location line="+1822"/> - <source>Recent Places</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-2521"/> - <source>&Rename</source> - <translation type="unfinished">ت&غيير الإسم</translation> - </message> - <message> - <location line="+1"/> - <source>&Delete</source> - <translation type="unfinished">ح&ذف</translation> - </message> - <message> - <location line="+1"/> - <source>Show &hidden files</source> - <translation type="unfinished">ع&رض الملفّات المخفية</translation> - </message> - <message> - <location line="+1964"/> - <source>New Folder</source> - <translation type="unfinished">دليل جديد</translation> - </message> - <message> - <location line="-1999"/> - <source>Find Directory</source> - <translation type="unfinished">إيجاد الدّليل</translation> - </message> - <message> - <location line="+685"/> - <source>Directories</source> - <translation>دلائل</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/> - <source>All Files (*.*)</source> - <translation type="unfinished">جميع الملفّات (*.*)</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-644"/> - <location line="+648"/> - <source>Directory:</source> - <translation type="unfinished">دليل:</translation> - </message> - <message> - <location line="+828"/> - <source>%1 already exists. -Do you want to replace it?</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>%1 -File not found. -Please verify the correct file name was given.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/> - <source>My Computer</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Parent Directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Files of type:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-54"/> - <location line="+862"/> - <source>%1 -Directory not found. -Please verify the correct directory name was given.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-218"/> - <source>'%1' is write protected. -Do you want to delete it anyway?</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Are sure you want to delete '%1'?</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Could not delete directory.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="-4"/> - <source>Drive</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+33"/> - <source>Unknown</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2118"/> - <source>Show </source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Forward</source> - <translation type="unfinished">للأمام</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+7"/> - <source>&New Folder</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+656"/> - <location line="+38"/> - <source>&Choose</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/> - <source>Remove</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/> - <location line="+652"/> - <source>File &name:</source> - <translation type="unfinished">إ&سم الملفّ:</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Look in:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Create New Folder</source> - <translation type="unfinished">صنع دليل جديد</translation> - </message> -</context> -<context> - <name>QFileSystemModel</name> - <message> - <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+744"/> - <source>%1 TB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>%1 GB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>%1 MB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>%1 KB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>%1 bytes</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+77"/> - <source>Invalid filename</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+63"/> - <source>Name</source> - <translation type="unfinished">الإسم</translation> - </message> - <message> - <location line="+2"/> - <source>Size</source> - <translation type="unfinished">السّعة</translation> - </message> - <message> - <location line="+4"/> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Type</source> - <comment>All other platforms</comment> - <translation type="unfinished">الطّراز</translation> - </message> - <message> - <location line="+7"/> - <source>Date Modified</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/> - <source>My Computer</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Computer</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFontDatabase</name> - <message> - <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/> - <location line="+1176"/> - <source>Normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1173"/> - <location line="+12"/> - <location line="+1149"/> - <source>Bold</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1158"/> - <location line="+1160"/> - <source>Demi Bold</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1157"/> - <location line="+18"/> - <location line="+1135"/> - <source>Black</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1145"/> - <source>Demi</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <location line="+1145"/> - <source>Light</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1004"/> - <location line="+1007"/> - <source>Italic</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1004"/> - <location line="+1006"/> - <source>Oblique</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+705"/> - <source>Any</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Latin</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Greek</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Cyrillic</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Armenian</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Hebrew</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Arabic</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Syriac</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Thaana</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Devanagari</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Bengali</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Gurmukhi</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Gujarati</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Oriya</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Tamil</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Telugu</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Kannada</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Malayalam</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Sinhala</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Thai</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Lao</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Tibetan</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Myanmar</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Georgian</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Khmer</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Simplified Chinese</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Traditional Chinese</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Japanese</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Korean</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Vietnamese</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Symbol</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Ogham</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Runic</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFontDialog</name> - <message> - <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/> - <source>&Font</source> - <translation>ال&خطّ</translation> - </message> - <message> - <location line="+1"/> - <source>Font st&yle</source> - <translation>&طراز الخطّ</translation> - </message> - <message> - <location line="+1"/> - <source>&Size</source> - <translation>ال&حجم</translation> - </message> - <message> - <location line="+1"/> - <source>Effects</source> - <translation>تأثيرات</translation> - </message> - <message> - <location line="+1"/> - <source>Stri&keout</source> - <translation>ت&شطيب</translation> - </message> - <message> - <location line="+1"/> - <source>&Underline</source> - <translation>ت&سطير</translation> - </message> - <message> - <location line="+1"/> - <source>Sample</source> - <translation>عيّنة</translation> - </message> - <message> - <location line="-603"/> - <location line="+247"/> - <source>Select Font</source> - <translation>انتقاء الخطّ</translation> - </message> - <message> - <location line="+357"/> - <source>Wr&iting System</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFtp</name> - <message> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+2303"/> - <source>Host %1 found</source> - <translation type="unfinished">تمّ إيجاد المضيف %1</translation> - </message> - <message> - <location line="+7"/> - <source>Host found</source> - <translation type="unfinished">تمّ إيجاد المضيف</translation> - </message> - <message> - <location filename="../src/network/access/qftp.cpp" line="+1003"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1456"/> - <location line="+1451"/> - <source>Connected to host %1</source> - <translation>تمّ وصل المضيف %1</translation> - </message> - <message> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+7"/> - <source>Connected to host</source> - <translation type="unfinished">تمّ وصل المضيف</translation> - </message> - <message> - <location line="-5"/> - <source>Connection to %1 closed</source> - <translation type="unfinished">تمّ إغلاق الوصل بالمضيف %1</translation> - </message> - <message> - <location filename="../src/network/access/qftp.cpp" line="+1375"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-243"/> - <location line="+250"/> - <source>Connection closed</source> - <translation>وصل مغلق</translation> - </message> - <message> - <location line="-1487"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1566"/> - <source>Host %1 not found</source> - <translation>لم يتمّ إيجاد المضيف %1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/> - <source>Connection refused to host %1</source> - <translation>رفض الوصل بالمضيف %1</translation> - </message> - <message> - <location line="+4"/> - <source>Connection timed out to host %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+501"/> - <location line="+29"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+458"/> - <location line="+728"/> - <source>Unknown error</source> - <translation>خطأ مجهول</translation> - </message> - <message> - <location line="+889"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/> - <source>Connecting to host failed: -%1</source> - <translation>فشل وصل المضيف: -%1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Login failed: -%1</source> - <translation>فشل التّسجيل: -%1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Listing directory failed: -%1</source> - <translation>فشلت عمليّة وضع قائمة للدّليل: -%1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Changing directory failed: -%1</source> - <translation>فشلت عمليّة تغيير الدّليل: -%1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Downloading file failed: -%1</source> - <translation>فشلت عمليّة تحميل الملفّ: -%1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Uploading file failed: -%1</source> - <translation>فشلت عمليّة تحميل (بعث) الملفّ: -%1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Removing file failed: -%1</source> - <translation>فشلت عمليّة نزع الملفّ: -%1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Creating directory failed: -%1</source> - <translation>فشلت عمليّة صنع الدّليل: -%1</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Removing directory failed: -%1</source> - <translation>فشلت عمليّة نزع الدّليل: -%1</translation> - </message> - <message> - <location line="-1524"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1356"/> - <source>Not connected</source> - <translation>غير متصّل</translation> - </message> - <message> - <location line="+396"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+332"/> - <source>Connection refused for data connection</source> - <translation>رفض وصل المعطيات</translation> - </message> -</context> -<context> - <name>QHostInfo</name> - <message> - <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/> - <source>Unknown error</source> - <translation type="unfinished">خطأ مجهول</translation> - </message> -</context> -<context> - <name>QHostInfoAgent</name> - <message> - <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/> - <location line="+9"/> - <location line="+64"/> - <location line="+31"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/> - <location line="+9"/> - <location line="+40"/> - <location line="+27"/> - <source>Host not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-44"/> - <location line="+39"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/> - <location line="+29"/> - <source>Unknown address type</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/> - <location line="+27"/> - <source>Unknown error</source> - <translation type="unfinished">خطأ مجهول</translation> - </message> -</context> -<context> - <name>QHttp</name> - <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+1836"/> - <source>Connection refused</source> - <translation>رفض الوصل</translation> - </message> - <message> - <location filename="../src/network/access/qhttp.cpp" line="+2631"/> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> - <source>Host %1 not found</source> - <translation>لم يتمّ إيجاد المضيف %1</translation> - </message> - <message> - <location line="-62"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-45"/> - <source>Wrong content length</source> - <translation>طول المحتوى خاطئ</translation> - </message> - <message> - <location line="-2204"/> - <source>HTTPS connection requested but SSL support not compiled in</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2286"/> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/> - <location line="+19"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+48"/> - <source>HTTP request failed</source> - <translation>فشل طلب الHTTP</translation> - </message> - <message> - <location filename="../src/qt3support/network/q3http.cpp" line="+450"/> - <source>Host %1 found</source> - <translation type="unfinished">تمّ إيجاد المضيف %1</translation> - </message> - <message> - <location line="+14"/> - <source>Host found</source> - <translation type="unfinished">تمّ إيجاد المضيف</translation> - </message> - <message> - <location line="-11"/> - <source>Connected to host %1</source> - <translation type="unfinished">تمّ وصل المضيف %1</translation> - </message> - <message> - <location line="+14"/> - <source>Connected to host</source> - <translation type="unfinished">تمّ وصل المضيف</translation> - </message> - <message> - <location line="-11"/> - <source>Connection to %1 closed</source> - <translation type="unfinished">تمّ إغلاق الوصل بالمضيف %1</translation> - </message> - <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+14"/> - <source>Connection closed</source> - <translation type="unfinished">وصل مغلق</translation> - </message> - <message> - <location filename="../src/network/access/qhttp.cpp" line="-1077"/> - <location line="+820"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-1152"/> - <location line="+567"/> - <source>Unknown error</source> - <translation>خطأ مجهول</translation> - </message> - <message> - <location line="-568"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-370"/> - <source>Request aborted</source> - <translation>تمّ إبطال الطّلب</translation> - </message> - <message> - <location line="+579"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+381"/> - <source>No server set to connect to</source> - <translation>ليس هناك أيّ خادم للوصل</translation> - </message> - <message> - <location line="+168"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+60"/> - <source>Server closed connection unexpectedly</source> - <translation>الخادم أغلق الوصل بصفة غير متوقّعة</translation> - </message> - <message> - <location line="+151"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+113"/> - <source>Invalid HTTP response header</source> - <translation>صديرة استجابة الHTTP غير صالحة</translation> - </message> - <message> - <location line="+28"/> - <source>Unknown authentication method</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+97"/> - <location line="+48"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+40"/> - <location line="+47"/> - <source>Invalid HTTP chunked body</source> - <translation>مقطع HTTP غير صالح</translation> - </message> - <message> - <location line="+38"/> - <source>Error writing response to device</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-173"/> - <source>Proxy authentication required</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Authentication required</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-138"/> - <source>Connection refused (or timed out)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/> - <source>Proxy requires authentication</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Host requires authentication</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Data corrupted</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unknown protocol specified</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>SSL handshake failed</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QHttpSocketEngine</name> - <message> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/> - <source>Did not receive HTTP response from proxy</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+25"/> - <source>Error parsing authentication request from proxy</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+31"/> - <source>Authentication required</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+27"/> - <source>Proxy denied connection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Error communicating with HTTP proxy</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>Proxy server not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Proxy connection refused</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Proxy server connection timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Proxy connection closed prematurely</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QIBaseDriver</name> - <message> - <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/> - <source>Error opening database</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+54"/> - <source>Could not start transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QIBaseResult</name> - <message> - <location line="-1097"/> - <source>Unable to create BLOB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unable to write BLOB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>Unable to open BLOB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>Unable to read BLOB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+125"/> - <location line="+189"/> - <source>Could not find array</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-157"/> - <source>Could not get array data</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+212"/> - <source>Could not get query info</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Could not start transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+33"/> - <source>Could not allocate statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Could not prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <location line="+7"/> - <source>Could not describe input statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Could not describe statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+115"/> - <source>Unable to close statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Unable to execute query</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+46"/> - <source>Could not fetch next item</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+160"/> - <source>Could not get statement info</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QIODevice</name> - <message> - <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/> - <source>Permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Too many open files</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>No such file or directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>No space left on device</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/> - <source>Unknown error</source> - <translation type="unfinished">خطأ مجهول</translation> - </message> -</context> -<context> - <name>QInputContext</name> - <message> - <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/> - <source>XIM</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>XIM input method</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Windows input method</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Mac OS X input method</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QInputDialog</name> - <message> - <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/> - <source>Enter a value:</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QLibrary</name> - <message> - <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/> - <source>Could not mmap '%1': %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+22"/> - <source>Plugin verification data mismatch in '%1'</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Could not unmap '%1': %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+302"/> - <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+340"/> - <source>Unknown error</source> - <translation type="unfinished">خطأ مجهول</translation> - </message> - <message> - <location line="-377"/> - <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/> - <source>The shared library was not found.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>The file '%1' is not a valid Qt plugin.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+43"/> - <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/> - <source>Cannot load library %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/> - <source>Cannot unload library %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+31"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/> - <source>Cannot resolve symbol "%1" in %2: %3</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QLineEdit</name> - <message> - <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/> - <source>&Undo</source> - <translation type="unfinished">&تراجع</translation> - </message> - <message> - <location line="+4"/> - <source>&Redo</source> - <translation type="unfinished">إ&عادة</translation> - </message> - <message> - <location line="+7"/> - <source>Cu&t</source> - <translation type="unfinished">&قصّ</translation> - </message> - <message> - <location line="+4"/> - <source>&Copy</source> - <translation type="unfinished">&نسخ</translation> - </message> - <message> - <location line="+4"/> - <source>&Paste</source> - <translation type="unfinished">ت&لصيق</translation> - </message> - <message> - <location line="+11"/> - <source>Select All</source> - <translation type="unfinished">انتقاء الجميع</translation> - </message> - <message> - <location line="-6"/> - <source>Delete</source> - <translation type="unfinished">حذف</translation> - </message> -</context> -<context> - <name>QLocalServer</name> - <message> - <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/> - <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/> - <source>%1: Name error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/> - <source>%1: Permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>%1: Address in use</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/> - <source>%1: Unknown error %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QLocalSocket</name> - <message> - <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/> - <source>%1: Connection refused</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Remote closed</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/> - <location line="+43"/> - <source>%1: Invalid name</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Socket access error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Socket resource error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Socket operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Datagram too large</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/> - <source>%1: Connection error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: The socket operation is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1: Unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/> - <source>%1: Unknown error %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMYSQLDriver</name> - <message> - <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/> - <source>Unable to open database '</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Unable to connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+127"/> - <source>Unable to begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMYSQLResult</name> - <message> - <location line="-922"/> - <source>Unable to fetch data</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+176"/> - <source>Unable to execute query</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unable to store result</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+190"/> - <location line="+8"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+34"/> - <source>Unable to reset statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+87"/> - <source>Unable to bind value</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <location line="+21"/> - <source>Unable to bind outvalues</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-12"/> - <source>Unable to store statement results</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-253"/> - <source>Unable to execute next query</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Unable to store next result</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMdiArea</name> - <message> - <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/> - <source>(Untitled)</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMdiSubWindow</name> - <message> - <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/> - <source>%1 - [%2]</source> - <translation type="unfinished">%1 - [%2]</translation> - </message> - <message> - <location line="+72"/> - <source>Close</source> - <translation type="unfinished">إغلاق</translation> - </message> - <message> - <location line="-18"/> - <source>Minimize</source> - <translation type="unfinished">تصغير</translation> - </message> - <message> - <location line="+13"/> - <source>Restore Down</source> - <translation type="unfinished">استعاد في الأسفل</translation> - </message> - <message> - <location line="+707"/> - <source>&Restore</source> - <translation type="unfinished">ا&ستعاد</translation> - </message> - <message> - <location line="+3"/> - <source>&Move</source> - <translation type="unfinished">&تحريك</translation> - </message> - <message> - <location line="+1"/> - <source>&Size</source> - <translation type="unfinished">ال&حجم</translation> - </message> - <message> - <location line="+1"/> - <source>Mi&nimize</source> - <translation type="unfinished">ت&صغير</translation> - </message> - <message> - <location line="+2"/> - <source>Ma&ximize</source> - <translation type="unfinished">ت&كبير</translation> - </message> - <message> - <location line="+2"/> - <source>Stay on &Top</source> - <translation type="unfinished">ال&بقاء في الأمام</translation> - </message> - <message> - <location line="+3"/> - <source>&Close</source> - <translation type="unfinished">إ&غلاق</translation> - </message> - <message> - <location line="-787"/> - <source>- [%1]</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+58"/> - <source>Maximize</source> - <translation type="unfinished">تكبير</translation> - </message> - <message> - <location line="+3"/> - <source>Unshade</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Shade</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Restore</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Help</source> - <translation type="unfinished">مساعدة</translation> - </message> - <message> - <location line="+3"/> - <source>Menu</source> - <translation type="unfinished">قائمة الخيارات</translation> - </message> -</context> -<context> - <name>QMenu</name> - <message> - <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/> - <location line="+225"/> - <source>Close</source> - <translation type="unfinished">إغلاق</translation> - </message> - <message> - <location line="-224"/> - <location line="+225"/> - <source>Open</source> - <translation type="unfinished">فتح</translation> - </message> - <message> - <location line="-223"/> - <location line="+225"/> - <location line="+51"/> - <source>Execute</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMenuBar</name> - <message> - <source>About</source> - <translation type="obsolete">حول</translation> - </message> - <message> - <source>Config</source> - <translation type="obsolete">تشكيل</translation> - </message> - <message> - <source>Preference</source> - <translation type="obsolete">تفضيل</translation> - </message> - <message> - <source>Options</source> - <translation type="obsolete">خيارات</translation> - </message> - <message> - <source>Setting</source> - <translation type="obsolete">ضبط</translation> - </message> - <message> - <source>Setup</source> - <translation type="obsolete">إعداد</translation> - </message> - <message> - <source>Quit</source> - <translation type="obsolete">إنتهاء</translation> - </message> - <message> - <source>Exit</source> - <translation type="obsolete">خروج</translation> - </message> -</context> -<context> - <name>QMessageBox</name> - <message> - <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1964"/> - <location line="+852"/> - <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/> - <location line="+8"/> - <source>OK</source> - <translation>موافقة</translation> - </message> - <message> - <location line="+509"/> - <source>About Qt</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-508"/> - <source>Help</source> - <translation type="unfinished">مساعدة</translation> - </message> - <message> - <location line="-1097"/> - <source>Show Details...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Hide Details...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1570"/> - <source><h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMultiInputContext</name> - <message> - <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/> - <source>Select IM</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMultiInputContextPlugin</name> - <message> - <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/> - <source>Multiple input method switcher</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Multiple input method switcher that uses the context menu of the text widgets</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNativeSocketEngine</name> - <message> - <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/> - <source>The remote host closed the connection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Network operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Out of resources</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unsupported socket operation</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Protocol type not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Invalid socket descriptor</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Network unreachable</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Connection timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Connection refused</source> - <translation type="unfinished">رفض الوصل</translation> - </message> - <message> - <location line="+3"/> - <source>The bound address is already in use</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>The address is not available</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>The address is protected</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unable to send a message</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unable to receive a message</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unable to write</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Network error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Another socket is already listening on the same port</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-66"/> - <source>Unable to initialize non-blocking socket</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unable to initialize broadcast socket</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Host unreachable</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+24"/> - <source>Datagram was too large to send</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+18"/> - <source>Operation on non-socket</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unknown error</source> - <translation type="unfinished">خطأ مجهول</translation> - </message> - <message> - <location line="-3"/> - <source>The proxy type is invalid for this operation</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkAccessCacheBackend</name> - <message> - <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/> - <source>Error opening %1</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkAccessFileBackend</name> - <message> - <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/> - <source>Request for opening non-local file %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+42"/> - <source>Error opening %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+56"/> - <source>Write error writing to %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+33"/> - <source>Cannot open %1: Path is a directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Read error reading from %1: %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkAccessFtpBackend</name> - <message> - <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/> - <source>No suitable proxy found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>Cannot open %1: is a directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+130"/> - <source>Logging in to %1 failed: authentication required</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+39"/> - <source>Error while downloading %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Error while uploading %1: %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkAccessHttpBackend</name> - <message> - <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/> - <source>No suitable proxy found</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkReply</name> - <message> - <location line="+128"/> - <source>Error downloading %1 - server replied: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/> - <source>Protocol "%1" is unknown</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkReplyImpl</name> - <message> - <location line="+432"/> - <location line="+22"/> - <source>Operation canceled</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QOCIDriver</name> - <message> - <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/> - <source>Unable to logon</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-144"/> - <source>Unable to initialize</source> - <comment>QOCIDriver</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+215"/> - <source>Unable to begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QOCIResult</name> - <message> - <location line="-963"/> - <location line="+161"/> - <location line="+15"/> - <source>Unable to bind column for batch execute</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to execute batch statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+302"/> - <source>Unable to goto next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+59"/> - <source>Unable to alloc statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+36"/> - <source>Unable to bind value</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QODBCDriver</name> - <message> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/> - <source>Unable to connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unable to connect - Driver doesn't support all needed functionality</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+242"/> - <source>Unable to disable autocommit</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to enable autocommit</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QODBCResult</name> - <message> - <location line="-1218"/> - <location line="+349"/> - <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-332"/> - <location line="+626"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-555"/> - <source>Unable to fetch next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+279"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+268"/> - <source>Unable to bind variable</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/> - <location line="+578"/> - <source>Unable to fetch last</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/> - <source>Unable to fetch</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+44"/> - <source>Unable to fetch first</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to fetch previous</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QObject</name> - <message> - <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/> - <source>Home</source> - <translation type="unfinished">منزل</translation> - </message> - <message> - <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/> - <source>Operation not supported on %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+53"/> - <source>Invalid URI: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/> - <source>Write error writing to %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+57"/> - <source>Read error reading from %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+31"/> - <source>Socket error on %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Remote host closed the connection prematurely on %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+53"/> - <source>Protocol error: packet of size 0 received</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/> - <location line="+57"/> - <source>No host name given</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPPDOptionsModel</name> - <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/> - <source>Name</source> - <translation type="unfinished">الإسم</translation> - </message> - <message> - <location line="+2"/> - <source>Value</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPSQLDriver</name> - <message> - <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/> - <source>Unable to connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+49"/> - <source>Could not begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Could not commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>Could not rollback transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+358"/> - <source>Unable to subscribe</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+32"/> - <source>Unable to unsubscribe</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPSQLResult</name> - <message> - <location line="-1058"/> - <source>Unable to create query</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+374"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPageSetupWidget</name> - <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/> - <source>Centimeters (cm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Millimeters (mm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Inches (in)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Points (pt)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/> - <source>Form</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Paper</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Page size:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Width:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Height:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Paper source:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Orientation</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Portrait</source> - <translation type="unfinished">صورة</translation> - </message> - <message> - <location/> - <source>Landscape</source> - <translation type="unfinished">منظر</translation> - </message> - <message> - <location/> - <source>Reverse landscape</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Reverse portrait</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Margins</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>top margin</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>left margin</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>right margin</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>bottom margin</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPluginLoader</name> - <message> - <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/> - <source>Unknown error</source> - <translation type="unfinished">خطأ مجهول</translation> - </message> - <message> - <location line="-68"/> - <source>The plugin was not loaded.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintDialog</name> - <message> - <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/> - <source>locally connected</source> - <translation>موصل محليّا</translation> - </message> - <message> - <location line="+23"/> - <location line="+225"/> - <source>Aliases: %1</source> - <translation>بدائل: %1</translation> - </message> - <message> - <location line="+223"/> - <location line="+199"/> - <source>unknown</source> - <translation>مجهول</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/> - <source>OK</source> - <translation type="unfinished">موافقة</translation> - </message> - <message> - <source>Cancel</source> - <translation type="obsolete">إلغاء</translation> - </message> - <message> - <source>Print in color if available</source> - <translation type="obsolete">طباعة بالألوان إن توفّرت</translation> - </message> - <message> - <source>Printer</source> - <translation type="obsolete">الطّابعة</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+375"/> - <source>Print all</source> - <translation type="unfinished">طباعة الجميع</translation> - </message> - <message> - <location line="+2"/> - <source>Print range</source> - <translation type="unfinished">مدى الطّباعة</translation> - </message> - <message> - <source>Print last page first</source> - <translation type="obsolete">طباعة الصّفحة الخيرة أوّلا</translation> - </message> - <message> - <source>Number of copies:</source> - <translation type="obsolete">عدد النّسخ:</translation> - </message> - <message> - <source>Paper format</source> - <translation type="obsolete">مقاييس الورق</translation> - </message> - <message> - <source>Portrait</source> - <translation type="obsolete">صورة</translation> - </message> - <message> - <source>Landscape</source> - <translation type="obsolete">منظر</translation> - </message> - <message> - <location line="-48"/> - <source>A0 (841 x 1189 mm)</source> - <translation>أ0 (841 × 1189 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>A1 (594 x 841 mm)</source> - <translation>أ1 (594 × 841 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>A2 (420 x 594 mm)</source> - <translation>أ2 (420 × 594 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>A3 (297 x 420 mm)</source> - <translation>أ3 (297 × 420 مم)</translation> - </message> - <message> - <location line="+2"/> - <source>A5 (148 x 210 mm)</source> - <translation>أ5 (148 × 210 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>A6 (105 x 148 mm)</source> - <translation>أ6 (105 × 148 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>A7 (74 x 105 mm)</source> - <translation>أ7 (74 × 105 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>A8 (52 x 74 mm)</source> - <translation>أ8 (52 × 74 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>A9 (37 x 52 mm)</source> - <translation>أ9 (37 × 52 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B0 (1000 x 1414 mm)</source> - <translation>ب0 (1000 × 1414 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B1 (707 x 1000 mm)</source> - <translation>ب1 (707 × 1000 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B2 (500 x 707 mm)</source> - <translation>ب2 (500 × 707 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B3 (353 x 500 mm)</source> - <translation>ب3 (353 × 500 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B4 (250 x 353 mm)</source> - <translation>ب4 (250 × 353 مم)</translation> - </message> - <message> - <location line="+2"/> - <source>B6 (125 x 176 mm)</source> - <translation>ب6 (125 × 176 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B7 (88 x 125 mm)</source> - <translation>ب7 (88 × 125 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B8 (62 x 88 mm)</source> - <translation>ب4 (62 × 88 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B9 (44 x 62 mm)</source> - <translation>ب9 (44 × 62 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>B10 (31 x 44 mm)</source> - <translation>ب10 (31 × 44 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>C5E (163 x 229 mm)</source> - <translation>سي5إي (163 × 229 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>DLE (110 x 220 mm)</source> - <translation>دي أل إي (110 × 220 مم)</translation> - </message> - <message> - <location line="+2"/> - <source>Folio (210 x 330 mm)</source> - <translation>ملفّ (210 × 330 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>Ledger (432 x 279 mm)</source> - <translation>دفتر (432 × 279 مم)</translation> - </message> - <message> - <location line="+3"/> - <source>Tabloid (279 x 432 mm)</source> - <translation>جريدة (279 × 432 مم)</translation> - </message> - <message> - <location line="+1"/> - <source>US Common #10 Envelope (105 x 241 mm)</source> - <translation>غلاف رسالة أمريكية متداولة رقم 10 (105 × 241 مم)</translation> - </message> - <message> - <location line="-25"/> - <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/> - <location line="+13"/> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/> - <source>Print</source> - <translation type="unfinished">طباعة</translation> - </message> - <message> - <source>File</source> - <translation type="obsolete">ملفّ</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/> - <source>Print To File ...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+80"/> - <source>File %1 is not writable. -Please choose a different file name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1 already exists. -Do you want to overwrite it?</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-208"/> - <source>File exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source><qt>Do you want to overwrite it?</qt></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+227"/> - <source>Print selection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/> - <source>%1 is a directory. -Please choose a different file name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/> - <source>A0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A4</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A5</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A6</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A7</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A8</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A9</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B4</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B5</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B6</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B7</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B8</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B9</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B10</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>C5E</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>DLE</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Executive</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Folio</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Ledger</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Legal</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Letter</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Tabloid</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>US Common #10 Envelope</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Custom</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/> - <location line="+68"/> - <source>&Options >></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-63"/> - <source>&Print</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+67"/> - <source>&Options <<</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+253"/> - <source>Print to File (PDF)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Print to File (Postscript)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+45"/> - <source>Local file</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Write %1 file</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/> - <source>The 'From' value cannot be greater than the 'To' value.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintPreviewDialog</name> - <message> - <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/> - <location line="+12"/> - <source>Page Setup</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/> - <source>%1%</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+79"/> - <source>Print Preview</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+29"/> - <source>Next page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Previous page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>First page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Last page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Fit width</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Fit page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Zoom in</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Zoom out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Portrait</source> - <translation type="unfinished">صورة</translation> - </message> - <message> - <location line="+1"/> - <source>Landscape</source> - <translation type="unfinished">منظر</translation> - </message> - <message> - <location line="+10"/> - <source>Show single page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Show facing pages</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Show overview of all pages</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Print</source> - <translation type="unfinished">طباعة</translation> - </message> - <message> - <location line="+1"/> - <source>Page setup</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Close</source> - <translation type="unfinished">إغلاق</translation> - </message> - <message> - <location line="+151"/> - <source>Export to PDF</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Export to PostScript</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintPropertiesDialog</name> - <message> - <source>Save</source> - <translation type="obsolete">حفظ</translation> - </message> - <message> - <source>OK</source> - <translation type="obsolete">موافقة</translation> - </message> -</context> -<context> - <name>QPrintPropertiesWidget</name> - <message> - <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/> - <source>Form</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Advanced</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintSettingsOutput</name> - <message> - <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/> - <source>Form</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Copies</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Print range</source> - <translation type="unfinished">مدى الطّباعة</translation> - </message> - <message> - <location/> - <source>Print all</source> - <translation type="unfinished">طباعة الجميع</translation> - </message> - <message> - <location/> - <source>Pages from</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>to</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Selection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Output Settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Copies:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Collate</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Reverse</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Options</source> - <translation type="unfinished">خيارات</translation> - </message> - <message> - <location/> - <source>Color Mode</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Color</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Grayscale</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Duplex Printing</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>None</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Long side</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Short side</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintWidget</name> - <message> - <location filename="../src/gui/dialogs/qprintwidget.ui"/> - <source>Form</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Printer</source> - <translation type="unfinished">الطّابعة</translation> - </message> - <message> - <location/> - <source>&Name:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>P&roperties</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Location:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Preview</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Type:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Output &file:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>...</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QProcess</name> - <message> - <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/> - <source>Could not open input redirection for reading</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/> - <source>Could not open output redirection for writing</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+235"/> - <source>Resource error (fork failure): %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+259"/> - <location line="+53"/> - <location line="+74"/> - <location line="+67"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/> - <location line="+50"/> - <location line="+75"/> - <location line="+42"/> - <location line="+54"/> - <source>Process operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/io/qprocess.cpp" line="+533"/> - <location line="+52"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/> - <location line="+50"/> - <source>Error reading from process</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+47"/> - <location line="+779"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/> - <source>Error writing to process</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-709"/> - <source>Process crashed</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+912"/> - <source>No program defined</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/> - <source>Process failed to start</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QProgressDialog</name> - <message> - <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/> - <source>Cancel</source> - <translation>إلغاء</translation> - </message> -</context> -<context> - <name>QPushButton</name> - <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/> - <source>Open</source> - <translation type="unfinished">فتح</translation> - </message> -</context> -<context> - <name>QRadioButton</name> - <message> - <location line="+12"/> - <source>Check</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QRegExp</name> - <message> - <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/> - <source>no error occurred</source> - <translation>لم يحدث هناك أيّ خطأ</translation> - </message> - <message> - <location line="+1"/> - <source>disabled feature used</source> - <translation>تمّ استعمال خاصيّة التّوقيف</translation> - </message> - <message> - <location line="+1"/> - <source>bad char class syntax</source> - <translation>خطأ نركيبي: صنف الرّمز</translation> - </message> - <message> - <location line="+1"/> - <source>bad lookahead syntax</source> - <translation>خطأ تركيبي: النّظر إلى الأمام</translation> - </message> - <message> - <location line="+1"/> - <source>bad repetition syntax</source> - <translation>خطأ نركيبي: تكرار</translation> - </message> - <message> - <location line="+1"/> - <source>invalid octal value</source> - <translation>قيمة ثمانية غبر صالحة</translation> - </message> - <message> - <location line="+1"/> - <source>missing left delim</source> - <translation>الفاصل الأيسر ناقص</translation> - </message> - <message> - <location line="+1"/> - <source>unexpected end</source> - <translation>نهاية غير متوقّعة</translation> - </message> - <message> - <location line="+1"/> - <source>met internal limit</source> - <translation>تمّ الوصول إلى الحدّ الدّاخلي</translation> - </message> -</context> -<context> - <name>QSQLite2Driver</name> - <message> - <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/> - <source>Error to open database</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+41"/> - <source>Unable to begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to rollback Transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSQLite2Result</name> - <message> - <location line="-323"/> - <source>Unable to fetch results</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+147"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSQLiteDriver</name> - <message> - <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/> - <source>Error opening database</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Error closing database</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Unable to begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSQLiteResult</name> - <message> - <location line="-400"/> - <location line="+66"/> - <location line="+8"/> - <source>Unable to fetch row</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+63"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Unable to reset statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+45"/> - <source>Unable to bind parameters</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Parameter count mismatch</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-208"/> - <source>No query</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QScrollBar</name> - <message> - <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/> - <source>Scroll here</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Left edge</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Top</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Right edge</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Bottom</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Page left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/> - <source>Page up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Page right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/> - <source>Page down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Scroll left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Scroll right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/> - <source>Line up</source> - <translation type="unfinished">تصفيف</translation> - </message> - <message> - <location line="+4"/> - <source>Position</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Line down</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSharedMemory</name> - <message> - <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/> - <source>%1: unable to set key on lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+81"/> - <source>%1: create size is less then 0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+168"/> - <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/> - <source>%1: unable to lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+22"/> - <source>%1: unable to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/> - <source>%1: permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/> - <source>%1: already exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> - <source>%1: doesn't exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> - <source>%1: out of resources</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/> - <source>%1: unknown error %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>%1: key is empty</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>%1: unix key file doesn't exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>%1: ftok failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+51"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/> - <source>%1: unable to make key</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>%1: system-imposed size restrictions</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+53"/> - <source>%1: not attached</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/> - <source>%1: invalid size</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+68"/> - <source>%1: key error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+38"/> - <source>%1: size query failed</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QShortcut</name> - <message> - <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/> - <source>Space</source> - <translation type="unfinished">فراغ</translation> - </message> - <message> - <location line="+1"/> - <source>Esc</source> - <translation type="unfinished">إفلات</translation> - </message> - <message> - <location line="+1"/> - <source>Tab</source> - <translation type="unfinished">جدولة</translation> - </message> - <message> - <location line="+1"/> - <source>Backtab</source> - <translation type="unfinished">جدولة للوراء</translation> - </message> - <message> - <location line="+1"/> - <source>Backspace</source> - <translation type="unfinished">فراغ للوراء</translation> - </message> - <message> - <location line="+1"/> - <source>Return</source> - <translation type="unfinished">عودة</translation> - </message> - <message> - <location line="+1"/> - <source>Enter</source> - <translation type="unfinished">إدخال</translation> - </message> - <message> - <location line="+1"/> - <source>Ins</source> - <translation type="unfinished">إدراج</translation> - </message> - <message> - <location line="+1"/> - <source>Del</source> - <translation type="unfinished">حذف</translation> - </message> - <message> - <location line="+1"/> - <source>Pause</source> - <translation type="unfinished">وقف</translation> - </message> - <message> - <location line="+1"/> - <source>Print</source> - <translation type="unfinished">طباعة</translation> - </message> - <message> - <location line="+1"/> - <source>SysReq</source> - <translation type="unfinished">نظام</translation> - </message> - <message> - <location line="+1"/> - <source>Home</source> - <translation type="unfinished">منزل</translation> - </message> - <message> - <location line="+1"/> - <source>End</source> - <translation type="unfinished">نهاية</translation> - </message> - <message> - <location line="+1"/> - <source>Left</source> - <translation type="unfinished">يسار</translation> - </message> - <message> - <location line="+1"/> - <source>Up</source> - <translation type="unfinished">فوق</translation> - </message> - <message> - <location line="+1"/> - <source>Right</source> - <translation type="unfinished">يمين</translation> - </message> - <message> - <location line="+1"/> - <source>Down</source> - <translation type="unfinished">تحت</translation> - </message> - <message> - <location line="+1"/> - <source>PgUp</source> - <translation type="unfinished">صفحة للفوق</translation> - </message> - <message> - <location line="+1"/> - <source>PgDown</source> - <translation type="unfinished">صفحة للتحت</translation> - </message> - <message> - <location line="+1"/> - <source>CapsLock</source> - <translation type="unfinished">إقفال الحروف الكبيرة</translation> - </message> - <message> - <location line="+1"/> - <source>NumLock</source> - <translation type="unfinished">إقفال الأعداد</translation> - </message> - <message> - <location line="+1"/> - <source>ScrollLock</source> - <translation type="unfinished">إقفال التّحريك</translation> - </message> - <message> - <location line="+1"/> - <source>Menu</source> - <translation type="unfinished">قائمة الخيارات</translation> - </message> - <message> - <location line="+1"/> - <source>Help</source> - <translation type="unfinished">مساعدة</translation> - </message> - <message> - <location line="+3"/> - <source>Back</source> - <translation type="unfinished">رجوع</translation> - </message> - <message> - <location line="+1"/> - <source>Forward</source> - <translation type="unfinished">للأمام</translation> - </message> - <message> - <location line="+1"/> - <source>Stop</source> - <translation type="unfinished">توقّف</translation> - </message> - <message> - <location line="+1"/> - <source>Refresh</source> - <translation type="unfinished">إنعاش</translation> - </message> - <message> - <location line="+1"/> - <source>Volume Down</source> - <translation type="unfinished">تنقيص الصّوت</translation> - </message> - <message> - <location line="+1"/> - <source>Volume Mute</source> - <translation type="unfinished">إغلاق الصّوت</translation> - </message> - <message> - <location line="+1"/> - <source>Volume Up</source> - <translation type="unfinished">زيادة الصّوت</translation> - </message> - <message> - <location line="+1"/> - <source>Bass Boost</source> - <translation type="unfinished">إنعاش الأصوات الجهورية</translation> - </message> - <message> - <location line="+1"/> - <source>Bass Up</source> - <translation type="unfinished">زيادة الأصوات الجهورية</translation> - </message> - <message> - <location line="+1"/> - <source>Bass Down</source> - <translation type="unfinished">تنقيص الأصوات الجهورية</translation> - </message> - <message> - <location line="+1"/> - <source>Treble Up</source> - <translation type="unfinished">زيادة الأصوات الحادّة</translation> - </message> - <message> - <location line="+1"/> - <source>Treble Down</source> - <translation type="unfinished">تنقيص الأصوات الحادّة</translation> - </message> - <message> - <location line="+1"/> - <source>Media Play</source> - <translation type="unfinished">لعب الوسط</translation> - </message> - <message> - <location line="+1"/> - <source>Media Stop</source> - <translation type="unfinished">توقيف الوسط</translation> - </message> - <message> - <location line="+1"/> - <source>Media Previous</source> - <translation type="unfinished">الوسط الأسبق</translation> - </message> - <message> - <location line="+1"/> - <source>Media Next</source> - <translation type="unfinished">الوسط التّالي</translation> - </message> - <message> - <location line="+1"/> - <source>Media Record</source> - <translation type="unfinished">تسجيل الوسط</translation> - </message> - <message> - <location line="+2"/> - <source>Favorites</source> - <translation type="unfinished">المفضّلات</translation> - </message> - <message> - <location line="+1"/> - <source>Search</source> - <translation type="unfinished">بحث</translation> - </message> - <message> - <location line="+1"/> - <source>Standby</source> - <translation type="unfinished">إنتظار</translation> - </message> - <message> - <location line="+1"/> - <source>Open URL</source> - <translation type="unfinished">فتح الوصلة</translation> - </message> - <message> - <location line="+1"/> - <source>Launch Mail</source> - <translation type="unfinished">بدأ البريد</translation> - </message> - <message> - <location line="+1"/> - <source>Launch Media</source> - <translation type="unfinished">بدأ الوسط</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (0)</source> - <translation type="unfinished">بدأ (0)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (1)</source> - <translation type="unfinished">بدأ (1)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (2)</source> - <translation type="unfinished">بدأ (2)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (3)</source> - <translation type="unfinished">بدأ (3)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (4)</source> - <translation type="unfinished">بدأ (4)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (5)</source> - <translation type="unfinished">بدأ (5)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (6)</source> - <translation type="unfinished">بدأ (6)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (7)</source> - <translation type="unfinished">بدأ (7)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (8)</source> - <translation type="unfinished">بدأ (8)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (9)</source> - <translation type="unfinished">بدأ (9)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (A)</source> - <translation type="unfinished">بدأ (A)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (B)</source> - <translation type="unfinished">بدأ (B)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (C)</source> - <translation type="unfinished">بدأ (C)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (D)</source> - <translation type="unfinished">بدأ (D)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (E)</source> - <translation type="unfinished">بدأ (E)</translation> - </message> - <message> - <location line="+1"/> - <source>Launch (F)</source> - <translation type="unfinished">بدأ (F)</translation> - </message> - <message> - <location line="+4"/> - <source>Print Screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Page Up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Page Down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Caps Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Num Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Number Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Scroll Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Insert</source> - <translation type="unfinished">إدراج</translation> - </message> - <message> - <location line="+1"/> - <source>Delete</source> - <translation type="unfinished">حذف</translation> - </message> - <message> - <location line="+1"/> - <source>Escape</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>System Request</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Select</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Yes</source> - <translation type="unfinished">نعم</translation> - </message> - <message> - <location line="+1"/> - <source>No</source> - <translation type="unfinished">لا</translation> - </message> - <message> - <location line="+4"/> - <source>Context1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Context2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Context3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Context4</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Call</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Hangup</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Flip</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+527"/> - <location line="+122"/> - <source>Ctrl</source> - <translation type="unfinished">تحكّم</translation> - </message> - <message> - <location line="-121"/> - <location line="+125"/> - <source>Shift</source> - <translation type="unfinished">إزاحة</translation> - </message> - <message> - <location line="-124"/> - <location line="+122"/> - <source>Alt</source> - <translation type="unfinished">تناوب</translation> - </message> - <message> - <location line="-121"/> - <location line="+117"/> - <source>Meta</source> - <translation type="unfinished">ما فوق</translation> - </message> - <message> - <location line="-25"/> - <source>+</source> - <translation type="unfinished">+</translation> - </message> - <message> - <location line="+46"/> - <source>F%1</source> - <translation type="unfinished">F%1</translation> - </message> - <message> - <location line="-720"/> - <source>Home Page</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSlider</name> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/> - <source>Page left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Page up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Position</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Page right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Page down</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSocks5SocketEngine</name> - <message> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/> - <source>Connection to proxy refused</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Connection to proxy closed prematurely</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Proxy host not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Connection to proxy timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Proxy authentication failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Proxy authentication failed: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>SOCKS version 5 protocol error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>General SOCKSv5 server failure</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Connection not allowed by SOCKSv5 server</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>TTL expired</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>SOCKSv5 command not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Address type not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Unknown SOCKSv5 proxy error code 0x%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+685"/> - <source>Network operation timed out</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSpinBox</name> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/> - <source>More</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Less</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSql</name> - <message> - <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/> - <source>Delete</source> - <translation>حذف</translation> - </message> - <message> - <location line="+1"/> - <source>Delete this record?</source> - <translation>حذف هذاالتّسجيل؟</translation> - </message> - <message> - <location line="+1"/> - <location line="+16"/> - <location line="+36"/> - <source>Yes</source> - <translation>نعم</translation> - </message> - <message> - <location line="-51"/> - <location line="+16"/> - <location line="+36"/> - <source>No</source> - <translation>لا</translation> - </message> - <message> - <location line="-44"/> - <source>Insert</source> - <translation>إدراج</translation> - </message> - <message> - <location line="+2"/> - <source>Update</source> - <translation>تحديث</translation> - </message> - <message> - <location line="+4"/> - <source>Save edits?</source> - <translation>حفظ التّغييرات؟</translation> - </message> - <message> - <location line="+3"/> - <source>Cancel</source> - <translation>إلغاء</translation> - </message> - <message> - <location line="+32"/> - <source>Confirm</source> - <translation>تأكيد</translation> - </message> - <message> - <location line="+1"/> - <source>Cancel your edits?</source> - <translation>إلغاء التّغييرات؟</translation> - </message> -</context> -<context> - <name>QSslSocket</name> - <message> - <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/> - <source>Unable to write data: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+119"/> - <source>Error while reading: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+96"/> - <source>Error during SSL handshake: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-524"/> - <source>Error creating SSL context (%1)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+25"/> - <source>Invalid or empty cipher list (%1)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+62"/> - <source>Error creating SSL session, %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Error creating SSL session: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-61"/> - <source>Cannot provide a certificate with no key, %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Error loading local certificate, %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>Error loading private key, %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Private key does not certificate public key, %1</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSystemSemaphore</name> - <message> - <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/> - <source>%1: out of resources</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-13"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/> - <source>%1: permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1: already exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1: does not exist</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/> - <source>%1: unknown error %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QTDSDriver</name> - <message> - <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/> - <source>Unable to open connection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Unable to use database</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QTabBar</name> - <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/> - <source>Scroll Left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll Right</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QTcpServer</name> - <message> - <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/> - <source>Operation on socket is not supported</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QTextControl</name> - <message> - <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/> - <source>&Undo</source> - <translation type="unfinished">&تراجع</translation> - </message> - <message> - <location line="+2"/> - <source>&Redo</source> - <translation type="unfinished">إ&عادة</translation> - </message> - <message> - <location line="+4"/> - <source>Cu&t</source> - <translation type="unfinished">&قصّ</translation> - </message> - <message> - <location line="+5"/> - <source>&Copy</source> - <translation type="unfinished">&نسخ</translation> - </message> - <message> - <location line="+7"/> - <source>Copy &Link Location</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>&Paste</source> - <translation type="unfinished">ت&لصيق</translation> - </message> - <message> - <location line="+3"/> - <source>Delete</source> - <translation type="unfinished">حذف</translation> - </message> - <message> - <location line="+7"/> - <source>Select All</source> - <translation type="unfinished">انتقاء الجميع</translation> - </message> -</context> -<context> - <name>QToolButton</name> - <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/> - <location line="+6"/> - <source>Press</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-4"/> - <location line="+8"/> - <source>Open</source> - <translation type="unfinished">فتح</translation> - </message> -</context> -<context> - <name>QUdpSocket</name> - <message> - <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/> - <source>This platform does not support IPv6</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QUndoGroup</name> - <message> - <location filename="../src/gui/util/qundogroup.cpp" line="+386"/> - <source>Undo</source> - <translation type="unfinished">تراجع</translation> - </message> - <message> - <location line="+28"/> - <source>Redo</source> - <translation type="unfinished">إعادة</translation> - </message> -</context> -<context> - <name>QUndoModel</name> - <message> - <location filename="../src/gui/util/qundoview.cpp" line="+101"/> - <source><empty></source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QUndoStack</name> - <message> - <location filename="../src/gui/util/qundostack.cpp" line="+834"/> - <source>Undo</source> - <translation type="unfinished">تراجع</translation> - </message> - <message> - <location line="+27"/> - <source>Redo</source> - <translation type="unfinished">إعادة</translation> - </message> -</context> -<context> - <name>QUnicodeControlCharacterMenu</name> - <message> - <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/> - <source>LRM Left-to-right mark</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>RLM Right-to-left mark</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>ZWJ Zero width joiner</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>ZWNJ Zero width non-joiner</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>ZWSP Zero width space</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>LRE Start of left-to-right embedding</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>RLE Start of right-to-left embedding</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>LRO Start of left-to-right override</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>RLO Start of right-to-left override</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>PDF Pop directional formatting</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Insert Unicode control character</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWebFrame</name> - <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/> - <source>Request cancelled</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Request blocked</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Cannot show URL</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Frame load interruped by policy change</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Cannot show mimetype</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>File does not exist</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWebPage</name> - <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/> - <source>Bad HTTP request</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/> - <source>Submit</source> - <comment>default label for Submit buttons in forms on web pages</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Submit</source> - <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Reset</source> - <comment>default label for Reset buttons in forms on web pages</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>This is a searchable index. Enter search keywords: </source> - <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Choose File</source> - <comment>title for file button used in HTML forms</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>No file selected</source> - <comment>text to display in file button used in HTML forms when no file is selected</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Open in New Window</source> - <comment>Open in New Window context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Save Link...</source> - <comment>Download Linked File context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Copy Link</source> - <comment>Copy Link context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Open Image</source> - <comment>Open Image in New Window context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Save Image</source> - <comment>Download Image context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Copy Image</source> - <comment>Copy Link context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Open Frame</source> - <comment>Open Frame in New Window context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Copy</source> - <comment>Copy context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Go Back</source> - <comment>Back context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Go Forward</source> - <comment>Forward context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Stop</source> - <comment>Stop context menu item</comment> - <translation type="unfinished">توقّف</translation> - </message> - <message> - <location line="+5"/> - <source>Reload</source> - <comment>Reload context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Cut</source> - <comment>Cut context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Paste</source> - <comment>Paste context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>No Guesses Found</source> - <comment>No Guesses Found context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Ignore</source> - <comment>Ignore Spelling context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Add To Dictionary</source> - <comment>Learn Spelling context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Search The Web</source> - <comment>Search The Web context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Look Up In Dictionary</source> - <comment>Look Up in Dictionary context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Open Link</source> - <comment>Open Link context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Ignore</source> - <comment>Ignore Grammar context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Spelling</source> - <comment>Spelling and Grammar context sub-menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Show Spelling and Grammar</source> - <comment>menu item title</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Hide Spelling and Grammar</source> - <comment>menu item title</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Check Spelling</source> - <comment>Check spelling context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Check Spelling While Typing</source> - <comment>Check spelling while typing context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Check Grammar With Spelling</source> - <comment>Check grammar with spelling context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Fonts</source> - <comment>Font context sub-menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Bold</source> - <comment>Bold context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Italic</source> - <comment>Italic context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Underline</source> - <comment>Underline context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Outline</source> - <comment>Outline context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Direction</source> - <comment>Writing direction context sub-menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Text Direction</source> - <comment>Text direction context sub-menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Default</source> - <comment>Default writing direction context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>LTR</source> - <comment>Left to Right context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>RTL</source> - <comment>Right to Left context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Inspect</source> - <comment>Inspect Element context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>No recent searches</source> - <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Recent searches</source> - <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Clear recent searches</source> - <comment>menu item in Recent Searches menu that empties menu's contents</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+75"/> - <source>Unknown</source> - <comment>Unknown filesize FTP directory listing item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>%1 (%2x%3 pixels)</source> - <comment>Title string for images</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/> - <source>Web Inspector - %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/> - <source>Scroll here</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Left edge</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Top</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Right edge</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Bottom</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Page left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Page up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Page right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Page down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Scroll left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Scroll right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll down</source> - <translation type="unfinished"></translation> - </message> - <message numerus="yes"> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/> - <source>%n file(s)</source> - <comment>number of chosen file</comment> - <translation type="unfinished"> - <numerusform></numerusform> - </translation> - </message> - <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/> - <source>JavaScript Alert - %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>JavaScript Confirm - %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>JavaScript Prompt - %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+333"/> - <source>Move the cursor to the next character</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the previous character</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the next word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the previous word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the next line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the previous line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the start of the line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the end of the line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the start of the block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the end of the block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the start of the document</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the end of the document</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select all</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the next character</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the previous character</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the next word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the previous word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the next line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the previous line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the start of the line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the end of the line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the start of the block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the end of the block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the start of the document</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the end of the document</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Delete to the start of the word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Delete to the end of the word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+33"/> - <source>Insert a new paragraph</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Insert a new line</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWhatsThisAction</name> - <message> - <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/> - <source>What's This?</source> - <translation type="unfinished">ما هذا؟</translation> - </message> -</context> -<context> - <name>QWidget</name> - <message> - <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/> - <source>*</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWizard</name> - <message> - <location filename="../src/gui/dialogs/qwizard.cpp" line="+637"/> - <source>< &Back</source> - <translation type="unfinished">< &رجوع</translation> - </message> - <message> - <location line="+10"/> - <source>&Finish</source> - <translation type="unfinished">إ&نهاء</translation> - </message> - <message> - <location line="+4"/> - <source>&Help</source> - <translation type="unfinished">&مساعدة</translation> - </message> - <message> - <location line="-14"/> - <source>Go Back</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Continue</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Commit</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Done</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Quit</source> - <translation type="obsolete">إنتهاء</translation> - </message> - <message> - <location line="+4"/> - <source>Help</source> - <translation type="unfinished">مساعدة</translation> - </message> - <message> - <location line="-2"/> - <source>Cancel</source> - <translation type="unfinished">إلغاء</translation> - </message> - <message> - <location line="-6"/> - <source>&Next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>&Next ></source> - <translation type="unfinished">ال&تّالي ></translation> - </message> -</context> -<context> - <name>QWorkspace</name> - <message> - <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/> - <source>&Restore</source> - <translation type="unfinished">ا&ستعاد</translation> - </message> - <message> - <location line="+1"/> - <source>&Move</source> - <translation type="unfinished">&تحريك</translation> - </message> - <message> - <location line="+1"/> - <source>&Size</source> - <translation type="unfinished">&حجم</translation> - </message> - <message> - <location line="+2"/> - <source>Mi&nimize</source> - <translation type="unfinished">ت&صغير</translation> - </message> - <message> - <location line="+2"/> - <source>Ma&ximize</source> - <translation type="unfinished">ت&كبير</translation> - </message> - <message> - <location line="+2"/> - <source>&Close</source> - <translation type="unfinished">إ&غلاق</translation> - </message> - <message> - <location line="+6"/> - <source>Stay on &Top</source> - <translation type="unfinished">ال&بقاء في الأمام</translation> - </message> - <message> - <location line="+3"/> - <location line="+1059"/> - <source>Sh&ade</source> - <translation type="unfinished">ت&ظليل</translation> - </message> - <message> - <location line="-278"/> - <location line="+60"/> - <source>%1 - [%2]</source> - <translation>%1 - [%2]</translation> - </message> - <message> - <location line="-1837"/> - <source>Minimize</source> - <translation type="unfinished">تصغير</translation> - </message> - <message> - <location line="+2"/> - <source>Restore Down</source> - <translation type="unfinished">استعاد في الأسفل</translation> - </message> - <message> - <location line="-4"/> - <source>Close</source> - <translation type="unfinished">إغلاق</translation> - </message> - <message> - <location line="+2053"/> - <source>&Unshade</source> - <translation type="unfinished">إ&لغاء التّظليل</translation> - </message> -</context> -<context> - <name>QXml</name> - <message> - <location filename="../src/xml/sax/qxml.cpp" line="+58"/> - <source>no error occurred</source> - <translation>لم يحدث هناك أيّ خطأ</translation> - </message> - <message> - <location line="+1"/> - <source>error triggered by consumer</source> - <translation>أطلق الخطأ من طرف المستهلك</translation> - </message> - <message> - <location line="+1"/> - <source>unexpected end of file</source> - <translation>نهاية غير متوقّعة للملفّ</translation> - </message> - <message> - <location line="+1"/> - <source>more than one document type definition</source> - <translation>أكثر من تعريف لطراز الوثيقة</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing element</source> - <translation>حدث خطأ عند تحليل تركيب العنصر</translation> - </message> - <message> - <location line="+1"/> - <source>tag mismatch</source> - <translation>عدم تطابق العلامة</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing content</source> - <translation>حدث خطأ عند تحليل تركيب المحتوى</translation> - </message> - <message> - <location line="+1"/> - <source>unexpected character</source> - <translation>رمز غير متوقّع</translation> - </message> - <message> - <location line="+1"/> - <source>invalid name for processing instruction</source> - <translation>إسم غير صالح لتعليمة المعالجة</translation> - </message> - <message> - <location line="+1"/> - <source>version expected while reading the XML declaration</source> - <translation>الإصدار متوقّع عند قراءة إعلان الXML</translation> - </message> - <message> - <location line="+1"/> - <source>wrong value for standalone declaration</source> - <translation>قيمة خاطئة لإعلان مستقلّ</translation> - </message> - <message> - <location line="+1"/> - <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> - <translation>إعلان التّرميز أو إعلان مستقلّ متوقّع عند قراءة إعلان الXML</translation> - </message> - <message> - <location line="+1"/> - <source>standalone declaration expected while reading the XML declaration</source> - <translation>إعلان مستقلّ متوقّع عند قراءة إعلان الXML</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing document type definition</source> - <translation>حدث خطأ عند تحليل تركيب تعريف طراز الوثيقة</translation> - </message> - <message> - <location line="+1"/> - <source>letter is expected</source> - <translation>حرف متوقّع</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing comment</source> - <translation>حدث خطأ عند تحليل تركيب التّعليق</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing reference</source> - <translation>حدث خطأ عند تحليل تركيب المرجع</translation> - </message> - <message> - <location line="+1"/> - <source>internal general entity reference not allowed in DTD</source> - <translation>المرجع إلى كيان داخلي عامّ غير مسموح به في الDTD</translation> - </message> - <message> - <location line="+1"/> - <source>external parsed general entity reference not allowed in attribute value</source> - <translation>المرجع إلى كيان خارجي عامّ معرب غير مسموح به في قيمة الخاصّية</translation> - </message> - <message> - <location line="+1"/> - <source>external parsed general entity reference not allowed in DTD</source> - <translation>المرجع إلى كيان خارجي عامّ معرب غير مسموح به في الDTD</translation> - </message> - <message> - <location line="+1"/> - <source>unparsed entity reference in wrong context</source> - <translation>مرجع إلى كيان غير معرب في سياق خاطئ</translation> - </message> - <message> - <location line="+1"/> - <source>recursive entities</source> - <translation>كيانات معاودة</translation> - </message> - <message> - <location line="+1"/> - <source>error in the text declaration of an external entity</source> - <translation>خطأ في التّعريف النّصّي لكيان خارجي</translation> - </message> -</context> -<context> - <name>QXmlStream</name> - <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/> - <source>Extra content at end of document.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+222"/> - <source>Invalid entity value.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+107"/> - <source>Invalid XML character.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+259"/> - <source>Sequence ']]>' not allowed in content.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+309"/> - <source>Namespace prefix '%1' not declared</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+78"/> - <source>Attribute redefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+115"/> - <source>Unexpected character '%1' in public id literal.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+28"/> - <source>Invalid XML version string.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Unsupported XML version.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>%1 is an invalid encoding name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Encoding %1 is unsupported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>Standalone accepts only yes or no.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Invalid attribute in XML declaration.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>Premature end of document.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Invalid document.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+40"/> - <source>Expected </source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>, but got '</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Unexpected '</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+210"/> - <source>Expected character data.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/> - <source>Recursive entity detected.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+516"/> - <source>Start tag expected.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+222"/> - <source>XML declaration not at start of document.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-31"/> - <source>NDATA in parameter entity declaration.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+34"/> - <source>%1 is an invalid processing instruction name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Invalid processing instruction name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/> - <location line="+12"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/> - <location line="+53"/> - <source>Illegal namespace declaration.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/> - <source>Invalid XML name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>Opening and ending tag mismatch.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+18"/> - <source>Reference to unparsed entity '%1'.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-13"/> - <location line="+61"/> - <location line="+40"/> - <source>Entity '%1' not declared.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-26"/> - <source>Reference to external entity '%1' in attribute value.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+40"/> - <source>Invalid character reference.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/> - <source>Encountered incorrectly encoded content.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+274"/> - <source>The standalone pseudo attribute must appear after the encoding.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/> - <source>%1 is an invalid PUBLIC identifier.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QtXmlPatterns</name> - <message> - <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/> - <source>An %1-attribute with value %2 has already been declared.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>An %1-attribute must have a valid %2 as value, which %3 isn't.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/> - <source>Network timeout.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/> - <source>Element %1 can't be serialized because it appears outside the document element.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+60"/> - <source>Attribute %1 can't be serialized because it appears at the top level.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/> - <source>Year %1 is invalid because it begins with %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Day %1 is outside the range %2..%3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Month %1 is outside the range %2..%3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Overflow: Can't represent date %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Day %1 is invalid for month %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+49"/> - <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Time %1:%2:%3.%4 is invalid.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+115"/> - <source>Overflow: Date can't be represented.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/> - <location line="+15"/> - <source>At least one component must be present.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-7"/> - <source>At least one time component must appear after the %1-delimiter.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/> - <source>No operand in an integer division, %1, can be %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>The first operand in an integer division, %1, cannot be infinity (%2).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>The second operand in a division, %1, cannot be zero (%2).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/> - <source>%1 is not a valid value of type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/> - <source>When casting to %1 from %2, the source value cannot be %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/> - <source>Integer division (%1) by zero (%2) is undefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Division (%1) by zero (%2) is undefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Modulus division (%1) by zero (%2) is undefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+122"/> - <location line="+32"/> - <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-20"/> - <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+32"/> - <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/> - <source>A value of type %1 cannot have an Effective Boolean Value.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/> - <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/> - <source>Value %1 of type %2 exceeds maximum (%3).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Value %1 of type %2 is below minimum (%3).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/> - <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>%1 is not valid as a value of type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/> - <source>Operator %1 cannot be used on type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/> - <source>The namespace URI in the name for a computed attribute cannot be %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/> - <source>Type error in cast, expected %1, received %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+29"/> - <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/> - <source>No casting is possible with %1 as the target type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>It is not possible to cast from %1 to %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+27"/> - <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>It's not possible to cast the value %1 of type %2 to %3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Failure when casting from %1 to %2: %3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/> - <source>A comment cannot contain %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>A comment cannot end with a %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/> - <source>No comparisons can be done involving the type %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>Operator %1 is not available between atomic values of type %2 and %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/> - <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/> - <source>A library module cannot be evaluated directly. It must be imported from a main module.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+40"/> - <source>No template by name %1 exists.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/> - <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+32"/> - <source>A positional predicate must evaluate to a single numeric value.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/> - <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+24"/> - <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/> - <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/> - <source>The data of a processing instruction cannot contain the string %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/> - <source>No namespace binding exists for the prefix %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/> - <source>No namespace binding exists for the prefix %1 in %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/> - <source>%1 is an invalid %2</source> - <translation type="unfinished"></translation> - </message> - <message numerus="yes"> - <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/> - <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source> - <translation type="unfinished"> - <numerusform></numerusform> - </translation> - </message> - <message numerus="yes"> - <location line="+11"/> - <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source> - <translation type="unfinished"> - <numerusform></numerusform> - </translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/> - <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+74"/> - <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+91"/> - <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/> - <source>%1 is not a valid XML 1.0 character.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/> - <source>The first argument to %1 cannot be of type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/> - <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/> - <source>%1 was called.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/> - <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+39"/> - <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+26"/> - <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/> - <source>%1 matches newline characters</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1 and %2 match the start and end of a line.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Matches are case insensitive</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Whitespace characters are removed, except when they appear in character classes</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+99"/> - <source>%1 is an invalid regular expression pattern: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+30"/> - <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/> - <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/> - <source>It will not be possible to retrieve %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/> - <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/> - <source>The default collection is undefined</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>%1 cannot be retrieved</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/> - <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/> - <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>%1 is not a whole number of minutes.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/> - <source>Required cardinality is %1; got cardinality %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/> - <source>The item %1 did not match the required type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/> - <location line="+7253"/> - <source>%1 is an unknown schema type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-6971"/> - <source>Only one %1 declaration can occur in the query prolog.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+188"/> - <source>The initialization of variable %1 depends on itself</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+63"/> - <source>No variable by name %1 exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/> - <source>The variable %1 is unused</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/> - <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+55"/> - <source>No function with signature %1 is available</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+72"/> - <location line="+10"/> - <source>A default namespace declaration must occur before function, variable, and option declarations.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Namespace declarations must occur before function, variable, and option declarations.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Module imports must occur before function, variable, and option declarations.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+200"/> - <source>It is not possible to redeclare prefix %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+18"/> - <source>Prefix %1 is already declared in the prolog.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+95"/> - <source>The name of an option must have a prefix. There is no default namespace for options.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+171"/> - <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>The target namespace of a %1 cannot be empty.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>The module import feature is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+52"/> - <source>No value is available for the external variable by name %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-4154"/> - <source>A construct was encountered which only is allowed in XQuery.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+118"/> - <source>A template by name %1 has already been declared.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3581"/> - <source>The keyword %1 cannot occur with any other mode name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+29"/> - <source>The value of attribute %1 must of type %2, which %3 isn't.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+75"/> - <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+312"/> - <source>A variable by name %1 has already been declared.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+135"/> - <source>A stylesheet function must have a prefixed name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+34"/> - <source>A function already exists with the signature %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+37"/> - <source>An argument by name %1 has already been declared. Every argument name must be unique.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+179"/> - <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+63"/> - <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+126"/> - <source>%1 is an invalid template mode name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+44"/> - <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+758"/> - <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+39"/> - <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+267"/> - <source>Each name of a template parameter must be unique; %1 is duplicated.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+129"/> - <source>The %1-axis is unsupported in XQuery</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1150"/> - <source>%1 is not a valid name for a processing-instruction.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-7029"/> - <source>%1 is not a valid numeric literal.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6165"/> - <source>No function by name %1 is available.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+102"/> - <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>%1 is an invalid namespace URI.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>It is not possible to bind to the prefix %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Two namespace declaration attributes have the same name: %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+89"/> - <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>An attribute by name %1 has already appeared on this element.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+61"/> - <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+458"/> - <source>The name %1 does not refer to any schema type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+145"/> - <location line="+71"/> - <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+48"/> - <source>The name of an extension expression must be in a namespace.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/> - <source>empty</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>zero or one</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>exactly one</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>one or more</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>zero or more</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/> - <source>Required type is %1, but %2 was found.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+44"/> - <source>Promoting %1 to %2 may cause loss of precision.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+49"/> - <source>The focus is undefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/> - <source>It's not possible to add attributes after any other kind of node.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>An attribute by name %1 has already been created.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/> - <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/> - <source>%1 is an unsupported encoding.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>%1 contains octets which are disallowed in the requested encoding %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+18"/> - <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/> - <source>Ambiguous rule match.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/> - <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>The prefix must be a valid %1, which %2 is not.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>The prefix %1 cannot be bound.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Only the prefix %1 can be bound to %2 and vice versa.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/> - <source>Circularity detected</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/> - <source>The parameter %1 is required, but no corresponding %2 is supplied.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-71"/> - <source>The parameter %1 is passed, but no corresponding %2 exists.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/> - <source>The URI cannot have a fragment</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/> - <source>Element %1 is not allowed at this location.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Text nodes are not allowed at this location.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Parse error: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+62"/> - <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+108"/> - <source>Unknown XSL-T attribute %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>Attribute %1 and %2 are mutually exclusive.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+166"/> - <source>In a simplified stylesheet module, attribute %1 must be present.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+72"/> - <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Element %1 must have at least one of the attributes %2 or %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+28"/> - <source>At least one mode must be specified in the %1-attribute on element %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/> - <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>The attribute %1 must appear on element %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>The element with local name %1 does not exist in XSL-T.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/> - <source>Element %1 must come last.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+24"/> - <source>At least one %1-element must occur before %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Only one %1-element can appear.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+31"/> - <source>At least one %1-element must occur inside %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+58"/> - <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+125"/> - <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+270"/> - <source>Element %1 cannot have children.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+434"/> - <source>Element %1 cannot have a sequence constructor.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+86"/> - <location line="+9"/> - <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>A parameter in a function cannot be declared to be a tunnel.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+149"/> - <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+57"/> - <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+48"/> - <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Attribute %1 cannot have the value %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+58"/> - <source>The attribute %1 can only appear on the first %2 element.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+99"/> - <source>At least one %1 element must appear as child of %2.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>VolumeSlider</name> - <message> - <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/> - <source>Muted</source> - <translation type="unfinished"></translation> - </message> + <name>QApplication</name> <message> - <location line="+5"/> - <location line="+15"/> - <source>Volume: %1%</source> - <translation type="unfinished"></translation> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation>RTL</translation> </message> </context> </TS> diff --git a/config.profiles/symbian/translations/qt_fa.ts b/config.profiles/symbian/translations/qt_fa.ts index d876a9d..386480e 100644 --- a/config.profiles/symbian/translations/qt_fa.ts +++ b/config.profiles/symbian/translations/qt_fa.ts @@ -2,8506 +2,12 @@ <!DOCTYPE TS> <TS version="2.0" language="fa"> - <context> - <name>CloseButton</name> - <message> - <source>Close Tab</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>FakeReply</name> - <message> - <source>Fake error !</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Invalid URL</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::</name> - <message> - <source>Notifications</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Music</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Video</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Communication</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Games</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accessibility</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::AudioOutput</name> - <message> - <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source> - <translation type="unfinished"></translation> - </message> - <message> - <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Revert back to device '%1'</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::Gstreamer::Backend</name> - <message> - <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. - Some video features have been disabled.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Warning: You do not seem to have the base GStreamer plugins installed. - All audio and video support has been disabled</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::Gstreamer::MediaObject</name> - <message> - <source>Cannot start playback. - -Check your GStreamer installation and make sure you -have libgstreamer-plugins-base installed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not open media source.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Invalid source type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not locate media source.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not open audio device. The device is already in use.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not decode media source.</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF</name> - <message> - <source>Audio Output</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The audio output device</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>No error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Out of memory</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Overflow</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Underflow</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Already exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Path not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>In use</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Not ready</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Access denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Disconnected</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Insufficient bandwidth</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Network unavailable</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Network communication error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Streaming not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Server alert</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Invalid protocol</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Invalid URL</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Multicast error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Proxy server error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Proxy server not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Audio output error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Video output error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Decoder error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Audio or video components could not be played</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>DRM error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Unknown error (%1)</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::AbstractMediaPlayer</name> - <message> - <source>Not ready to play</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Error opening file</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Error opening URL</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Setting volume failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Playback complete</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::AudioEqualizer</name> - <message> - <source>%1 Hz</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::AudioPlayer</name> - <message> - <source>Getting position failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Opening clip failed</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::EffectFactory</name> - <message> - <source>Enabled</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::EnvironmentalReverb</name> - <message> - <source>Decay HF ratio (%)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Decay time (ms)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Density (%)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Diffusion (%)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Reflections delay (ms)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Reflections level (mB)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Reverb delay (ms)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Reverb level (mB)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Room HF level</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Room level (mB)</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::MediaObject</name> - <message> - <source>Error opening source: type not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Error opening source: media type could not be determined</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::StereoWidening</name> - <message> - <source>Level (%)</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::VideoPlayer</name> - <message> - <source>Pause failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Seek failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Getting position failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Opening clip failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Buffering clip failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Video display error</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::VolumeSlider</name> - <message> - <source>Volume: %1%</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Muted</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3Accel</name> - <message> - <source>%1, %2 not defined</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Ambiguous %1 not handled</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3DataTable</name> - <message> - <source>True</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>False</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Insert</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Update</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Delete</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3FileDialog</name> - <message> - <source>Copy or Move a File</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Read: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Write: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>All Files (*)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Name</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Size</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Type</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Date</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Attributes</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&OK</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Look &in:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>File &name:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>File &type:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Back</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>One directory up</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Create New Folder</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>List View</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Detail View</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Preview File Info</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Preview File Contents</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Read-write</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Read-only</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Write-only</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Inaccessible</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Symlink to File</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Symlink to Directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Symlink to Special</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>File</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Dir</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Special</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Open</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Save As</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Open</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Save</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Rename</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Delete</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>R&eload</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort by &Name</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort by &Size</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort by &Date</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Unsorted</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Show &hidden files</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>the file</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>the directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>the symlink</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Delete %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Yes</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&No</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>New Folder 1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>New Folder</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>New Folder %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Find Directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Directory:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>%1 -File not found. -Check path and filename.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>All Files (*.*)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Open </source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select a Directory</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3LocalFs</name> - <message> - <source>Could not read directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not create directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not remove file or directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not rename -%1 -to -%2</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not open -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not write -%1</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3MainWindow</name> - <message> - <source>Line up</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Customize...</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3NetworkProtocol</name> - <message> - <source>Operation stopped by the user</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3ProgressDialog</name> - <message> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3TabDialog</name> - <message> - <source>OK</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Apply</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Help</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Defaults</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3TextEdit</name> - <message> - <source>&Undo</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Redo</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Cu&t</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Copy</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Paste</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Clear</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select All</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3TitleBar</name> - <message> - <source>System</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Restore up</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Minimize</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Restore down</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Maximize</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Close</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Contains commands to manipulate the window</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Puts a minimized window back to normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Moves the window out of the way</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Puts a maximized window back to normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Makes the window full screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Closes the window</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Displays the name of the window and contains controls to manipulate it</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3ToolBar</name> - <message> - <source>More...</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3UrlOperator</name> - <message> - <source>The protocol `%1' is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support listing directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support creating new directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support removing files or directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support renaming files or directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support getting files</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support putting files</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support copying or moving files or directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>(unknown)</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3Wizard</name> - <message> - <source>&Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>< &Back</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Next ></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Finish</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QAbstractSocket</name> - <message> - <source>Host not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Connection refused</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Connection timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Operation on socket is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Socket operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Socket is not connected</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Network unreachable</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QAbstractSpinBox</name> - <message> - <source>&Step up</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Step &down</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Select All</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QAccessibleButton</name> - <message> - <source>Press</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QApplication</name> - <message> - <source>QT_LAYOUT_DIRECTION</source> - <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> - <translation type="unfinished">RTL</translation> - </message> - <message> - <source>Executable '%1' requires Qt %2, found Qt %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Incompatible Qt Library Error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Activate</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Activates the program's main window</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QAxSelect</name> - <message> - <source>Select ActiveX Control</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>OK</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>COM &Object:</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QCheckBox</name> - <message> - <source>Uncheck</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Check</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Toggle</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QColorDialog</name> - <message> - <source>Hu&e:</source> - <translation>Hu&e:</translation> - </message> - <message> - <source>&Sat:</source> - <translation>&Sat:</translation> - </message> - <message> - <source>&Val:</source> - <translation>&Val:</translation> - </message> - <message> - <source>&Red:</source> - <translation>&Red:</translation> - </message> - <message> - <source>&Green:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Bl&ue:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>A&lpha channel:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select Color</source> - <translation>Select Color</translation> - </message> - <message> - <source>&Basic colors</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Custom colors</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Add to Custom Colors</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QComboBox</name> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - <message> - <source>False</source> - <translation>False</translation> - </message> - <message> - <source>True</source> - <translation>True</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - </context> - <context> - <name>QCoreApplication</name> - <message> - <source>%1: key is empty</source> - <comment>QSystemSemaphore</comment> - <translation>%1: key is empty</translation> - </message> - <message> - <source>%1: unable to make key</source> - <comment>QSystemSemaphore</comment> - <translation>%1: unable to make key</translation> - </message> - <message> - <source>%1: ftok failed</source> - <comment>QSystemSemaphore</comment> - <translation>%1: ftok failed</translation> - </message> - <message> - <source>%1: already exists</source> - <comment>QSystemSemaphore</comment> - <translation>%1: already exists</translation> - </message> - <message> - <source>%1: does not exist</source> - <comment>QSystemSemaphore</comment> - <translation>%1: does not exist</translation> - </message> - <message> - <source>%1: out of resources</source> - <comment>QSystemSemaphore</comment> - <translation>%1: out of resources</translation> - </message> - <message> - <source>%1: unknown error %2</source> - <comment>QSystemSemaphore</comment> - <translation>%1: unknown error %2</translation> - </message> - </context> - <context> - <name>QDB2Driver</name> - <message> - <source>Unable to connect</source> - <translation>Unable to connect</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - <message> - <source>Unable to set autocommit</source> - <translation>Unable to set autocommit</translation> - </message> - </context> - <context> - <name>QDB2Result</name> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - <message> - <source>Unable to bind variable</source> - <translation>Unable to bind variable</translation> - </message> - <message> - <source>Unable to fetch record %1</source> - <translation>Unable to fetch record %1</translation> - </message> - <message> - <source>Unable to fetch next</source> - <translation>Unable to fetch next</translation> - </message> - <message> - <source>Unable to fetch first</source> - <translation>Unable to fetch first</translation> - </message> - </context> - <context> - <name>QDateTimeEdit</name> - <message> - <source>AM</source> - <translation>AM</translation> - </message> - <message> - <source>am</source> - <translation>am</translation> - </message> - <message> - <source>PM</source> - <translation>PM</translation> - </message> - <message> - <source>pm</source> - <translation>pm</translation> - </message> - </context> - <context> - <name>QDial</name> - <message> - <source>QDial</source> - <translation>QDial</translation> - </message> - <message> - <source>SpeedoMeter</source> - <translation>SpeedoMeter</translation> - </message> - <message> - <source>SliderHandle</source> - <translation>SliderHandle</translation> - </message> - </context> - <context> - <name>QDialog</name> - <message> - <source>What's This?</source> - <translation>What's This?</translation> - </message> - <message> - <source>Done</source> - <translation>Done</translation> - </message> - </context> - <context> - <name>QDialogButtonBox</name> - <message> - <source>OK</source> - <translation>OK</translation> - </message> - <message> - <source>Save</source> - <translation>Save</translation> - </message> - <message> - <source>&Save</source> - <translation>&Save</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - <message> - <source>&Cancel</source> - <translation>&Cancel</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>&Close</source> - <translation>&Close</translation> - </message> - <message> - <source>Apply</source> - <translation>Apply</translation> - </message> - <message> - <source>Reset</source> - <translation>Reset</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>Don't Save</source> - <translation>Don't Save</translation> - </message> - <message> - <source>Discard</source> - <translation>Discard</translation> - </message> - <message> - <source>&Yes</source> - <translation>&Yes</translation> - </message> - <message> - <source>Yes to &All</source> - <translation>Yes to &All</translation> - </message> - <message> - <source>&No</source> - <translation>&No</translation> - </message> - <message> - <source>N&o to All</source> - <translation>N&o to All</translation> - </message> - <message> - <source>Save All</source> - <translation>Save All</translation> - </message> - <message> - <source>Abort</source> - <translation>Abort</translation> - </message> - <message> - <source>Retry</source> - <translation>Retry</translation> - </message> - <message> - <source>Ignore</source> - <translation>Ignore</translation> - </message> - <message> - <source>Restore Defaults</source> - <translation>Restore Defaults</translation> - </message> - <message> - <source>Close without Saving</source> - <translation>Close without Saving</translation> - </message> - <message> - <source>&OK</source> - <translation>&OK</translation> - </message> - </context> - <context> - <name>QDirModel</name> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Size</source> - <translation>Size</translation> - </message> - <message> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation>Kind</translation> - </message> - <message> - <source>Type</source> - <comment>All other platforms</comment> - <translation>Type</translation> - </message> - <message> - <source>Date Modified</source> - <translation>Date Modified</translation> - </message> - </context> - <context> - <name>QDockWidget</name> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Dock</source> - <translation>Dock</translation> - </message> - <message> - <source>Float</source> - <translation>Float</translation> - </message> - </context> - <context> - <name>QDoubleSpinBox</name> - <message> - <source>More</source> - <translation>More</translation> - </message> - <message> - <source>Less</source> - <translation>Less</translation> - </message> - </context> - <context> - <name>QErrorMessage</name> - <message> - <source>&Show this message again</source> - <translation>&Show this message again</translation> - </message> - <message> - <source>&OK</source> - <translation>&OK</translation> - </message> - <message> - <source>Debug Message:</source> - <translation>Debug Message:</translation> - </message> - <message> - <source>Warning:</source> - <translation>Warning:</translation> - </message> - <message> - <source>Fatal Error:</source> - <translation>Fatal Error:</translation> - </message> - </context> - <context> - <name>QFile</name> - <message> - <source>Destination file exists</source> - <translation>Destination file exists</translation> - </message> - <message> - <source>Will not rename sequential file using block copy</source> - <translation>Will not rename sequential file using block copy</translation> - </message> - <message> - <source>Cannot remove source file</source> - <translation>Cannot remove source file</translation> - </message> - <message> - <source>Cannot open %1 for input</source> - <translation>Cannot open %1 for input</translation> - </message> - <message> - <source>Cannot open for output</source> - <translation>Cannot open for output</translation> - </message> - <message> - <source>Failure to write block</source> - <translation>Failure to write block</translation> - </message> - <message> - <source>Cannot create %1 for output</source> - <translation>Cannot create %1 for output</translation> - </message> - </context> - <context> - <name>QFileDialog</name> - <message> - <source>All Files (*)</source> - <translation>All Files (*)</translation> - </message> - <message> - <source>Back</source> - <translation>Back</translation> - </message> - <message> - <source>List View</source> - <translation>List View</translation> - </message> - <message> - <source>Detail View</source> - <translation>Detail View</translation> - </message> - <message> - <source>File</source> - <translation>File</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - <message> - <source>Save As</source> - <translation>Save As</translation> - </message> - <message> - <source>&Open</source> - <translation>&Open</translation> - </message> - <message> - <source>&Save</source> - <translation>&Save</translation> - </message> - <message> - <source>Recent Places</source> - <translation>Recent Places</translation> - </message> - <message> - <source>&Rename</source> - <translation>&Rename</translation> - </message> - <message> - <source>&Delete</source> - <translation>&Delete</translation> - </message> - <message> - <source>Show &hidden files</source> - <translation>Show &hidden files</translation> - </message> - <message> - <source>New Folder</source> - <translation>New Folder</translation> - </message> - <message> - <source>Find Directory</source> - <translation>Find Directory</translation> - </message> - <message> - <source>Directories</source> - <translation>Directories</translation> - </message> - <message> - <source>All Files (*.*)</source> - <translation>All Files (*.*)</translation> - </message> - <message> - <source>Directory:</source> - <translation>Directory:</translation> - </message> - <message> - <source>%1 already exists. -Do you want to replace it?</source> - <translation>%1 already exists. -Do you want to replace it?</translation> - </message> - <message> - <source>%1 -File not found. -Please verify the correct file name was given.</source> - <translation>%1 -File not found. -Please verify the correct file name was given.</translation> - </message> - <message> - <source>My Computer</source> - <translation>My Computer</translation> - </message> - <message> - <source>Parent Directory</source> - <translation>Parent Directory</translation> - </message> - <message> - <source>Files of type:</source> - <translation>Files of type:</translation> - </message> - <message> - <source>%1 -Directory not found. -Please verify the correct directory name was given.</source> - <translation>%1 -Directory not found. -Please verify the correct directory name was given.</translation> - </message> - <message> - <source>'%1' is write protected. -Do you want to delete it anyway?</source> - <translation>'%1' is write protected. -Do you want to delete it anyway?</translation> - </message> - <message> - <source>Are sure you want to delete '%1'?</source> - <translation>Are sure you want to delete '%1'?</translation> - </message> - <message> - <source>Could not delete directory.</source> - <translation>Could not delete directory.</translation> - </message> - <message> - <source>Drive</source> - <translation>Drive</translation> - </message> - <message> - <source>File Folder</source> - <comment>Match Windows Explorer</comment> - <translation>File Folder</translation> - </message> - <message> - <source>Folder</source> - <comment>All other platforms</comment> - <translation>Folder</translation> - </message> - <message> - <source>Alias</source> - <comment>Mac OS X Finder</comment> - <translation>Alias</translation> - </message> - <message> - <source>Shortcut</source> - <comment>All other platforms</comment> - <translation>Shortcut</translation> - </message> - <message> - <source>Unknown</source> - <translation>Unknown</translation> - </message> - <message> - <source>Show </source> - <translation>Show </translation> - </message> - <message> - <source>Forward</source> - <translation>Forward</translation> - </message> - <message> - <source>&New Folder</source> - <translation>&New Folder</translation> - </message> - <message> - <source>&Choose</source> - <translation>&Choose</translation> - </message> - <message> - <source>Remove</source> - <translation>Remove</translation> - </message> - <message> - <source>File &name:</source> - <translation>File &name:</translation> - </message> - <message> - <source>Look in:</source> - <translation>Look in:</translation> - </message> - <message> - <source>Create New Folder</source> - <translation>Create New Folder</translation> - </message> - </context> - <context> - <name>QFileSystemModel</name> - <message> - <source>%1 TB</source> - <translation>%1 TB</translation> - </message> - <message> - <source>%1 GB</source> - <translation>%1 GB</translation> - </message> - <message> - <source>%1 MB</source> - <translation>%1 MB</translation> - </message> - <message> - <source>%1 KB</source> - <translation>%1 KB</translation> - </message> - <message> - <source>%1 bytes</source> - <translation>%1 bytes</translation> - </message> - <message> - <source>Invalid filename</source> - <translation>Invalid filename</translation> - </message> - <message> - <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> - <translation><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</translation> - </message> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Size</source> - <translation>Size</translation> - </message> - <message> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation>Kind</translation> - </message> - <message> - <source>Type</source> - <comment>All other platforms</comment> - <translation>Type</translation> - </message> - <message> - <source>Date Modified</source> - <translation>Date Modified</translation> - </message> - <message> - <source>My Computer</source> - <translation>My Computer</translation> - </message> - <message> - <source>Computer</source> - <translation>Computer</translation> - </message> - <message> - <source>%1 byte(s)</source> - <translation>%1 byte(s)</translation> - </message> - </context> - <context> - <name>QFontDatabase</name> - <message> - <source>Normal</source> - <translation>Normal</translation> - </message> - <message> - <source>Bold</source> - <translation>Bold</translation> - </message> - <message> - <source>Demi Bold</source> - <translation>Demi Bold</translation> - </message> - <message> - <source>Black</source> - <translation>Black</translation> - </message> - <message> - <source>Demi</source> - <translation>Demi</translation> - </message> - <message> - <source>Light</source> - <translation>Light</translation> - </message> - <message> - <source>Italic</source> - <translation>Italic</translation> - </message> - <message> - <source>Oblique</source> - <translation>Oblique</translation> - </message> - <message> - <source>Any</source> - <translation>Any</translation> - </message> - <message> - <source>Latin</source> - <translation>Latin</translation> - </message> - <message> - <source>Greek</source> - <translation>Greek</translation> - </message> - <message> - <source>Cyrillic</source> - <translation>Cyrillic</translation> - </message> - <message> - <source>Armenian</source> - <translation>Armenian</translation> - </message> - <message> - <source>Hebrew</source> - <translation>Hebrew</translation> - </message> - <message> - <source>Arabic</source> - <translation>Arabic</translation> - </message> - <message> - <source>Syriac</source> - <translation>Syriac</translation> - </message> - <message> - <source>Thaana</source> - <translation>Thaana</translation> - </message> - <message> - <source>Devanagari</source> - <translation>Devanagari</translation> - </message> - <message> - <source>Bengali</source> - <translation>Bengali</translation> - </message> - <message> - <source>Gurmukhi</source> - <translation>Gurmukhi</translation> - </message> - <message> - <source>Gujarati</source> - <translation>Gujarati</translation> - </message> - <message> - <source>Oriya</source> - <translation>Oriya</translation> - </message> - <message> - <source>Tamil</source> - <translation>Tamil</translation> - </message> - <message> - <source>Telugu</source> - <translation>Telugu</translation> - </message> - <message> - <source>Kannada</source> - <translation>Kannada</translation> - </message> - <message> - <source>Malayalam</source> - <translation>Malayalam</translation> - </message> - <message> - <source>Sinhala</source> - <translation>Sinhala</translation> - </message> - <message> - <source>Thai</source> - <translation>Thai</translation> - </message> - <message> - <source>Lao</source> - <translation>Lao</translation> - </message> - <message> - <source>Tibetan</source> - <translation>Tibetan</translation> - </message> - <message> - <source>Myanmar</source> - <translation>Myanmar</translation> - </message> - <message> - <source>Georgian</source> - <translation>Georgian</translation> - </message> - <message> - <source>Khmer</source> - <translation>Khmer</translation> - </message> - <message> - <source>Simplified Chinese</source> - <translation>Simplified Chinese</translation> - </message> - <message> - <source>Traditional Chinese</source> - <translation>Traditional Chinese</translation> - </message> - <message> - <source>Japanese</source> - <translation>Japanese</translation> - </message> - <message> - <source>Korean</source> - <translation>Korean</translation> - </message> - <message> - <source>Vietnamese</source> - <translation>Vietnamese</translation> - </message> - <message> - <source>Symbol</source> - <translation>Symbol</translation> - </message> - <message> - <source>Ogham</source> - <translation>Ogham</translation> - </message> - <message> - <source>Runic</source> - <translation>Runic</translation> - </message> - <message> - <source>N'Ko</source> - <translation>N'Ko</translation> - </message> - </context> - <context> - <name>QFontDialog</name> - <message> - <source>&Font</source> - <translation>&Font</translation> - </message> - <message> - <source>Font st&yle</source> - <translation>Font st&yle</translation> - </message> - <message> - <source>&Size</source> - <translation>&Size</translation> - </message> - <message> - <source>Effects</source> - <translation>Effects</translation> - </message> - <message> - <source>Stri&keout</source> - <translation>Stri&keout</translation> - </message> - <message> - <source>&Underline</source> - <translation>&Underline</translation> - </message> - <message> - <source>Sample</source> - <translation>Sample</translation> - </message> - <message> - <source>Select Font</source> - <translation>Select Font</translation> - </message> - <message> - <source>Wr&iting System</source> - <translation>Wr&iting System</translation> - </message> - </context> - <context> - <name>QFtp</name> - <message> - <source>Host %1 found</source> - <translation>Host %1 found</translation> - </message> - <message> - <source>Host found</source> - <translation>Host found</translation> - </message> - <message> - <source>Connected to host %1</source> - <translation>Connected to host %1</translation> - </message> - <message> - <source>Connected to host</source> - <translation>Connected to host</translation> - </message> - <message> - <source>Connection to %1 closed</source> - <translation>Connection to %1 closed</translation> - </message> - <message> - <source>Connection closed</source> - <translation>Connection closed</translation> - </message> - <message> - <source>Host %1 not found</source> - <translation>Host %1 not found</translation> - </message> - <message> - <source>Connection refused to host %1</source> - <translation>Connection refused to host %1</translation> - </message> - <message> - <source>Connection timed out to host %1</source> - <translation>Connection timed out to host %1</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>Connecting to host failed: -%1</source> - <translation>Connecting to host failed: -%1</translation> - </message> - <message> - <source>Login failed: -%1</source> - <translation>Login failed: -%1</translation> - </message> - <message> - <source>Listing directory failed: -%1</source> - <translation>Listing directory failed: -%1</translation> - </message> - <message> - <source>Changing directory failed: -%1</source> - <translation>Changing directory failed: -%1</translation> - </message> - <message> - <source>Downloading file failed: -%1</source> - <translation>Downloading file failed: -%1</translation> - </message> - <message> - <source>Uploading file failed: -%1</source> - <translation>Uploading file failed: -%1</translation> - </message> - <message> - <source>Removing file failed: -%1</source> - <translation>Removing file failed: -%1</translation> - </message> - <message> - <source>Creating directory failed: -%1</source> - <translation>Creating directory failed: -%1</translation> - </message> - <message> - <source>Removing directory failed: -%1</source> - <translation>Removing directory failed: -%1</translation> - </message> - <message> - <source>Not connected</source> - <translation>Not connected</translation> - </message> - <message> - <source>Connection refused for data connection</source> - <translation>Connection refused for data connection</translation> - </message> - </context> - <context> - <name>QHostInfo</name> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - </context> - <context> - <name>QHostInfoAgent</name> - <message> - <source>Host not found</source> - <translation>Host not found</translation> - </message> - <message> - <source>Unknown address type</source> - <translation>Unknown address type</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>No host name given</source> - <translation>No host name given</translation> - </message> - <message> - <source>Invalid hostname</source> - <translation>Invalid hostname</translation> - </message> - </context> - <context> - <name>QHttp</name> - <message> - <source>Connection refused</source> - <translation>Connection refused</translation> - </message> - <message> - <source>Host %1 not found</source> - <translation>Host %1 not found</translation> - </message> - <message> - <source>Wrong content length</source> - <translation>Wrong content length</translation> - </message> - <message> - <source>HTTP request failed</source> - <translation>HTTP request failed</translation> - </message> - <message> - <source>Host %1 found</source> - <translation>Host %1 found</translation> - </message> - <message> - <source>Host found</source> - <translation>Host found</translation> - </message> - <message> - <source>Connected to host %1</source> - <translation>Connected to host %1</translation> - </message> - <message> - <source>Connected to host</source> - <translation>Connected to host</translation> - </message> - <message> - <source>Connection to %1 closed</source> - <translation>Connection to %1 closed</translation> - </message> - <message> - <source>Connection closed</source> - <translation>Connection closed</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>Request aborted</source> - <translation>Request aborted</translation> - </message> - <message> - <source>No server set to connect to</source> - <translation>No server set to connect to</translation> - </message> - <message> - <source>Server closed connection unexpectedly</source> - <translation>Server closed connection unexpectedly</translation> - </message> - <message> - <source>Invalid HTTP response header</source> - <translation>Invalid HTTP response header</translation> - </message> - <message> - <source>Unknown authentication method</source> - <translation>Unknown authentication method</translation> - </message> - <message> - <source>Invalid HTTP chunked body</source> - <translation>Invalid HTTP chunked body</translation> - </message> - <message> - <source>Error writing response to device</source> - <translation>Error writing response to device</translation> - </message> - <message> - <source>Proxy authentication required</source> - <translation>Proxy authentication required</translation> - </message> - <message> - <source>Authentication required</source> - <translation>Authentication required</translation> - </message> - <message> - <source>Proxy requires authentication</source> - <translation>Proxy requires authentication</translation> - </message> - <message> - <source>Host requires authentication</source> - <translation>Host requires authentication</translation> - </message> - <message> - <source>Data corrupted</source> - <translation>Data corrupted</translation> - </message> - <message> - <source>SSL handshake failed</source> - <translation>SSL handshake failed</translation> - </message> - <message> - <source>Unknown protocol specified</source> - <translation>Unknown protocol specified</translation> - </message> - <message> - <source>Connection refused (or timed out)</source> - <translation>Connection refused (or timed out)</translation> - </message> - <message> - <source>HTTPS connection requested but SSL support not compiled in</source> - <translation>HTTPS connection requested but SSL support not compiled in</translation> - </message> - </context> - <context> - <name>QHttpSocketEngine</name> - <message> - <source>Did not receive HTTP response from proxy</source> - <translation>Did not receive HTTP response from proxy</translation> - </message> - <message> - <source>Error parsing authentication request from proxy</source> - <translation>Error parsing authentication request from proxy</translation> - </message> - <message> - <source>Authentication required</source> - <translation>Authentication required</translation> - </message> - <message> - <source>Proxy denied connection</source> - <translation>Proxy denied connection</translation> - </message> - <message> - <source>Error communicating with HTTP proxy</source> - <translation>Error communicating with HTTP proxy</translation> - </message> - <message> - <source>Proxy server not found</source> - <translation>Proxy server not found</translation> - </message> - <message> - <source>Proxy connection refused</source> - <translation>Proxy connection refused</translation> - </message> - <message> - <source>Proxy server connection timed out</source> - <translation>Proxy server connection timed out</translation> - </message> - <message> - <source>Proxy connection closed prematurely</source> - <translation>Proxy connection closed prematurely</translation> - </message> - </context> - <context> - <name>QIBaseDriver</name> - <message> - <source>Error opening database</source> - <translation>Error opening database</translation> - </message> - <message> - <source>Could not start transaction</source> - <translation>Could not start transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QIBaseResult</name> - <message> - <source>Unable to create BLOB</source> - <translation>Unable to create BLOB</translation> - </message> - <message> - <source>Unable to write BLOB</source> - <translation>Unable to write BLOB</translation> - </message> - <message> - <source>Unable to open BLOB</source> - <translation>Unable to open BLOB</translation> - </message> - <message> - <source>Unable to read BLOB</source> - <translation>Unable to read BLOB</translation> - </message> - <message> - <source>Could not find array</source> - <translation>Could not find array</translation> - </message> - <message> - <source>Could not get array data</source> - <translation>Could not get array data</translation> - </message> - <message> - <source>Could not get query info</source> - <translation>Could not get query info</translation> - </message> - <message> - <source>Could not start transaction</source> - <translation>Could not start transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Could not allocate statement</source> - <translation>Could not allocate statement</translation> - </message> - <message> - <source>Could not prepare statement</source> - <translation>Could not prepare statement</translation> - </message> - <message> - <source>Could not describe input statement</source> - <translation>Could not describe input statement</translation> - </message> - <message> - <source>Could not describe statement</source> - <translation>Could not describe statement</translation> - </message> - <message> - <source>Unable to close statement</source> - <translation>Unable to close statement</translation> - </message> - <message> - <source>Unable to execute query</source> - <translation>Unable to execute query</translation> - </message> - <message> - <source>Could not fetch next item</source> - <translation>Could not fetch next item</translation> - </message> - <message> - <source>Could not get statement info</source> - <translation>Could not get statement info</translation> - </message> - </context> - <context> - <name>QIODevice</name> - <message> - <source>Permission denied</source> - <translation>Permission denied</translation> - </message> - <message> - <source>Too many open files</source> - <translation>Too many open files</translation> - </message> - <message> - <source>No such file or directory</source> - <translation>No such file or directory</translation> - </message> - <message> - <source>No space left on device</source> - <translation>No space left on device</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - </context> - <context> - <name>QInputContext</name> - <message> - <source>XIM</source> - <translation>XIM</translation> - </message> - <message> - <source>FEP</source> - <translation>FEP</translation> - </message> - <message> - <source>XIM input method</source> - <translation>XIM input method</translation> - </message> - <message> - <source>Windows input method</source> - <translation>Windows input method</translation> - </message> - <message> - <source>Mac OS X input method</source> - <translation>Mac OS X input method</translation> - </message> - <message> - <source>S60 FEP input method</source> - <translation>S60 FEP input method</translation> - </message> - </context> - <context> - <name>QInputDialog</name> - <message> - <source>Enter a value:</source> - <translation>Enter a value:</translation> - </message> - </context> - <context> - <name>QLibrary</name> - <message> - <source>Could not mmap '%1': %2</source> - <translation>Could not mmap '%1': %2</translation> - </message> - <message> - <source>Plugin verification data mismatch in '%1'</source> - <translation>Plugin verification data mismatch in '%1'</translation> - </message> - <message> - <source>Could not unmap '%1': %2</source> - <translation>Could not unmap '%1': %2</translation> - </message> - <message> - <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> - <translation>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</translation> - </message> - <message> - <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> - <translation>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>The shared library was not found.</source> - <translation>The shared library was not found.</translation> - </message> - <message> - <source>The file '%1' is not a valid Qt plugin.</source> - <translation>The file '%1' is not a valid Qt plugin.</translation> - </message> - <message> - <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> - <translation>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</translation> - </message> - <message> - <source>Cannot load library %1: %2</source> - <translation>Cannot load library %1: %2</translation> - </message> - <message> - <source>Cannot unload library %1: %2</source> - <translation>Cannot unload library %1: %2</translation> - </message> - <message> - <source>Cannot resolve symbol "%1" in %2: %3</source> - <translation>Cannot resolve symbol "%1" in %2: %3</translation> - </message> - </context> - <context> - <name>QLineEdit</name> - <message> - <source>Select All</source> - <translation>Select All</translation> - </message> - <message> - <source>&Undo</source> - <translation>&Undo</translation> - </message> - <message> - <source>&Redo</source> - <translation>&Redo</translation> - </message> - <message> - <source>Cu&t</source> - <translation>Cu&t</translation> - </message> - <message> - <source>&Copy</source> - <translation>&Copy</translation> - </message> - <message> - <source>&Paste</source> - <translation>&Paste</translation> - </message> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - </context> - <context> - <name>QLocalServer</name> - <message> - <source>%1: Name error</source> - <translation>%1: Name error</translation> - </message> - <message> - <source>%1: Permission denied</source> - <translation>%1: Permission denied</translation> - </message> - <message> - <source>%1: Address in use</source> - <translation>%1: Address in use</translation> - </message> - <message> - <source>%1: Unknown error %2</source> - <translation>%1: Unknown error %2</translation> - </message> - </context> - <context> - <name>QLocalSocket</name> - <message> - <source>%1: Connection refused</source> - <translation>%1: Connection refused</translation> - </message> - <message> - <source>%1: Remote closed</source> - <translation>%1: Remote closed</translation> - </message> - <message> - <source>%1: Invalid name</source> - <translation>%1: Invalid name</translation> - </message> - <message> - <source>%1: Socket access error</source> - <translation>%1: Socket access error</translation> - </message> - <message> - <source>%1: Socket resource error</source> - <translation>%1: Socket resource error</translation> - </message> - <message> - <source>%1: Socket operation timed out</source> - <translation>%1: Socket operation timed out</translation> - </message> - <message> - <source>%1: Datagram too large</source> - <translation>%1: Datagram too large</translation> - </message> - <message> - <source>%1: Connection error</source> - <translation>%1: Connection error</translation> - </message> - <message> - <source>%1: The socket operation is not supported</source> - <translation>%1: The socket operation is not supported</translation> - </message> - <message> - <source>%1: Unknown error</source> - <translation>%1: Unknown error</translation> - </message> - <message> - <source>%1: Unknown error %2</source> - <translation>%1: Unknown error %2</translation> - </message> - </context> - <context> - <name>QMYSQLDriver</name> - <message> - <source>Unable to open database '</source> - <translation>Unable to open database '</translation> - </message> - <message> - <source>Unable to connect</source> - <translation>Unable to connect</translation> - </message> - <message> - <source>Unable to begin transaction</source> - <translation>Unable to begin transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QMYSQLResult</name> - <message> - <source>Unable to fetch data</source> - <translation>Unable to fetch data</translation> - </message> - <message> - <source>Unable to execute query</source> - <translation>Unable to execute query</translation> - </message> - <message> - <source>Unable to store result</source> - <translation>Unable to store result</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - <message> - <source>Unable to reset statement</source> - <translation>Unable to reset statement</translation> - </message> - <message> - <source>Unable to bind value</source> - <translation>Unable to bind value</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - <message> - <source>Unable to bind outvalues</source> - <translation>Unable to bind outvalues</translation> - </message> - <message> - <source>Unable to store statement results</source> - <translation>Unable to store statement results</translation> - </message> - <message> - <source>Unable to execute next query</source> - <translation>Unable to execute next query</translation> - </message> - <message> - <source>Unable to store next result</source> - <translation>Unable to store next result</translation> - </message> - </context> - <context> - <name>QMdiArea</name> - <message> - <source>(Untitled)</source> - <translation>(Untitled)</translation> - </message> - </context> - <context> - <name>QMdiSubWindow</name> - <message> - <source>%1 - [%2]</source> - <translation>%1 - [%2]</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Minimize</source> - <translation>Minimize</translation> - </message> - <message> - <source>Restore Down</source> - <translation>Restore Down</translation> - </message> - <message> - <source>&Restore</source> - <translation>&Restore</translation> - </message> - <message> - <source>&Move</source> - <translation>&Move</translation> - </message> - <message> - <source>&Size</source> - <translation>&Size</translation> - </message> - <message> - <source>Mi&nimize</source> - <translation>Mi&nimize</translation> - </message> - <message> - <source>Ma&ximize</source> - <translation>Ma&ximize</translation> - </message> - <message> - <source>Stay on &Top</source> - <translation>Stay on &Top</translation> - </message> - <message> - <source>&Close</source> - <translation>&Close</translation> - </message> - <message> - <source>Maximize</source> - <translation>Maximize</translation> - </message> - <message> - <source>Unshade</source> - <translation>Unshade</translation> - </message> - <message> - <source>Shade</source> - <translation>Shade</translation> - </message> - <message> - <source>Restore</source> - <translation>Restore</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>Menu</source> - <translation>Menu</translation> - </message> - <message> - <source>- [%1]</source> - <translation>- [%1]</translation> - </message> - </context> - <context> - <name>QMenu</name> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - <message> - <source>Execute</source> - <translation>Execute</translation> - </message> - </context> - <context> - <name>QMenuBar</name> - <message> - <source>Actions</source> - <translation>Actions</translation> - </message> - </context> - <context> - <name>QMessageBox</name> - <message> - <source>OK</source> - <translation>OK</translation> - </message> - <message> - <source><h3>About Qt</h3><p>This program uses Qt version %1.</p></source> - <translation><h3>About Qt</h3><p>This program uses Qt version %1.</p></translation> - </message> - <message> - <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></translation> - </message> - <message> - <source>About Qt</source> - <translation>About Qt</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>Show Details...</source> - <translation>Show Details...</translation> - </message> - <message> - <source>Hide Details...</source> - <translation>Hide Details...</translation> - </message> - </context> - <context> - <name>QMultiInputContext</name> - <message> - <source>Select IM</source> - <translation>Select IM</translation> - </message> - </context> - <context> - <name>QMultiInputContextPlugin</name> - <message> - <source>Multiple input method switcher</source> - <translation>Multiple input method switcher</translation> - </message> - <message> - <source>Multiple input method switcher that uses the context menu of the text widgets</source> - <translation>Multiple input method switcher that uses the context menu of the text widgets</translation> - </message> - </context> - <context> - <name>QNativeSocketEngine</name> - <message> - <source>The remote host closed the connection</source> - <translation>The remote host closed the connection</translation> - </message> - <message> - <source>Network operation timed out</source> - <translation>Network operation timed out</translation> - </message> - <message> - <source>Out of resources</source> - <translation>Out of resources</translation> - </message> - <message> - <source>Unsupported socket operation</source> - <translation>Unsupported socket operation</translation> - </message> - <message> - <source>Protocol type not supported</source> - <translation>Protocol type not supported</translation> - </message> - <message> - <source>Invalid socket descriptor</source> - <translation>Invalid socket descriptor</translation> - </message> - <message> - <source>Network unreachable</source> - <translation>Network unreachable</translation> - </message> - <message> - <source>Permission denied</source> - <translation>Permission denied</translation> - </message> - <message> - <source>Connection timed out</source> - <translation>Connection timed out</translation> - </message> - <message> - <source>Connection refused</source> - <translation>Connection refused</translation> - </message> - <message> - <source>The bound address is already in use</source> - <translation>The bound address is already in use</translation> - </message> - <message> - <source>The address is not available</source> - <translation>The address is not available</translation> - </message> - <message> - <source>The address is protected</source> - <translation>The address is protected</translation> - </message> - <message> - <source>Unable to send a message</source> - <translation>Unable to send a message</translation> - </message> - <message> - <source>Unable to receive a message</source> - <translation>Unable to receive a message</translation> - </message> - <message> - <source>Unable to write</source> - <translation>Unable to write</translation> - </message> - <message> - <source>Network error</source> - <translation>Network error</translation> - </message> - <message> - <source>Another socket is already listening on the same port</source> - <translation>Another socket is already listening on the same port</translation> - </message> - <message> - <source>Unable to initialize non-blocking socket</source> - <translation>Unable to initialize non-blocking socket</translation> - </message> - <message> - <source>Unable to initialize broadcast socket</source> - <translation>Unable to initialize broadcast socket</translation> - </message> - <message> - <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> - <translation>Attempt to use IPv6 socket on a platform with no IPv6 support</translation> - </message> - <message> - <source>Host unreachable</source> - <translation>Host unreachable</translation> - </message> - <message> - <source>Datagram was too large to send</source> - <translation>Datagram was too large to send</translation> - </message> - <message> - <source>Operation on non-socket</source> - <translation>Operation on non-socket</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>The proxy type is invalid for this operation</source> - <translation>The proxy type is invalid for this operation</translation> - </message> - </context> - <context> - <name>QNetworkAccessCacheBackend</name> - <message> - <source>Error opening %1</source> - <translation>Error opening %1</translation> - </message> - </context> - <context> - <name>QNetworkAccessDebugPipeBackend</name> - <message> - <source>Write error writing to %1: %2</source> - <translation>Write error writing to %1: %2</translation> - </message> - </context> - <context> - <name>QNetworkAccessFileBackend</name> - <message> - <source>Request for opening non-local file %1</source> - <translation>Request for opening non-local file %1</translation> - </message> - <message> - <source>Error opening %1: %2</source> - <translation>Error opening %1: %2</translation> - </message> - <message> - <source>Write error writing to %1: %2</source> - <translation>Write error writing to %1: %2</translation> - </message> - <message> - <source>Cannot open %1: Path is a directory</source> - <translation>Cannot open %1: Path is a directory</translation> - </message> - <message> - <source>Read error reading from %1: %2</source> - <translation>Read error reading from %1: %2</translation> - </message> - </context> - <context> - <name>QNetworkAccessFtpBackend</name> - <message> - <source>No suitable proxy found</source> - <translation>No suitable proxy found</translation> - </message> - <message> - <source>Cannot open %1: is a directory</source> - <translation>Cannot open %1: is a directory</translation> - </message> - <message> - <source>Logging in to %1 failed: authentication required</source> - <translation>Logging in to %1 failed: authentication required</translation> - </message> - <message> - <source>Error while downloading %1: %2</source> - <translation>Error while downloading %1: %2</translation> - </message> - <message> - <source>Error while uploading %1: %2</source> - <translation>Error while uploading %1: %2</translation> - </message> - </context> - <context> - <name>QNetworkAccessHttpBackend</name> - <message> - <source>No suitable proxy found</source> - <translation>No suitable proxy found</translation> - </message> - </context> - <context> - <name>QNetworkReply</name> - <message> - <source>Error downloading %1 - server replied: %2</source> - <translation>Error downloading %1 - server replied: %2</translation> - </message> - <message> - <source>Protocol "%1" is unknown</source> - <translation>Protocol "%1" is unknown</translation> - </message> - </context> - <context> - <name>QNetworkReplyImpl</name> - <message> - <source>Operation canceled</source> - <translation>Operation canceled</translation> - </message> - </context> - <context> - <name>QOCIDriver</name> - <message> - <source>Unable to logon</source> - <translation>Unable to logon</translation> - </message> - <message> - <source>Unable to initialize</source> - <comment>QOCIDriver</comment> - <translation>Unable to initialize</translation> - </message> - <message> - <source>Unable to begin transaction</source> - <translation>Unable to begin transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QOCIResult</name> - <message> - <source>Unable to bind column for batch execute</source> - <translation>Unable to bind column for batch execute</translation> - </message> - <message> - <source>Unable to execute batch statement</source> - <translation>Unable to execute batch statement</translation> - </message> - <message> - <source>Unable to goto next</source> - <translation>Unable to goto next</translation> - </message> - <message> - <source>Unable to alloc statement</source> - <translation>Unable to alloc statement</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - <message> - <source>Unable to get statement type</source> - <translation>Unable to get statement type</translation> - </message> - <message> - <source>Unable to bind value</source> - <translation>Unable to bind value</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - </context> - <context> - <name>QODBCDriver</name> - <message> - <source>Unable to connect</source> - <translation>Unable to connect</translation> - </message> - <message> - <source>Unable to disable autocommit</source> - <translation>Unable to disable autocommit</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - <message> - <source>Unable to enable autocommit</source> - <translation>Unable to enable autocommit</translation> - </message> - <message> - <source>Unable to connect - Driver doesn't support all functionality required</source> - <translation>Unable to connect - Driver doesn't support all functionality required</translation> - </message> - </context> - <context> - <name>QODBCResult</name> - <message> - <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> - <translation>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - <message> - <source>Unable to fetch next</source> - <translation>Unable to fetch next</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - <message> - <source>Unable to bind variable</source> - <translation>Unable to bind variable</translation> - </message> - <message> - <source>Unable to fetch last</source> - <translation>Unable to fetch last</translation> - </message> - <message> - <source>Unable to fetch</source> - <translation>Unable to fetch</translation> - </message> - <message> - <source>Unable to fetch first</source> - <translation>Unable to fetch first</translation> - </message> - <message> - <source>Unable to fetch previous</source> - <translation>Unable to fetch previous</translation> - </message> - </context> - <context> - <name>QObject</name> - <message> - <source>Invalid hostname</source> - <translation>Invalid hostname</translation> - </message> - <message> - <source>Operation not supported on %1</source> - <translation>Operation not supported on %1</translation> - </message> - <message> - <source>Invalid URI: %1</source> - <translation>Invalid URI: %1</translation> - </message> - <message> - <source>Socket error on %1: %2</source> - <translation>Socket error on %1: %2</translation> - </message> - <message> - <source>Remote host closed the connection prematurely on %1</source> - <translation>Remote host closed the connection prematurely on %1</translation> - </message> - <message> - <source>No host name given</source> - <translation>No host name given</translation> - </message> - </context> - <context> - <name>QPPDOptionsModel</name> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Value</source> - <translation>Value</translation> - </message> - </context> - <context> - <name>QPSQLDriver</name> - <message> - <source>Unable to connect</source> - <translation>Unable to connect</translation> - </message> - <message> - <source>Could not begin transaction</source> - <translation>Could not begin transaction</translation> - </message> - <message> - <source>Could not commit transaction</source> - <translation>Could not commit transaction</translation> - </message> - <message> - <source>Could not rollback transaction</source> - <translation>Could not rollback transaction</translation> - </message> - <message> - <source>Unable to subscribe</source> - <translation>Unable to subscribe</translation> - </message> - <message> - <source>Unable to unsubscribe</source> - <translation>Unable to unsubscribe</translation> - </message> - </context> - <context> - <name>QPSQLResult</name> - <message> - <source>Unable to create query</source> - <translation>Unable to create query</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - </context> - <context> - <name>QPageSetupWidget</name> - <message> - <source>Centimeters (cm)</source> - <translation>Centimeters (cm)</translation> - </message> - <message> - <source>Millimeters (mm)</source> - <translation>Millimeters (mm)</translation> - </message> - <message> - <source>Inches (in)</source> - <translation>Inches (in)</translation> - </message> - <message> - <source>Points (pt)</source> - <translation>Points (pt)</translation> - </message> - <message> - <source>Form</source> - <translation>Form</translation> - </message> - <message> - <source>Paper</source> - <translation>Paper</translation> - </message> - <message> - <source>Page size:</source> - <translation>Page size:</translation> - </message> - <message> - <source>Width:</source> - <translation>Width:</translation> - </message> - <message> - <source>Height:</source> - <translation>Height:</translation> - </message> - <message> - <source>Paper source:</source> - <translation>Paper source:</translation> - </message> - <message> - <source>Orientation</source> - <translation>Orientation</translation> - </message> - <message> - <source>Portrait</source> - <translation>Portrait</translation> - </message> - <message> - <source>Landscape</source> - <translation>Landscape</translation> - </message> - <message> - <source>Reverse landscape</source> - <translation>Reverse landscape</translation> - </message> - <message> - <source>Reverse portrait</source> - <translation>Reverse portrait</translation> - </message> - <message> - <source>Margins</source> - <translation>Margins</translation> - </message> - <message> - <source>top margin</source> - <translation>top margin</translation> - </message> - <message> - <source>left margin</source> - <translation>left margin</translation> - </message> - <message> - <source>right margin</source> - <translation>right margin</translation> - </message> - <message> - <source>bottom margin</source> - <translation>bottom margin</translation> - </message> - </context> - <context> - <name>QPluginLoader</name> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>The plugin was not loaded.</source> - <translation>The plugin was not loaded.</translation> - </message> - </context> - <context> - <name>QPrintDialog</name> - <message> - <source>locally connected</source> - <translation>locally connected</translation> - </message> - <message> - <source>Aliases: %1</source> - <translation>Aliases: %1</translation> - </message> - <message> - <source>unknown</source> - <translation>unknown</translation> - </message> - <message> - <source>OK</source> - <translation>OK</translation> - </message> - <message> - <source>Print all</source> - <translation>Print all</translation> - </message> - <message> - <source>Print range</source> - <translation>Print range</translation> - </message> - <message> - <source>A0 (841 x 1189 mm)</source> - <translation>A0 (841 x 1189 mm)</translation> - </message> - <message> - <source>A1 (594 x 841 mm)</source> - <translation>A1 (594 x 841 mm)</translation> - </message> - <message> - <source>A2 (420 x 594 mm)</source> - <translation>A2 (420 x 594 mm)</translation> - </message> - <message> - <source>A3 (297 x 420 mm)</source> - <translation>A3 (297 x 420 mm)</translation> - </message> - <message> - <source>A5 (148 x 210 mm)</source> - <translation>A5 (148 x 210 mm)</translation> - </message> - <message> - <source>A6 (105 x 148 mm)</source> - <translation>A6 (105 x 148 mm)</translation> - </message> - <message> - <source>A7 (74 x 105 mm)</source> - <translation>A7 (74 x 105 mm)</translation> - </message> - <message> - <source>A8 (52 x 74 mm)</source> - <translation>A8 (52 x 74 mm)</translation> - </message> - <message> - <source>A9 (37 x 52 mm)</source> - <translation>A9 (37 x 52 mm)</translation> - </message> - <message> - <source>B0 (1000 x 1414 mm)</source> - <translation>B0 (1000 x 1414 mm)</translation> - </message> - <message> - <source>B1 (707 x 1000 mm)</source> - <translation>B1 (707 x 1000 mm)</translation> - </message> - <message> - <source>B2 (500 x 707 mm)</source> - <translation>B2 (500 x 707 mm)</translation> - </message> - <message> - <source>B3 (353 x 500 mm)</source> - <translation>B3 (353 x 500 mm)</translation> - </message> - <message> - <source>B4 (250 x 353 mm)</source> - <translation>B4 (250 x 353 mm)</translation> - </message> - <message> - <source>B6 (125 x 176 mm)</source> - <translation>B6 (125 x 176 mm)</translation> - </message> - <message> - <source>B7 (88 x 125 mm)</source> - <translation>B7 (88 x 125 mm)</translation> - </message> - <message> - <source>B8 (62 x 88 mm)</source> - <translation>B8 (62 x 88 mm)</translation> - </message> - <message> - <source>B9 (44 x 62 mm)</source> - <translation>B9 (44 x 62 mm)</translation> - </message> - <message> - <source>B10 (31 x 44 mm)</source> - <translation>B10 (31 x 44 mm)</translation> - </message> - <message> - <source>C5E (163 x 229 mm)</source> - <translation>C5E (163 x 229 mm)</translation> - </message> - <message> - <source>DLE (110 x 220 mm)</source> - <translation>DLE (110 x 220 mm)</translation> - </message> - <message> - <source>Folio (210 x 330 mm)</source> - <translation>Folio (210 x 330 mm)</translation> - </message> - <message> - <source>Ledger (432 x 279 mm)</source> - <translation>Ledger (432 x 279 mm)</translation> - </message> - <message> - <source>Tabloid (279 x 432 mm)</source> - <translation>Tabloid (279 x 432 mm)</translation> - </message> - <message> - <source>US Common #10 Envelope (105 x 241 mm)</source> - <translation>US Common #10 Envelope (105 x 241 mm)</translation> - </message> - <message> - <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> - <translation>A4 (210 x 297 mm, 8.26 x 11.7 inches)</translation> - </message> - <message> - <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> - <translation>B5 (176 x 250 mm, 6.93 x 9.84 inches)</translation> - </message> - <message> - <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> - <translation>Executive (7.5 x 10 inches, 191 x 254 mm)</translation> - </message> - <message> - <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> - <translation>Legal (8.5 x 14 inches, 216 x 356 mm)</translation> - </message> - <message> - <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> - <translation>Letter (8.5 x 11 inches, 216 x 279 mm)</translation> - </message> - <message> - <source>Print selection</source> - <translation>Print selection</translation> - </message> - <message> - <source>Print</source> - <translation>Print</translation> - </message> - <message> - <source>Print To File ...</source> - <translation>Print To File ...</translation> - </message> - <message> - <source>File %1 is not writable. -Please choose a different file name.</source> - <translation>File %1 is not writable. -Please choose a different file name.</translation> - </message> - <message> - <source>%1 already exists. -Do you want to overwrite it?</source> - <translation>%1 already exists. -Do you want to overwrite it?</translation> - </message> - <message> - <source>File exists</source> - <translation>File exists</translation> - </message> - <message> - <source><qt>Do you want to overwrite it?</qt></source> - <translation><qt>Do you want to overwrite it?</qt></translation> - </message> - <message> - <source>%1 is a directory. -Please choose a different file name.</source> - <translation>%1 is a directory. -Please choose a different file name.</translation> - </message> - <message> - <source>The 'From' value cannot be greater than the 'To' value.</source> - <translation>The 'From' value cannot be greater than the 'To' value.</translation> - </message> - <message> - <source>A0</source> - <translation>A0</translation> - </message> - <message> - <source>A1</source> - <translation>A1</translation> - </message> - <message> - <source>A2</source> - <translation>A2</translation> - </message> - <message> - <source>A3</source> - <translation>A3</translation> - </message> - <message> - <source>A4</source> - <translation>A4</translation> - </message> - <message> - <source>A5</source> - <translation>A5</translation> - </message> - <message> - <source>A6</source> - <translation>A6</translation> - </message> - <message> - <source>A7</source> - <translation>A7</translation> - </message> - <message> - <source>A8</source> - <translation>A8</translation> - </message> - <message> - <source>A9</source> - <translation>A9</translation> - </message> - <message> - <source>B0</source> - <translation>B0</translation> - </message> - <message> - <source>B1</source> - <translation>B1</translation> - </message> - <message> - <source>B2</source> - <translation>B2</translation> - </message> - <message> - <source>B3</source> - <translation>B3</translation> - </message> - <message> - <source>B4</source> - <translation>B4</translation> - </message> - <message> - <source>B5</source> - <translation>B5</translation> - </message> - <message> - <source>B6</source> - <translation>B6</translation> - </message> - <message> - <source>B7</source> - <translation>B7</translation> - </message> - <message> - <source>B8</source> - <translation>B8</translation> - </message> - <message> - <source>B9</source> - <translation>B9</translation> - </message> - <message> - <source>B10</source> - <translation>B10</translation> - </message> - <message> - <source>C5E</source> - <translation>C5E</translation> - </message> - <message> - <source>DLE</source> - <translation>DLE</translation> - </message> - <message> - <source>Executive</source> - <translation>Executive</translation> - </message> - <message> - <source>Folio</source> - <translation>Folio</translation> - </message> - <message> - <source>Ledger</source> - <translation>Ledger</translation> - </message> - <message> - <source>Legal</source> - <translation>Legal</translation> - </message> - <message> - <source>Letter</source> - <translation>Letter</translation> - </message> - <message> - <source>Tabloid</source> - <translation>Tabloid</translation> - </message> - <message> - <source>US Common #10 Envelope</source> - <translation>US Common #10 Envelope</translation> - </message> - <message> - <source>Custom</source> - <translation>Custom</translation> - </message> - <message> - <source>&Options >></source> - <translation>&Options >></translation> - </message> - <message> - <source>&Options <<</source> - <translation>&Options <<</translation> - </message> - <message> - <source>Print to File (PDF)</source> - <translation>Print to File (PDF)</translation> - </message> - <message> - <source>Print to File (Postscript)</source> - <translation>Print to File (Postscript)</translation> - </message> - <message> - <source>Local file</source> - <translation>Local file</translation> - </message> - <message> - <source>Write %1 file</source> - <translation>Write %1 file</translation> - </message> - <message> - <source>&Print</source> - <translation>&Print</translation> - </message> - </context> - <context> - <name>QPrintPreviewDialog</name> - <message> - <source>%1%</source> - <translation>%1%</translation> - </message> - <message> - <source>Print Preview</source> - <translation>Print Preview</translation> - </message> - <message> - <source>Next page</source> - <translation>Next page</translation> - </message> - <message> - <source>Previous page</source> - <translation>Previous page</translation> - </message> - <message> - <source>First page</source> - <translation>First page</translation> - </message> - <message> - <source>Last page</source> - <translation>Last page</translation> - </message> - <message> - <source>Fit width</source> - <translation>Fit width</translation> - </message> - <message> - <source>Fit page</source> - <translation>Fit page</translation> - </message> - <message> - <source>Zoom in</source> - <translation>Zoom in</translation> - </message> - <message> - <source>Zoom out</source> - <translation>Zoom out</translation> - </message> - <message> - <source>Portrait</source> - <translation>Portrait</translation> - </message> - <message> - <source>Landscape</source> - <translation>Landscape</translation> - </message> - <message> - <source>Show single page</source> - <translation>Show single page</translation> - </message> - <message> - <source>Show facing pages</source> - <translation>Show facing pages</translation> - </message> - <message> - <source>Show overview of all pages</source> - <translation>Show overview of all pages</translation> - </message> - <message> - <source>Print</source> - <translation>Print</translation> - </message> - <message> - <source>Page setup</source> - <translation>Page setup</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Export to PDF</source> - <translation>Export to PDF</translation> - </message> - <message> - <source>Export to PostScript</source> - <translation>Export to PostScript</translation> - </message> - <message> - <source>Page Setup</source> - <translation>Page Setup</translation> - </message> - </context> - <context> - <name>QPrintPropertiesWidget</name> - <message> - <source>Form</source> - <translation>Form</translation> - </message> - <message> - <source>Page</source> - <translation>Page</translation> - </message> - <message> - <source>Advanced</source> - <translation>Advanced</translation> - </message> - </context> - <context> - <name>QPrintSettingsOutput</name> - <message> - <source>Form</source> - <translation>Form</translation> - </message> - <message> - <source>Copies</source> - <translation>Copies</translation> - </message> - <message> - <source>Print range</source> - <translation>Print range</translation> - </message> - <message> - <source>Print all</source> - <translation>Print all</translation> - </message> - <message> - <source>Pages from</source> - <translation>Pages from</translation> - </message> - <message> - <source>to</source> - <translation>to</translation> - </message> - <message> - <source>Selection</source> - <translation>Selection</translation> - </message> - <message> - <source>Output Settings</source> - <translation>Output Settings</translation> - </message> - <message> - <source>Copies:</source> - <translation>Copies:</translation> - </message> - <message> - <source>Collate</source> - <translation>Collate</translation> - </message> - <message> - <source>Reverse</source> - <translation>Reverse</translation> - </message> - <message> - <source>Options</source> - <translation>Options</translation> - </message> - <message> - <source>Color Mode</source> - <translation>Color Mode</translation> - </message> - <message> - <source>Color</source> - <translation>Color</translation> - </message> - <message> - <source>Grayscale</source> - <translation>Grayscale</translation> - </message> - <message> - <source>Duplex Printing</source> - <translation>Duplex Printing</translation> - </message> - <message> - <source>None</source> - <translation>None</translation> - </message> - <message> - <source>Long side</source> - <translation>Long side</translation> - </message> - <message> - <source>Short side</source> - <translation>Short side</translation> - </message> - </context> - <context> - <name>QPrintWidget</name> - <message> - <source>Form</source> - <translation>Form</translation> - </message> - <message> - <source>Printer</source> - <translation>Printer</translation> - </message> - <message> - <source>&Name:</source> - <translation>&Name:</translation> - </message> - <message> - <source>P&roperties</source> - <translation>P&roperties</translation> - </message> - <message> - <source>Location:</source> - <translation>Location:</translation> - </message> - <message> - <source>Preview</source> - <translation>Preview</translation> - </message> - <message> - <source>Type:</source> - <translation>Type:</translation> - </message> - <message> - <source>Output &file:</source> - <translation>Output &file:</translation> - </message> - <message> - <source>...</source> - <translation>...</translation> - </message> - </context> - <context> - <name>QProcess</name> - <message> - <source>Could not open input redirection for reading</source> - <translation>Could not open input redirection for reading</translation> - </message> - <message> - <source>Could not open output redirection for writing</source> - <translation>Could not open output redirection for writing</translation> - </message> - <message> - <source>Resource error (fork failure): %1</source> - <translation>Resource error (fork failure): %1</translation> - </message> - <message> - <source>Process operation timed out</source> - <translation>Process operation timed out</translation> - </message> - <message> - <source>Error reading from process</source> - <translation>Error reading from process</translation> - </message> - <message> - <source>Error writing to process</source> - <translation>Error writing to process</translation> - </message> - <message> - <source>Process crashed</source> - <translation>Process crashed</translation> - </message> - <message> - <source>No program defined</source> - <translation>No program defined</translation> - </message> - <message> - <source>Process failed to start: %1</source> - <translation>Process failed to start: %1</translation> - </message> - </context> - <context> - <name>QProgressDialog</name> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - </context> - <context> - <name>QPushButton</name> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - </context> - <context> - <name>QRadioButton</name> - <message> - <source>Check</source> - <translation>Check</translation> - </message> - </context> - <context> - <name>QRegExp</name> - <message> - <source>no error occurred</source> - <translation>no error occurred</translation> - </message> - <message> - <source>disabled feature used</source> - <translation>disabled feature used</translation> - </message> - <message> - <source>bad char class syntax</source> - <translation>bad char class syntax</translation> - </message> - <message> - <source>bad lookahead syntax</source> - <translation>bad lookahead syntax</translation> - </message> - <message> - <source>bad repetition syntax</source> - <translation>bad repetition syntax</translation> - </message> - <message> - <source>invalid octal value</source> - <translation>invalid octal value</translation> - </message> - <message> - <source>missing left delim</source> - <translation>missing left delim</translation> - </message> - <message> - <source>unexpected end</source> - <translation>unexpected end</translation> - </message> - <message> - <source>met internal limit</source> - <translation>met internal limit</translation> - </message> - <message> - <source>invalid interval</source> - <translation>invalid interval</translation> - </message> - <message> - <source>invalid category</source> - <translation>invalid category</translation> - </message> - </context> - <context> - <name>QSQLite2Driver</name> - <message> - <source>Error opening database</source> - <translation>Error opening database</translation> - </message> - <message> - <source>Unable to begin transaction</source> - <translation>Unable to begin transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QSQLite2Result</name> - <message> - <source>Unable to fetch results</source> - <translation>Unable to fetch results</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - </context> - <context> - <name>QSQLiteDriver</name> - <message> - <source>Error opening database</source> - <translation>Error opening database</translation> - </message> - <message> - <source>Error closing database</source> - <translation>Error closing database</translation> - </message> - <message> - <source>Unable to begin transaction</source> - <translation>Unable to begin transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QSQLiteResult</name> - <message> - <source>Unable to fetch row</source> - <translation>Unable to fetch row</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - <message> - <source>Unable to reset statement</source> - <translation>Unable to reset statement</translation> - </message> - <message> - <source>Unable to bind parameters</source> - <translation>Unable to bind parameters</translation> - </message> - <message> - <source>Parameter count mismatch</source> - <translation>Parameter count mismatch</translation> - </message> - <message> - <source>No query</source> - <translation>No query</translation> - </message> - </context> - <context> - <name>QScriptBreakpointsModel</name> - <message> - <source>ID</source> - <translation>ID</translation> - </message> - <message> - <source>Location</source> - <translation>Location</translation> - </message> - <message> - <source>Condition</source> - <translation>Condition</translation> - </message> - <message> - <source>Ignore-count</source> - <translation>Ignore-count</translation> - </message> - <message> - <source>Single-shot</source> - <translation>Single-shot</translation> - </message> - <message> - <source>Hit-count</source> - <translation>Hit-count</translation> - </message> - </context> - <context> - <name>QScriptBreakpointsWidget</name> - <message> - <source>New</source> - <translation>New</translation> - </message> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - </context> - <context> - <name>QScriptDebugger</name> - <message> - <source>Go to Line</source> - <translation>Go to Line</translation> - </message> - <message> - <source>Line:</source> - <translation>Line:</translation> - </message> - <message> - <source>Interrupt</source> - <translation>Interrupt</translation> - </message> - <message> - <source>Shift+F5</source> - <translation>Shift+F5</translation> - </message> - <message> - <source>Continue</source> - <translation>Continue</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>Step Into</source> - <translation>Step Into</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>Step Over</source> - <translation>Step Over</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>Step Out</source> - <translation>Step Out</translation> - </message> - <message> - <source>Shift+F11</source> - <translation>Shift+F11</translation> - </message> - <message> - <source>Run to Cursor</source> - <translation>Run to Cursor</translation> - </message> - <message> - <source>Ctrl+F10</source> - <translation>Ctrl+F10</translation> - </message> - <message> - <source>Run to New Script</source> - <translation>Run to New Script</translation> - </message> - <message> - <source>Toggle Breakpoint</source> - <translation>Toggle Breakpoint</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>Clear Debug Output</source> - <translation>Clear Debug Output</translation> - </message> - <message> - <source>Clear Error Log</source> - <translation>Clear Error Log</translation> - </message> - <message> - <source>Clear Console</source> - <translation>Clear Console</translation> - </message> - <message> - <source>&Find in Script...</source> - <translation>&Find in Script...</translation> - </message> - <message> - <source>Ctrl+F</source> - <translation>Ctrl+F</translation> - </message> - <message> - <source>Find &Next</source> - <translation>Find &Next</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>Find &Previous</source> - <translation>Find &Previous</translation> - </message> - <message> - <source>Shift+F3</source> - <translation>Shift+F3</translation> - </message> - <message> - <source>Ctrl+G</source> - <translation>Ctrl+G</translation> - </message> - <message> - <source>Debug</source> - <translation>Debug</translation> - </message> - </context> - <context> - <name>QScriptDebuggerCodeFinderWidget</name> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Previous</source> - <translation>Previous</translation> - </message> - <message> - <source>Next</source> - <translation>Next</translation> - </message> - <message> - <source>Case Sensitive</source> - <translation>Case Sensitive</translation> - </message> - <message> - <source>Whole words</source> - <translation>Whole words</translation> - </message> - <message> - <source><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped</source> - <translation><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped</translation> - </message> - </context> - <context> - <name>QScriptDebuggerLocalsModel</name> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Value</source> - <translation>Value</translation> - </message> - </context> - <context> - <name>QScriptDebuggerStackModel</name> - <message> - <source>Level</source> - <translation>Level</translation> - </message> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Location</source> - <translation>Location</translation> - </message> - </context> - <context> - <name>QScriptEdit</name> - <message> - <source>Toggle Breakpoint</source> - <translation>Toggle Breakpoint</translation> - </message> - <message> - <source>Disable Breakpoint</source> - <translation>Disable Breakpoint</translation> - </message> - <message> - <source>Enable Breakpoint</source> - <translation>Enable Breakpoint</translation> - </message> - <message> - <source>Breakpoint Condition:</source> - <translation>Breakpoint Condition:</translation> - </message> - </context> - <context> - <name>QScriptEngineDebugger</name> - <message> - <source>Loaded Scripts</source> - <translation>Loaded Scripts</translation> - </message> - <message> - <source>Breakpoints</source> - <translation>Breakpoints</translation> - </message> - <message> - <source>Stack</source> - <translation>Stack</translation> - </message> - <message> - <source>Locals</source> - <translation>Locals</translation> - </message> - <message> - <source>Console</source> - <translation>Console</translation> - </message> - <message> - <source>Debug Output</source> - <translation>Debug Output</translation> - </message> - <message> - <source>Error Log</source> - <translation>Error Log</translation> - </message> - <message> - <source>Search</source> - <translation>Search</translation> - </message> - <message> - <source>View</source> - <translation>View</translation> - </message> - <message> - <source>Qt Script Debugger</source> - <translation>Qt Script Debugger</translation> - </message> - </context> - <context> - <name>QScriptNewBreakpointWidget</name> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - </context> - <context> - <name>QScrollBar</name> - <message> - <source>Scroll here</source> - <translation>Scroll here</translation> - </message> - <message> - <source>Left edge</source> - <translation>Left edge</translation> - </message> - <message> - <source>Top</source> - <translation>Top</translation> - </message> - <message> - <source>Right edge</source> - <translation>Right edge</translation> - </message> - <message> - <source>Bottom</source> - <translation>Bottom</translation> - </message> - <message> - <source>Page left</source> - <translation>Page left</translation> - </message> - <message> - <source>Page up</source> - <translation>Page up</translation> - </message> - <message> - <source>Page right</source> - <translation>Page right</translation> - </message> - <message> - <source>Page down</source> - <translation>Page down</translation> - </message> - <message> - <source>Scroll left</source> - <translation>Scroll left</translation> - </message> - <message> - <source>Scroll up</source> - <translation>Scroll up</translation> - </message> - <message> - <source>Scroll right</source> - <translation>Scroll right</translation> - </message> - <message> - <source>Scroll down</source> - <translation>Scroll down</translation> - </message> - <message> - <source>Line up</source> - <translation>Line up</translation> - </message> - <message> - <source>Position</source> - <translation>Position</translation> - </message> - <message> - <source>Line down</source> - <translation>Line down</translation> - </message> - </context> - <context> - <name>QSharedMemory</name> - <message> - <source>%1: create size is less then 0</source> - <translation>%1: create size is less then 0</translation> - </message> - <message> - <source>%1: unable to lock</source> - <translation>%1: unable to lock</translation> - </message> - <message> - <source>%1: unable to unlock</source> - <translation>%1: unable to unlock</translation> - </message> - <message> - <source>%1: permission denied</source> - <translation>%1: permission denied</translation> - </message> - <message> - <source>%1: already exists</source> - <translation>%1: already exists</translation> - </message> - <message> - <source>%1: doesn't exists</source> - <translation>%1: doesn't exists</translation> - </message> - <message> - <source>%1: out of resources</source> - <translation>%1: out of resources</translation> - </message> - <message> - <source>%1: unknown error %2</source> - <translation>%1: unknown error %2</translation> - </message> - <message> - <source>%1: key is empty</source> - <translation>%1: key is empty</translation> - </message> - <message> - <source>%1: ftok failed</source> - <translation>%1: ftok failed</translation> - </message> - <message> - <source>%1: unable to make key</source> - <translation>%1: unable to make key</translation> - </message> - <message> - <source>%1: doesn't exist</source> - <translation>%1: doesn't exist</translation> - </message> - <message> - <source>%1: UNIX key file doesn't exist</source> - <translation>%1: UNIX key file doesn't exist</translation> - </message> - <message> - <source>%1: system-imposed size restrictions</source> - <translation>%1: system-imposed size restrictions</translation> - </message> - <message> - <source>%1: not attached</source> - <translation>%1: not attached</translation> - </message> - <message> - <source>%1: invalid size</source> - <translation>%1: invalid size</translation> - </message> - <message> - <source>%1: key error</source> - <translation>%1: key error</translation> - </message> - <message> - <source>%1: size query failed</source> - <translation>%1: size query failed</translation> - </message> - <message> - <source>%1: unable to set key on lock</source> - <translation>%1: unable to set key on lock</translation> - </message> - </context> - <context> - <name>QShortcut</name> - <message> - <source>Space</source> - <translation>Space</translation> - </message> - <message> - <source>Esc</source> - <translation>Esc</translation> - </message> - <message> - <source>Tab</source> - <translation>Tab</translation> - </message> - <message> - <source>Backtab</source> - <translation>Backtab</translation> - </message> - <message> - <source>Backspace</source> - <translation>Backspace</translation> - </message> - <message> - <source>Return</source> - <translation>Return</translation> - </message> - <message> - <source>Enter</source> - <translation>Enter</translation> - </message> - <message> - <source>Ins</source> - <translation>Ins</translation> - </message> - <message> - <source>Del</source> - <translation>Del</translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print</source> - <translation>Print</translation> - </message> - <message> - <source>SysReq</source> - <translation>SysReq</translation> - </message> - <message> - <source>Home</source> - <translation>Home</translation> - </message> - <message> - <source>End</source> - <translation>End</translation> - </message> - <message> - <source>Left</source> - <translation>Left</translation> - </message> - <message> - <source>Up</source> - <translation>Up</translation> - </message> - <message> - <source>Right</source> - <translation>Right</translation> - </message> - <message> - <source>Down</source> - <translation>Down</translation> - </message> - <message> - <source>PgUp</source> - <translation>PgUp</translation> - </message> - <message> - <source>PgDown</source> - <translation>PgDown</translation> - </message> - <message> - <source>CapsLock</source> - <translation>CapsLock</translation> - </message> - <message> - <source>NumLock</source> - <translation>NumLock</translation> - </message> - <message> - <source>ScrollLock</source> - <translation>ScrollLock</translation> - </message> - <message> - <source>Menu</source> - <translation>Menu</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>Back</source> - <translation>Back</translation> - </message> - <message> - <source>Forward</source> - <translation>Forward</translation> - </message> - <message> - <source>Stop</source> - <translation>Stop</translation> - </message> - <message> - <source>Refresh</source> - <translation>Refresh</translation> - </message> - <message> - <source>Volume Down</source> - <translation>Volume Down</translation> - </message> - <message> - <source>Volume Mute</source> - <translation>Volume Mute</translation> - </message> - <message> - <source>Volume Up</source> - <translation>Volume Up</translation> - </message> - <message> - <source>Bass Boost</source> - <translation>Bass Boost</translation> - </message> - <message> - <source>Bass Up</source> - <translation>Bass Up</translation> - </message> - <message> - <source>Bass Down</source> - <translation>Bass Down</translation> - </message> - <message> - <source>Treble Up</source> - <translation>Treble Up</translation> - </message> - <message> - <source>Treble Down</source> - <translation>Treble Down</translation> - </message> - <message> - <source>Media Play</source> - <translation>Media Play</translation> - </message> - <message> - <source>Media Stop</source> - <translation>Media Stop</translation> - </message> - <message> - <source>Media Previous</source> - <translation>Media Previous</translation> - </message> - <message> - <source>Media Next</source> - <translation>Media Next</translation> - </message> - <message> - <source>Media Record</source> - <translation>Media Record</translation> - </message> - <message> - <source>Favorites</source> - <translation>Favorites</translation> - </message> - <message> - <source>Search</source> - <translation>Search</translation> - </message> - <message> - <source>Standby</source> - <translation>Standby</translation> - </message> - <message> - <source>Open URL</source> - <translation>Open URL</translation> - </message> - <message> - <source>Launch Mail</source> - <translation>Launch Mail</translation> - </message> - <message> - <source>Launch Media</source> - <translation>Launch Media</translation> - </message> - <message> - <source>Launch (0)</source> - <translation>Launch (0)</translation> - </message> - <message> - <source>Launch (1)</source> - <translation>Launch (1)</translation> - </message> - <message> - <source>Launch (2)</source> - <translation>Launch (2)</translation> - </message> - <message> - <source>Launch (3)</source> - <translation>Launch (3)</translation> - </message> - <message> - <source>Launch (4)</source> - <translation>Launch (4)</translation> - </message> - <message> - <source>Launch (5)</source> - <translation>Launch (5)</translation> - </message> - <message> - <source>Launch (6)</source> - <translation>Launch (6)</translation> - </message> - <message> - <source>Launch (7)</source> - <translation>Launch (7)</translation> - </message> - <message> - <source>Launch (8)</source> - <translation>Launch (8)</translation> - </message> - <message> - <source>Launch (9)</source> - <translation>Launch (9)</translation> - </message> - <message> - <source>Launch (A)</source> - <translation>Launch (A)</translation> - </message> - <message> - <source>Launch (B)</source> - <translation>Launch (B)</translation> - </message> - <message> - <source>Launch (C)</source> - <translation>Launch (C)</translation> - </message> - <message> - <source>Launch (D)</source> - <translation>Launch (D)</translation> - </message> - <message> - <source>Launch (E)</source> - <translation>Launch (E)</translation> - </message> - <message> - <source>Launch (F)</source> - <translation>Launch (F)</translation> - </message> - <message> - <source>Monitor Brightness Up</source> - <translation>Monitor Brightness Up</translation> - </message> - <message> - <source>Monitor Brightness Down</source> - <translation>Monitor Brightness Down</translation> - </message> - <message> - <source>Keyboard Light On/Off</source> - <translation>Keyboard Light On/Off</translation> - </message> - <message> - <source>Keyboard Brightness Up</source> - <translation>Keyboard Brightness Up</translation> - </message> - <message> - <source>Keyboard Brightness Down</source> - <translation>Keyboard Brightness Down</translation> - </message> - <message> - <source>Power Off</source> - <translation>Power Off</translation> - </message> - <message> - <source>Wake Up</source> - <translation>Wake Up</translation> - </message> - <message> - <source>Eject</source> - <translation>Eject</translation> - </message> - <message> - <source>Screensaver</source> - <translation>Screensaver</translation> - </message> - <message> - <source>WWW</source> - <translation>WWW</translation> - </message> - <message> - <source>Sleep</source> - <translation>Sleep</translation> - </message> - <message> - <source>LightBulb</source> - <translation>LightBulb</translation> - </message> - <message> - <source>Shop</source> - <translation>Shop</translation> - </message> - <message> - <source>History</source> - <translation>History</translation> - </message> - <message> - <source>Add Favorite</source> - <translation>Add Favorite</translation> - </message> - <message> - <source>Hot Links</source> - <translation>Hot Links</translation> - </message> - <message> - <source>Adjust Brightness</source> - <translation>Adjust Brightness</translation> - </message> - <message> - <source>Finance</source> - <translation>Finance</translation> - </message> - <message> - <source>Community</source> - <translation>Community</translation> - </message> - <message> - <source>Audio Rewind</source> - <translation>Audio Rewind</translation> - </message> - <message> - <source>Back Forward</source> - <translation>Back Forward</translation> - </message> - <message> - <source>Application Left</source> - <translation>Application Left</translation> - </message> - <message> - <source>Application Right</source> - <translation>Application Right</translation> - </message> - <message> - <source>Book</source> - <translation>Book</translation> - </message> - <message> - <source>CD</source> - <translation>CD</translation> - </message> - <message> - <source>Calculator</source> - <translation>Calculator</translation> - </message> - <message> - <source>Clear</source> - <translation>Clear</translation> - </message> - <message> - <source>Clear Grab</source> - <translation>Clear Grab</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Copy</source> - <translation>Copy</translation> - </message> - <message> - <source>Cut</source> - <translation>Cut</translation> - </message> - <message> - <source>Display</source> - <translation>Display</translation> - </message> - <message> - <source>DOS</source> - <translation>DOS</translation> - </message> - <message> - <source>Documents</source> - <translation>Documents</translation> - </message> - <message> - <source>Spreadsheet</source> - <translation>Spreadsheet</translation> - </message> - <message> - <source>Browser</source> - <translation>Browser</translation> - </message> - <message> - <source>Game</source> - <translation>Game</translation> - </message> - <message> - <source>Go</source> - <translation>Go</translation> - </message> - <message> - <source>iTouch</source> - <translation>iTouch</translation> - </message> - <message> - <source>Logoff</source> - <translation>Logoff</translation> - </message> - <message> - <source>Market</source> - <translation>Market</translation> - </message> - <message> - <source>Meeting</source> - <translation>Meeting</translation> - </message> - <message> - <source>Keyboard Menu</source> - <translation>Keyboard Menu</translation> - </message> - <message> - <source>Menu PB</source> - <translation>Menu PB</translation> - </message> - <message> - <source>My Sites</source> - <translation>My Sites</translation> - </message> - <message> - <source>News</source> - <translation>News</translation> - </message> - <message> - <source>Home Office</source> - <translation>Home Office</translation> - </message> - <message> - <source>Option</source> - <translation>Option</translation> - </message> - <message> - <source>Paste</source> - <translation>Paste</translation> - </message> - <message> - <source>Phone</source> - <translation>Phone</translation> - </message> - <message> - <source>Reply</source> - <translation>Reply</translation> - </message> - <message> - <source>Reload</source> - <translation>Reload</translation> - </message> - <message> - <source>Rotate Windows</source> - <translation>Rotate Windows</translation> - </message> - <message> - <source>Rotation PB</source> - <translation>Rotation PB</translation> - </message> - <message> - <source>Rotation KB</source> - <translation>Rotation KB</translation> - </message> - <message> - <source>Save</source> - <translation>Save</translation> - </message> - <message> - <source>Send</source> - <translation>Send</translation> - </message> - <message> - <source>Spellchecker</source> - <translation>Spellchecker</translation> - </message> - <message> - <source>Split Screen</source> - <translation>Split Screen</translation> - </message> - <message> - <source>Support</source> - <translation>Support</translation> - </message> - <message> - <source>Task Panel</source> - <translation>Task Panel</translation> - </message> - <message> - <source>Terminal</source> - <translation>Terminal</translation> - </message> - <message> - <source>Tools</source> - <translation>Tools</translation> - </message> - <message> - <source>Travel</source> - <translation>Travel</translation> - </message> - <message> - <source>Video</source> - <translation>Video</translation> - </message> - <message> - <source>Word Processor</source> - <translation>Word Processor</translation> - </message> - <message> - <source>XFer</source> - <translation>XFer</translation> - </message> - <message> - <source>Zoom In</source> - <translation>Zoom In</translation> - </message> - <message> - <source>Zoom Out</source> - <translation>Zoom Out</translation> - </message> - <message> - <source>Away</source> - <translation>Away</translation> - </message> - <message> - <source>Messenger</source> - <translation>Messenger</translation> - </message> - <message> - <source>WebCam</source> - <translation>WebCam</translation> - </message> - <message> - <source>Mail Forward</source> - <translation>Mail Forward</translation> - </message> - <message> - <source>Pictures</source> - <translation>Pictures</translation> - </message> - <message> - <source>Music</source> - <translation>Music</translation> - </message> - <message> - <source>Battery</source> - <translation>Battery</translation> - </message> - <message> - <source>Bluetooth</source> - <translation>Bluetooth</translation> - </message> - <message> - <source>Wireless</source> - <translation>Wireless</translation> - </message> - <message> - <source>Ultra Wide Band</source> - <translation>Ultra Wide Band</translation> - </message> - <message> - <source>Audio Forward</source> - <translation>Audio Forward</translation> - </message> - <message> - <source>Audio Repeat</source> - <translation>Audio Repeat</translation> - </message> - <message> - <source>Audio Random Play</source> - <translation>Audio Random Play</translation> - </message> - <message> - <source>Subtitle</source> - <translation>Subtitle</translation> - </message> - <message> - <source>Audio Cycle Track</source> - <translation>Audio Cycle Track</translation> - </message> - <message> - <source>Time</source> - <translation>Time</translation> - </message> - <message> - <source>View</source> - <translation>View</translation> - </message> - <message> - <source>Top Menu</source> - <translation>Top Menu</translation> - </message> - <message> - <source>Suspend</source> - <translation>Suspend</translation> - </message> - <message> - <source>Hibernate</source> - <translation>Hibernate</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>Page Up</source> - <translation>Page Up</translation> - </message> - <message> - <source>Page Down</source> - <translation>Page Down</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Number Lock</source> - <translation>Number Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source>Insert</source> - <translation>Insert</translation> - </message> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - <message> - <source>Escape</source> - <translation>Escape</translation> - </message> - <message> - <source>System Request</source> - <translation>System Request</translation> - </message> - <message> - <source>Select</source> - <translation>Select</translation> - </message> - <message> - <source>Yes</source> - <translation>Yes</translation> - </message> - <message> - <source>No</source> - <translation>No</translation> - </message> - <message> - <source>Context1</source> - <translation>Context1</translation> - </message> - <message> - <source>Context2</source> - <translation>Context2</translation> - </message> - <message> - <source>Context3</source> - <translation>Context3</translation> - </message> - <message> - <source>Context4</source> - <translation>Context4</translation> - </message> - <message> - <source>Call</source> - <translation>Call</translation> - </message> - <message> - <source>Hangup</source> - <translation>Hangup</translation> - </message> - <message> - <source>Flip</source> - <translation>Flip</translation> - </message> - <message> - <source>Ctrl</source> - <translation>Ctrl</translation> - </message> - <message> - <source>Shift</source> - <translation>Shift</translation> - </message> - <message> - <source>Alt</source> - <translation>Alt</translation> - </message> - <message> - <source>Meta</source> - <translation>Meta</translation> - </message> - <message> - <source>+</source> - <translation>+</translation> - </message> - <message> - <source>F%1</source> - <translation>F%1</translation> - </message> - <message> - <source>Home Page</source> - <translation>Home Page</translation> - </message> - </context> - <context> - <name>QSlider</name> - <message> - <source>Page left</source> - <translation>Page left</translation> - </message> - <message> - <source>Page up</source> - <translation>Page up</translation> - </message> - <message> - <source>Position</source> - <translation>Position</translation> - </message> - <message> - <source>Page right</source> - <translation>Page right</translation> - </message> - <message> - <source>Page down</source> - <translation>Page down</translation> - </message> - </context> - <context> - <name>QSocks5SocketEngine</name> - <message> - <source>Connection to proxy refused</source> - <translation>Connection to proxy refused</translation> - </message> - <message> - <source>Connection to proxy closed prematurely</source> - <translation>Connection to proxy closed prematurely</translation> - </message> - <message> - <source>Proxy host not found</source> - <translation>Proxy host not found</translation> - </message> - <message> - <source>Connection to proxy timed out</source> - <translation>Connection to proxy timed out</translation> - </message> - <message> - <source>Proxy authentication failed</source> - <translation>Proxy authentication failed</translation> - </message> - <message> - <source>Proxy authentication failed: %1</source> - <translation>Proxy authentication failed: %1</translation> - </message> - <message> - <source>SOCKS version 5 protocol error</source> - <translation>SOCKS version 5 protocol error</translation> - </message> - <message> - <source>General SOCKSv5 server failure</source> - <translation>General SOCKSv5 server failure</translation> - </message> - <message> - <source>Connection not allowed by SOCKSv5 server</source> - <translation>Connection not allowed by SOCKSv5 server</translation> - </message> - <message> - <source>TTL expired</source> - <translation>TTL expired</translation> - </message> - <message> - <source>SOCKSv5 command not supported</source> - <translation>SOCKSv5 command not supported</translation> - </message> - <message> - <source>Address type not supported</source> - <translation>Address type not supported</translation> - </message> - <message> - <source>Unknown SOCKSv5 proxy error code 0x%1</source> - <translation>Unknown SOCKSv5 proxy error code 0x%1</translation> - </message> - <message> - <source>Network operation timed out</source> - <translation>Network operation timed out</translation> - </message> - </context> - <context> - <name>QSoftKeyManager</name> - <message> - <source>Ok</source> - <translation>Ok</translation> - </message> - <message> - <source>Select</source> - <translation>Select</translation> - </message> - <message> - <source>Done</source> - <translation>Done</translation> - </message> - <message> - <source>Options</source> - <translation>Options</translation> - </message> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - <message> - <source>Exit</source> - <translation>Exit</translation> - </message> - </context> - <context> - <name>QSpinBox</name> - <message> - <source>More</source> - <translation>More</translation> - </message> - <message> - <source>Less</source> - <translation>Less</translation> - </message> - </context> - <context> - <name>QSql</name> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - <message> - <source>Delete this record?</source> - <translation>Delete this record?</translation> - </message> - <message> - <source>Yes</source> - <translation>Yes</translation> - </message> - <message> - <source>No</source> - <translation>No</translation> - </message> - <message> - <source>Insert</source> - <translation>Insert</translation> - </message> - <message> - <source>Update</source> - <translation>Update</translation> - </message> - <message> - <source>Save edits?</source> - <translation>Save edits?</translation> - </message> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - <message> - <source>Confirm</source> - <translation>Confirm</translation> - </message> - <message> - <source>Cancel your edits?</source> - <translation>Cancel your edits?</translation> - </message> - </context> - <context> - <name>QSslSocket</name> - <message> - <source>Unable to write data: %1</source> - <translation>Unable to write data: %1</translation> - </message> - <message> - <source>Unable to decrypt data: %1</source> - <translation>Unable to decrypt data: %1</translation> - </message> - <message> - <source>Error while reading: %1</source> - <translation>Error while reading: %1</translation> - </message> - <message> - <source>Error during SSL handshake: %1</source> - <translation>Error during SSL handshake: %1</translation> - </message> - <message> - <source>Error creating SSL context (%1)</source> - <translation>Error creating SSL context (%1)</translation> - </message> - <message> - <source>Invalid or empty cipher list (%1)</source> - <translation>Invalid or empty cipher list (%1)</translation> - </message> - <message> - <source>Private key does not certify public key, %1</source> - <translation>Private key does not certify public key, %1</translation> - </message> - <message> - <source>Error creating SSL session, %1</source> - <translation>Error creating SSL session, %1</translation> - </message> - <message> - <source>Error creating SSL session: %1</source> - <translation>Error creating SSL session: %1</translation> - </message> - <message> - <source>Cannot provide a certificate with no key, %1</source> - <translation>Cannot provide a certificate with no key, %1</translation> - </message> - <message> - <source>Error loading local certificate, %1</source> - <translation>Error loading local certificate, %1</translation> - </message> - <message> - <source>Error loading private key, %1</source> - <translation>Error loading private key, %1</translation> - </message> - <message> - <source>No error</source> - <translation>No error</translation> - </message> - <message> - <source>The issuer certificate could not be found</source> - <translation>The issuer certificate could not be found</translation> - </message> - <message> - <source>The certificate signature could not be decrypted</source> - <translation>The certificate signature could not be decrypted</translation> - </message> - <message> - <source>The public key in the certificate could not be read</source> - <translation>The public key in the certificate could not be read</translation> - </message> - <message> - <source>The signature of the certificate is invalid</source> - <translation>The signature of the certificate is invalid</translation> - </message> - <message> - <source>The certificate is not yet valid</source> - <translation>The certificate is not yet valid</translation> - </message> - <message> - <source>The certificate has expired</source> - <translation>The certificate has expired</translation> - </message> - <message> - <source>The certificate's notBefore field contains an invalid time</source> - <translation>The certificate's notBefore field contains an invalid time</translation> - </message> - <message> - <source>The certificate's notAfter field contains an invalid time</source> - <translation>The certificate's notAfter field contains an invalid time</translation> - </message> - <message> - <source>The certificate is self-signed, and untrusted</source> - <translation>The certificate is self-signed, and untrusted</translation> - </message> - <message> - <source>The root certificate of the certificate chain is self-signed, and untrusted</source> - <translation>The root certificate of the certificate chain is self-signed, and untrusted</translation> - </message> - <message> - <source>The issuer certificate of a locally looked up certificate could not be found</source> - <translation>The issuer certificate of a locally looked up certificate could not be found</translation> - </message> - <message> - <source>No certificates could be verified</source> - <translation>No certificates could be verified</translation> - </message> - <message> - <source>One of the CA certificates is invalid</source> - <translation>One of the CA certificates is invalid</translation> - </message> - <message> - <source>The basicConstraints path length parameter has been exceeded</source> - <translation>The basicConstraints path length parameter has been exceeded</translation> - </message> - <message> - <source>The supplied certificate is unsuitable for this purpose</source> - <translation>The supplied certificate is unsuitable for this purpose</translation> - </message> - <message> - <source>The root CA certificate is not trusted for this purpose</source> - <translation>The root CA certificate is not trusted for this purpose</translation> - </message> - <message> - <source>The root CA certificate is marked to reject the specified purpose</source> - <translation>The root CA certificate is marked to reject the specified purpose</translation> - </message> - <message> - <source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source> - <translation>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</translation> - </message> - <message> - <source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source> - <translation>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</translation> - </message> - <message> - <source>The peer did not present any certificate</source> - <translation>The peer did not present any certificate</translation> - </message> - <message> - <source>The host name did not match any of the valid hosts for this certificate</source> - <translation>The host name did not match any of the valid hosts for this certificate</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - </context> - <context> - <name>QStateMachine</name> - <message> - <source>Missing initial state in compound state '%1'</source> - <translation>Missing initial state in compound state '%1'</translation> - </message> - <message> - <source>Missing default state in history state '%1'</source> - <translation>Missing default state in history state '%1'</translation> - </message> - <message> - <source>No common ancestor for targets and source of transition from state '%1'</source> - <translation>No common ancestor for targets and source of transition from state '%1'</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - </context> - <context> - <name>QSystemSemaphore</name> - <message> - <source>%1: does not exist</source> - <translation>%1: does not exist</translation> - </message> - <message> - <source>%1: out of resources</source> - <translation>%1: out of resources</translation> - </message> - <message> - <source>%1: permission denied</source> - <translation>%1: permission denied</translation> - </message> - <message> - <source>%1: already exists</source> - <translation>%1: already exists</translation> - </message> - <message> - <source>%1: unknown error %2</source> - <translation>%1: unknown error %2</translation> - </message> - </context> - <context> - <name>QTDSDriver</name> - <message> - <source>Unable to open connection</source> - <translation>Unable to open connection</translation> - </message> - <message> - <source>Unable to use database</source> - <translation>Unable to use database</translation> - </message> - </context> - <context> - <name>QTabBar</name> - <message> - <source>Scroll Left</source> - <translation>Scroll Left</translation> - </message> - <message> - <source>Scroll Right</source> - <translation>Scroll Right</translation> - </message> - </context> - <context> - <name>QTcpServer</name> - <message> - <source>Operation on socket is not supported</source> - <translation>Operation on socket is not supported</translation> - </message> - </context> - <context> - <name>QTextControl</name> - <message> - <source>&Undo</source> - <translation>&Undo</translation> - </message> - <message> - <source>&Redo</source> - <translation>&Redo</translation> - </message> - <message> - <source>Cu&t</source> - <translation>Cu&t</translation> - </message> - <message> - <source>&Copy</source> - <translation>&Copy</translation> - </message> - <message> - <source>Copy &Link Location</source> - <translation>Copy &Link Location</translation> - </message> - <message> - <source>&Paste</source> - <translation>&Paste</translation> - </message> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - <message> - <source>Select All</source> - <translation>Select All</translation> - </message> - </context> - <context> - <name>QToolButton</name> - <message> - <source>Press</source> - <translation>Press</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - </context> - <context> - <name>QUdpSocket</name> - <message> - <source>This platform does not support IPv6</source> - <translation>This platform does not support IPv6</translation> - </message> - </context> - <context> - <name>QUndoGroup</name> - <message> - <source>Undo</source> - <translation>Undo</translation> - </message> - <message> - <source>Redo</source> - <translation>Redo</translation> - </message> - </context> - <context> - <name>QUndoModel</name> - <message> - <source><empty></source> - <translation><empty></translation> - </message> - </context> - <context> - <name>QUndoStack</name> - <message> - <source>Undo</source> - <translation>Undo</translation> - </message> - <message> - <source>Redo</source> - <translation>Redo</translation> - </message> - </context> - <context> - <name>QUnicodeControlCharacterMenu</name> - <message> - <source>LRM Left-to-right mark</source> - <translation>LRM Left-to-right mark</translation> - </message> - <message> - <source>RLM Right-to-left mark</source> - <translation>RLM Right-to-left mark</translation> - </message> - <message> - <source>ZWJ Zero width joiner</source> - <translation>ZWJ Zero width joiner</translation> - </message> - <message> - <source>ZWNJ Zero width non-joiner</source> - <translation>ZWNJ Zero width non-joiner</translation> - </message> - <message> - <source>ZWSP Zero width space</source> - <translation>ZWSP Zero width space</translation> - </message> - <message> - <source>LRE Start of left-to-right embedding</source> - <translation>LRE Start of left-to-right embedding</translation> - </message> - <message> - <source>RLE Start of right-to-left embedding</source> - <translation>RLE Start of right-to-left embedding</translation> - </message> - <message> - <source>LRO Start of left-to-right override</source> - <translation>LRO Start of left-to-right override</translation> - </message> - <message> - <source>RLO Start of right-to-left override</source> - <translation>RLO Start of right-to-left override</translation> - </message> - <message> - <source>PDF Pop directional formatting</source> - <translation>PDF Pop directional formatting</translation> - </message> - <message> - <source>Insert Unicode control character</source> - <translation>Insert Unicode control character</translation> - </message> - </context> - <context> - <name>QWebFrame</name> - <message> - <source>Request cancelled</source> - <translation>Request cancelled</translation> - </message> - <message> - <source>Request blocked</source> - <translation>Request blocked</translation> - </message> - <message> - <source>Cannot show URL</source> - <translation>Cannot show URL</translation> - </message> - <message> - <source>Frame load interrupted by policy change</source> - <translation>Frame load interrupted by policy change</translation> - </message> - <message> - <source>Cannot show mimetype</source> - <translation>Cannot show mimetype</translation> - </message> - <message> - <source>File does not exist</source> - <translation>File does not exist</translation> - </message> - </context> - <context> - <name>QWebPage</name> - <message> - <source>Submit</source> - <comment>default label for Submit buttons in forms on web pages</comment> - <translation>Submit</translation> - </message> - <message> - <source>Submit</source> - <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment> - <translation>Submit</translation> - </message> - <message> - <source>Reset</source> - <comment>default label for Reset buttons in forms on web pages</comment> - <translation>Reset</translation> - </message> - <message> - <source>Choose File</source> - <comment>title for file button used in HTML forms</comment> - <translation>Choose File</translation> - </message> - <message> - <source>No file selected</source> - <comment>text to display in file button used in HTML forms when no file is selected</comment> - <translation>No file selected</translation> - </message> - <message> - <source>Open in New Window</source> - <comment>Open in New Window context menu item</comment> - <translation>Open in New Window</translation> - </message> - <message> - <source>Save Link...</source> - <comment>Download Linked File context menu item</comment> - <translation>Save Link...</translation> - </message> - <message> - <source>Copy Link</source> - <comment>Copy Link context menu item</comment> - <translation>Copy Link</translation> - </message> - <message> - <source>Open Image</source> - <comment>Open Image in New Window context menu item</comment> - <translation>Open Image</translation> - </message> - <message> - <source>Save Image</source> - <comment>Download Image context menu item</comment> - <translation>Save Image</translation> - </message> - <message> - <source>Copy Image</source> - <comment>Copy Link context menu item</comment> - <translation>Copy Image</translation> - </message> - <message> - <source>Open Frame</source> - <comment>Open Frame in New Window context menu item</comment> - <translation>Open Frame</translation> - </message> - <message> - <source>Copy</source> - <comment>Copy context menu item</comment> - <translation>Copy</translation> - </message> - <message> - <source>Go Back</source> - <comment>Back context menu item</comment> - <translation>Go Back</translation> - </message> - <message> - <source>Go Forward</source> - <comment>Forward context menu item</comment> - <translation>Go Forward</translation> - </message> - <message> - <source>Stop</source> - <comment>Stop context menu item</comment> - <translation>Stop</translation> - </message> - <message> - <source>Reload</source> - <comment>Reload context menu item</comment> - <translation>Reload</translation> - </message> - <message> - <source>Cut</source> - <comment>Cut context menu item</comment> - <translation>Cut</translation> - </message> - <message> - <source>Paste</source> - <comment>Paste context menu item</comment> - <translation>Paste</translation> - </message> - <message> - <source>No Guesses Found</source> - <comment>No Guesses Found context menu item</comment> - <translation>No Guesses Found</translation> - </message> - <message> - <source>Ignore</source> - <comment>Ignore Spelling context menu item</comment> - <translation>Ignore</translation> - </message> - <message> - <source>Add To Dictionary</source> - <comment>Learn Spelling context menu item</comment> - <translation>Add To Dictionary</translation> - </message> - <message> - <source>Search The Web</source> - <comment>Search The Web context menu item</comment> - <translation>Search The Web</translation> - </message> - <message> - <source>Look Up In Dictionary</source> - <comment>Look Up in Dictionary context menu item</comment> - <translation>Look Up In Dictionary</translation> - </message> - <message> - <source>Open Link</source> - <comment>Open Link context menu item</comment> - <translation>Open Link</translation> - </message> - <message> - <source>Ignore</source> - <comment>Ignore Grammar context menu item</comment> - <translation>Ignore</translation> - </message> - <message> - <source>Spelling</source> - <comment>Spelling and Grammar context sub-menu item</comment> - <translation>Spelling</translation> - </message> - <message> - <source>Show Spelling and Grammar</source> - <comment>menu item title</comment> - <translation>Show Spelling and Grammar</translation> - </message> - <message> - <source>Hide Spelling and Grammar</source> - <comment>menu item title</comment> - <translation>Hide Spelling and Grammar</translation> - </message> - <message> - <source>Check Spelling</source> - <comment>Check spelling context menu item</comment> - <translation>Check Spelling</translation> - </message> - <message> - <source>Check Spelling While Typing</source> - <comment>Check spelling while typing context menu item</comment> - <translation>Check Spelling While Typing</translation> - </message> - <message> - <source>Check Grammar With Spelling</source> - <comment>Check grammar with spelling context menu item</comment> - <translation>Check Grammar With Spelling</translation> - </message> - <message> - <source>Fonts</source> - <comment>Font context sub-menu item</comment> - <translation>Fonts</translation> - </message> - <message> - <source>Bold</source> - <comment>Bold context menu item</comment> - <translation>Bold</translation> - </message> - <message> - <source>Italic</source> - <comment>Italic context menu item</comment> - <translation>Italic</translation> - </message> - <message> - <source>Underline</source> - <comment>Underline context menu item</comment> - <translation>Underline</translation> - </message> - <message> - <source>Outline</source> - <comment>Outline context menu item</comment> - <translation>Outline</translation> - </message> - <message> - <source>Direction</source> - <comment>Writing direction context sub-menu item</comment> - <translation>Direction</translation> - </message> - <message> - <source>Text Direction</source> - <comment>Text direction context sub-menu item</comment> - <translation>Text Direction</translation> - </message> - <message> - <source>Default</source> - <comment>Default writing direction context menu item</comment> - <translation>Default</translation> - </message> - <message> - <source>Left to Right</source> - <comment>Left to Right context menu item</comment> - <translation>Left to Right</translation> - </message> - <message> - <source>Right to Left</source> - <comment>Right to Left context menu item</comment> - <translation>Right to Left</translation> - </message> - <message> - <source>Loading...</source> - <comment>Media controller status message when the media is loading</comment> - <translation>Loading...</translation> - </message> - <message> - <source>Live Broadcast</source> - <comment>Media controller status message when watching a live broadcast</comment> - <translation>Live Broadcast</translation> - </message> - <message> - <source>Audio Element</source> - <comment>Media controller element</comment> - <translation>Audio Element</translation> - </message> - <message> - <source>Video Element</source> - <comment>Media controller element</comment> - <translation>Video Element</translation> - </message> - <message> - <source>Mute Button</source> - <comment>Media controller element</comment> - <translation>Mute Button</translation> - </message> - <message> - <source>Unmute Button</source> - <comment>Media controller element</comment> - <translation>Unmute Button</translation> - </message> - <message> - <source>Play Button</source> - <comment>Media controller element</comment> - <translation>Play Button</translation> - </message> - <message> - <source>Pause Button</source> - <comment>Media controller element</comment> - <translation>Pause Button</translation> - </message> - <message> - <source>Slider</source> - <comment>Media controller element</comment> - <translation>Slider</translation> - </message> - <message> - <source>Slider Thumb</source> - <comment>Media controller element</comment> - <translation>Slider Thumb</translation> - </message> - <message> - <source>Rewind Button</source> - <comment>Media controller element</comment> - <translation>Rewind Button</translation> - </message> - <message> - <source>Return to Real-time Button</source> - <comment>Media controller element</comment> - <translation>Return to Real-time Button</translation> - </message> - <message> - <source>Elapsed Time</source> - <comment>Media controller element</comment> - <translation>Elapsed Time</translation> - </message> - <message> - <source>Remaining Time</source> - <comment>Media controller element</comment> - <translation>Remaining Time</translation> - </message> - <message> - <source>Status Display</source> - <comment>Media controller element</comment> - <translation>Status Display</translation> - </message> - <message> - <source>Fullscreen Button</source> - <comment>Media controller element</comment> - <translation>Fullscreen Button</translation> - </message> - <message> - <source>Seek Forward Button</source> - <comment>Media controller element</comment> - <translation>Seek Forward Button</translation> - </message> - <message> - <source>Seek Back Button</source> - <comment>Media controller element</comment> - <translation>Seek Back Button</translation> - </message> - <message> - <source>Audio element playback controls and status display</source> - <comment>Media controller element</comment> - <translation>Audio element playback controls and status display</translation> - </message> - <message> - <source>Video element playback controls and status display</source> - <comment>Media controller element</comment> - <translation>Video element playback controls and status display</translation> - </message> - <message> - <source>Mute audio tracks</source> - <comment>Media controller element</comment> - <translation>Mute audio tracks</translation> - </message> - <message> - <source>Unmute audio tracks</source> - <comment>Media controller element</comment> - <translation>Unmute audio tracks</translation> - </message> - <message> - <source>Begin playback</source> - <comment>Media controller element</comment> - <translation>Begin playback</translation> - </message> - <message> - <source>Pause playback</source> - <comment>Media controller element</comment> - <translation>Pause playback</translation> - </message> - <message> - <source>Movie time scrubber</source> - <comment>Media controller element</comment> - <translation>Movie time scrubber</translation> - </message> - <message> - <source>Movie time scrubber thumb</source> - <comment>Media controller element</comment> - <translation>Movie time scrubber thumb</translation> - </message> - <message> - <source>Rewind movie</source> - <comment>Media controller element</comment> - <translation>Rewind movie</translation> - </message> - <message> - <source>Return streaming movie to real-time</source> - <comment>Media controller element</comment> - <translation>Return streaming movie to real-time</translation> - </message> - <message> - <source>Current movie time</source> - <comment>Media controller element</comment> - <translation>Current movie time</translation> - </message> - <message> - <source>Remaining movie time</source> - <comment>Media controller element</comment> - <translation>Remaining movie time</translation> - </message> - <message> - <source>Current movie status</source> - <comment>Media controller element</comment> - <translation>Current movie status</translation> - </message> - <message> - <source>Play movie in full-screen mode</source> - <comment>Media controller element</comment> - <translation>Play movie in full-screen mode</translation> - </message> - <message> - <source>Seek quickly back</source> - <comment>Media controller element</comment> - <translation>Seek quickly back</translation> - </message> - <message> - <source>Seek quickly forward</source> - <comment>Media controller element</comment> - <translation>Seek quickly forward</translation> - </message> - <message> - <source>Indefinite time</source> - <comment>Media time description</comment> - <translation>Indefinite time</translation> - </message> - <message> - <source>%1 days %2 hours %3 minutes %4 seconds</source> - <comment>Media time description</comment> - <translation>%1 days %2 hours %3 minutes %4 seconds</translation> - </message> - <message> - <source>%1 hours %2 minutes %3 seconds</source> - <comment>Media time description</comment> - <translation>%1 hours %2 minutes %3 seconds</translation> - </message> - <message> - <source>%1 minutes %2 seconds</source> - <comment>Media time description</comment> - <translation>%1 minutes %2 seconds</translation> - </message> - <message> - <source>%1 seconds</source> - <comment>Media time description</comment> - <translation>%1 seconds</translation> - </message> - <message> - <source>Inspect</source> - <comment>Inspect Element context menu item</comment> - <translation>Inspect</translation> - </message> - <message> - <source>No recent searches</source> - <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> - <translation>No recent searches</translation> - </message> - <message> - <source>Recent searches</source> - <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> - <translation>Recent searches</translation> - </message> - <message> - <source>Clear recent searches</source> - <comment>menu item in Recent Searches menu that empties menu's contents</comment> - <translation>Clear recent searches</translation> - </message> - <message> - <source>Unknown</source> - <comment>Unknown filesize FTP directory listing item</comment> - <translation>Unknown</translation> - </message> - <message> - <source>Web Inspector - %2</source> - <translation>Web Inspector - %2</translation> - </message> - <message> - <source>%1 (%2x%3 pixels)</source> - <comment>Title string for images</comment> - <translation>%1 (%2x%3 pixels)</translation> - </message> - <message> - <source>Bad HTTP request</source> - <translation>Bad HTTP request</translation> - </message> - <message> - <source>This is a searchable index. Enter search keywords: </source> - <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> - <translation>This is a searchable index. Enter search keywords: </translation> - </message> - <message> - <source>Scroll here</source> - <translation>Scroll here</translation> - </message> - <message> - <source>Left edge</source> - <translation>Left edge</translation> - </message> - <message> - <source>Top</source> - <translation>Top</translation> - </message> - <message> - <source>Right edge</source> - <translation>Right edge</translation> - </message> - <message> - <source>Bottom</source> - <translation>Bottom</translation> - </message> - <message> - <source>Page left</source> - <translation>Page left</translation> - </message> - <message> - <source>Page up</source> - <translation>Page up</translation> - </message> - <message> - <source>Page right</source> - <translation>Page right</translation> - </message> - <message> - <source>Page down</source> - <translation>Page down</translation> - </message> - <message> - <source>Scroll left</source> - <translation>Scroll left</translation> - </message> - <message> - <source>Scroll up</source> - <translation>Scroll up</translation> - </message> - <message> - <source>Scroll right</source> - <translation>Scroll right</translation> - </message> - <message> - <source>Scroll down</source> - <translation>Scroll down</translation> - </message> - <message numerus="yes"> - <source>%n file(s)</source> - <comment>number of chosen file</comment> - <translation> - <numerusform>%n file(s)</numerusform> - <numerusform>%n file(s)</numerusform> - </translation> - </message> - <message> - <source>JavaScript Alert - %1</source> - <translation>JavaScript Alert - %1</translation> - </message> - <message> - <source>JavaScript Confirm - %1</source> - <translation>JavaScript Confirm - %1</translation> - </message> - <message> - <source>JavaScript Prompt - %1</source> - <translation>JavaScript Prompt - %1</translation> - </message> - <message> - <source>JavaScript Problem - %1</source> - <translation>JavaScript Problem - %1</translation> - </message> - <message> - <source>The script on this page appears to have a problem. Do you want to stop the script?</source> - <translation>The script on this page appears to have a problem. Do you want to stop the script?</translation> - </message> - <message> - <source>Move the cursor to the next character</source> - <translation>Move the cursor to the next character</translation> - </message> - <message> - <source>Move the cursor to the previous character</source> - <translation>Move the cursor to the previous character</translation> - </message> - <message> - <source>Move the cursor to the next word</source> - <translation>Move the cursor to the next word</translation> - </message> - <message> - <source>Move the cursor to the previous word</source> - <translation>Move the cursor to the previous word</translation> - </message> - <message> - <source>Move the cursor to the next line</source> - <translation>Move the cursor to the next line</translation> - </message> - <message> - <source>Move the cursor to the previous line</source> - <translation>Move the cursor to the previous line</translation> - </message> - <message> - <source>Move the cursor to the start of the line</source> - <translation>Move the cursor to the start of the line</translation> - </message> - <message> - <source>Move the cursor to the end of the line</source> - <translation>Move the cursor to the end of the line</translation> - </message> - <message> - <source>Move the cursor to the start of the block</source> - <translation>Move the cursor to the start of the block</translation> - </message> - <message> - <source>Move the cursor to the end of the block</source> - <translation>Move the cursor to the end of the block</translation> - </message> - <message> - <source>Move the cursor to the start of the document</source> - <translation>Move the cursor to the start of the document</translation> - </message> - <message> - <source>Move the cursor to the end of the document</source> - <translation>Move the cursor to the end of the document</translation> - </message> - <message> - <source>Select all</source> - <translation>Select all</translation> - </message> - <message> - <source>Select to the next character</source> - <translation>Select to the next character</translation> - </message> - <message> - <source>Select to the previous character</source> - <translation>Select to the previous character</translation> - </message> - <message> - <source>Select to the next word</source> - <translation>Select to the next word</translation> - </message> - <message> - <source>Select to the previous word</source> - <translation>Select to the previous word</translation> - </message> - <message> - <source>Select to the next line</source> - <translation>Select to the next line</translation> - </message> - <message> - <source>Select to the previous line</source> - <translation>Select to the previous line</translation> - </message> - <message> - <source>Select to the start of the line</source> - <translation>Select to the start of the line</translation> - </message> - <message> - <source>Select to the end of the line</source> - <translation>Select to the end of the line</translation> - </message> - <message> - <source>Select to the start of the block</source> - <translation>Select to the start of the block</translation> - </message> - <message> - <source>Select to the end of the block</source> - <translation>Select to the end of the block</translation> - </message> - <message> - <source>Select to the start of the document</source> - <translation>Select to the start of the document</translation> - </message> - <message> - <source>Select to the end of the document</source> - <translation>Select to the end of the document</translation> - </message> - <message> - <source>Delete to the start of the word</source> - <translation>Delete to the start of the word</translation> - </message> - <message> - <source>Delete to the end of the word</source> - <translation>Delete to the end of the word</translation> - </message> - <message> - <source>Insert a new paragraph</source> - <translation>Insert a new paragraph</translation> - </message> - <message> - <source>Insert a new line</source> - <translation>Insert a new line</translation> - </message> - <message> - <source>Paste and Match Style</source> - <translation>Paste and Match Style</translation> - </message> - <message> - <source>Remove formatting</source> - <translation>Remove formatting</translation> - </message> - <message> - <source>Strikethrough</source> - <translation>Strikethrough</translation> - </message> - <message> - <source>Subscript</source> - <translation>Subscript</translation> - </message> - <message> - <source>Superscript</source> - <translation>Superscript</translation> - </message> - <message> - <source>Insert Bulleted List</source> - <translation>Insert Bulleted List</translation> - </message> - <message> - <source>Insert Numbered List</source> - <translation>Insert Numbered List</translation> - </message> - <message> - <source>Indent</source> - <translation>Indent</translation> - </message> - <message> - <source>Outdent</source> - <translation>Outdent</translation> - </message> - <message> - <source>Center</source> - <translation>Center</translation> - </message> - <message> - <source>Justify</source> - <translation>Justify</translation> - </message> - <message> - <source>Align Left</source> - <translation>Align Left</translation> - </message> - <message> - <source>Align Right</source> - <translation>Align Right</translation> - </message> - </context> - <context> - <name>QWhatsThisAction</name> - <message> - <source>What's This?</source> - <translation>What's This?</translation> - </message> - </context> - <context> - <name>QWidget</name> - <message> - <source>*</source> - <translation>*</translation> - </message> - </context> - <context> - <name>QWizard</name> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>< &Back</source> - <translation>< &Back</translation> - </message> - <message> - <source>&Finish</source> - <translation>&Finish</translation> - </message> - <message> - <source>&Help</source> - <translation>&Help</translation> - </message> - <message> - <source>Go Back</source> - <translation>Go Back</translation> - </message> - <message> - <source>Continue</source> - <translation>Continue</translation> - </message> - <message> - <source>Commit</source> - <translation>Commit</translation> - </message> - <message> - <source>Done</source> - <translation>Done</translation> - </message> - <message> - <source>&Next</source> - <translation>&Next</translation> - </message> - <message> - <source>&Next ></source> - <translation>&Next ></translation> - </message> - </context> - <context> - <name>QWorkspace</name> - <message> - <source>&Restore</source> - <translation>&Restore</translation> - </message> - <message> - <source>&Move</source> - <translation>&Move</translation> - </message> - <message> - <source>&Size</source> - <translation>&Size</translation> - </message> - <message> - <source>Mi&nimize</source> - <translation>Mi&nimize</translation> - </message> - <message> - <source>Ma&ximize</source> - <translation>Ma&ximize</translation> - </message> - <message> - <source>&Close</source> - <translation>&Close</translation> - </message> - <message> - <source>Stay on &Top</source> - <translation>Stay on &Top</translation> - </message> - <message> - <source>Minimize</source> - <translation>Minimize</translation> - </message> - <message> - <source>Restore Down</source> - <translation>Restore Down</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Sh&ade</source> - <translation>Sh&ade</translation> - </message> - <message> - <source>%1 - [%2]</source> - <translation>%1 - [%2]</translation> - </message> - <message> - <source>&Unshade</source> - <translation>&Unshade</translation> - </message> - </context> - <context> - <name>QXml</name> - <message> - <source>no error occurred</source> - <translation>no error occurred</translation> - </message> - <message> - <source>error triggered by consumer</source> - <translation>error triggered by consumer</translation> - </message> - <message> - <source>unexpected end of file</source> - <translation>unexpected end of file</translation> - </message> - <message> - <source>more than one document type definition</source> - <translation>more than one document type definition</translation> - </message> - <message> - <source>error occurred while parsing element</source> - <translation>error occurred while parsing element</translation> - </message> - <message> - <source>tag mismatch</source> - <translation>tag mismatch</translation> - </message> - <message> - <source>error occurred while parsing content</source> - <translation>error occurred while parsing content</translation> - </message> - <message> - <source>unexpected character</source> - <translation>unexpected character</translation> - </message> - <message> - <source>invalid name for processing instruction</source> - <translation>invalid name for processing instruction</translation> - </message> - <message> - <source>version expected while reading the XML declaration</source> - <translation>version expected while reading the XML declaration</translation> - </message> - <message> - <source>wrong value for standalone declaration</source> - <translation>wrong value for standalone declaration</translation> - </message> - <message> - <source>error occurred while parsing document type definition</source> - <translation>error occurred while parsing document type definition</translation> - </message> - <message> - <source>letter is expected</source> - <translation>letter is expected</translation> - </message> - <message> - <source>error occurred while parsing comment</source> - <translation>error occurred while parsing comment</translation> - </message> - <message> - <source>error occurred while parsing reference</source> - <translation>error occurred while parsing reference</translation> - </message> - <message> - <source>internal general entity reference not allowed in DTD</source> - <translation>internal general entity reference not allowed in DTD</translation> - </message> - <message> - <source>external parsed general entity reference not allowed in attribute value</source> - <translation>external parsed general entity reference not allowed in attribute value</translation> - </message> - <message> - <source>external parsed general entity reference not allowed in DTD</source> - <translation>external parsed general entity reference not allowed in DTD</translation> - </message> - <message> - <source>unparsed entity reference in wrong context</source> - <translation>unparsed entity reference in wrong context</translation> - </message> - <message> - <source>recursive entities</source> - <translation>recursive entities</translation> - </message> - <message> - <source>error in the text declaration of an external entity</source> - <translation>error in the text declaration of an external entity</translation> - </message> - <message> - <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> - <translation>encoding declaration or standalone declaration expected while reading the XML declaration</translation> - </message> - <message> - <source>standalone declaration expected while reading the XML declaration</source> - <translation>standalone declaration expected while reading the XML declaration</translation> - </message> - </context> - <context> - <name>QXmlPatternistCLI</name> - <message> - <source>Warning in %1, at line %2, column %3: %4</source> - <translation>Warning in %1, at line %2, column %3: %4</translation> - </message> - <message> - <source>Warning in %1: %2</source> - <translation>Warning in %1: %2</translation> - </message> - <message> - <source>Unknown location</source> - <translation>Unknown location</translation> - </message> - <message> - <source>Error %1 in %2, at line %3, column %4: %5</source> - <translation>Error %1 in %2, at line %3, column %4: %5</translation> - </message> - <message> - <source>Error %1 in %2: %3</source> - <translation>Error %1 in %2: %3</translation> - </message> - </context> - <context> - <name>QXmlStream</name> - <message> - <source>Extra content at end of document.</source> - <translation>Extra content at end of document.</translation> - </message> - <message> - <source>Invalid entity value.</source> - <translation>Invalid entity value.</translation> - </message> - <message> - <source>Invalid XML character.</source> - <translation>Invalid XML character.</translation> - </message> - <message> - <source>Sequence ']]>' not allowed in content.</source> - <translation>Sequence ']]>' not allowed in content.</translation> - </message> - <message> - <source>Namespace prefix '%1' not declared</source> - <translation>Namespace prefix '%1' not declared</translation> - </message> - <message> - <source>Attribute redefined.</source> - <translation>Attribute redefined.</translation> - </message> - <message> - <source>Unexpected character '%1' in public id literal.</source> - <translation>Unexpected character '%1' in public id literal.</translation> - </message> - <message> - <source>Invalid XML version string.</source> - <translation>Invalid XML version string.</translation> - </message> - <message> - <source>Unsupported XML version.</source> - <translation>Unsupported XML version.</translation> - </message> - <message> - <source>%1 is an invalid encoding name.</source> - <translation>%1 is an invalid encoding name.</translation> - </message> - <message> - <source>Encoding %1 is unsupported</source> - <translation>Encoding %1 is unsupported</translation> - </message> - <message> - <source>Standalone accepts only yes or no.</source> - <translation>Standalone accepts only yes or no.</translation> - </message> - <message> - <source>Invalid attribute in XML declaration.</source> - <translation>Invalid attribute in XML declaration.</translation> - </message> - <message> - <source>Premature end of document.</source> - <translation>Premature end of document.</translation> - </message> - <message> - <source>Invalid document.</source> - <translation>Invalid document.</translation> - </message> - <message> - <source>Expected </source> - <translation>Expected </translation> - </message> - <message> - <source>, but got '</source> - <translation>, but got '</translation> - </message> - <message> - <source>Unexpected '</source> - <translation>Unexpected '</translation> - </message> - <message> - <source>Expected character data.</source> - <translation>Expected character data.</translation> - </message> - <message> - <source>Recursive entity detected.</source> - <translation>Recursive entity detected.</translation> - </message> - <message> - <source>Start tag expected.</source> - <translation>Start tag expected.</translation> - </message> - <message> - <source>XML declaration not at start of document.</source> - <translation>XML declaration not at start of document.</translation> - </message> - <message> - <source>NDATA in parameter entity declaration.</source> - <translation>NDATA in parameter entity declaration.</translation> - </message> - <message> - <source>%1 is an invalid processing instruction name.</source> - <translation>%1 is an invalid processing instruction name.</translation> - </message> - <message> - <source>Invalid processing instruction name.</source> - <translation>Invalid processing instruction name.</translation> - </message> - <message> - <source>Illegal namespace declaration.</source> - <translation>Illegal namespace declaration.</translation> - </message> - <message> - <source>Invalid XML name.</source> - <translation>Invalid XML name.</translation> - </message> - <message> - <source>Opening and ending tag mismatch.</source> - <translation>Opening and ending tag mismatch.</translation> - </message> - <message> - <source>Reference to unparsed entity '%1'.</source> - <translation>Reference to unparsed entity '%1'.</translation> - </message> - <message> - <source>Entity '%1' not declared.</source> - <translation>Entity '%1' not declared.</translation> - </message> - <message> - <source>Reference to external entity '%1' in attribute value.</source> - <translation>Reference to external entity '%1' in attribute value.</translation> - </message> - <message> - <source>Invalid character reference.</source> - <translation>Invalid character reference.</translation> - </message> - <message> - <source>Encountered incorrectly encoded content.</source> - <translation>Encountered incorrectly encoded content.</translation> - </message> - <message> - <source>The standalone pseudo attribute must appear after the encoding.</source> - <translation>The standalone pseudo attribute must appear after the encoding.</translation> - </message> - <message> - <source>%1 is an invalid PUBLIC identifier.</source> - <translation>%1 is an invalid PUBLIC identifier.</translation> - </message> - </context> - <context> - <name>QtXmlPatterns</name> - <message> - <source>At least one component must be present.</source> - <translation>At least one component must be present.</translation> - </message> - <message> - <source>%1 is not a valid value of type %2.</source> - <translation>%1 is not a valid value of type %2.</translation> - </message> - <message> - <source>When casting to %1 from %2, the source value cannot be %3.</source> - <translation>When casting to %1 from %2, the source value cannot be %3.</translation> - </message> - <message> - <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> - <translation>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</translation> - </message> - <message> - <source>The data of a processing instruction cannot contain the string %1</source> - <translation>The data of a processing instruction cannot contain the string %1</translation> - </message> - <message> - <source>%1 is an invalid %2</source> - <translation>%1 is an invalid %2</translation> - </message> - <message> - <source>%1 is not a valid XML 1.0 character.</source> - <translation>%1 is not a valid XML 1.0 character.</translation> - </message> - <message> - <source>%1 was called.</source> - <translation>%1 was called.</translation> - </message> - <message> - <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> - <translation>In the replacement string, %1 must be followed by at least one digit when not escaped.</translation> - </message> - <message> - <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> - <translation>In the replacement string, %1 can only be used to escape itself or %2, not %3</translation> - </message> - <message> - <source>%1 matches newline characters</source> - <translation>%1 matches newline characters</translation> - </message> - <message> - <source>Matches are case insensitive</source> - <translation>Matches are case insensitive</translation> - </message> - <message> - <source>%1 is an invalid regular expression pattern: %2</source> - <translation>%1 is an invalid regular expression pattern: %2</translation> - </message> - <message> - <source>It will not be possible to retrieve %1.</source> - <translation>It will not be possible to retrieve %1.</translation> - </message> - <message> - <source>The default collection is undefined</source> - <translation>The default collection is undefined</translation> - </message> - <message> - <source>%1 cannot be retrieved</source> - <translation>%1 cannot be retrieved</translation> - </message> - <message> - <source>The item %1 did not match the required type %2.</source> - <translation>The item %1 did not match the required type %2.</translation> - </message> - <message> - <source>%1 is an unknown schema type.</source> - <translation>%1 is an unknown schema type.</translation> - </message> - <message> - <source>A template with name %1 has already been declared.</source> - <translation>A template with name %1 has already been declared.</translation> - </message> - <message> - <source>Only one %1 declaration can occur in the query prolog.</source> - <translation>Only one %1 declaration can occur in the query prolog.</translation> - </message> - <message> - <source>The initialization of variable %1 depends on itself</source> - <translation>The initialization of variable %1 depends on itself</translation> - </message> - <message> - <source>The variable %1 is unused</source> - <translation>The variable %1 is unused</translation> - </message> - <message> - <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> - <translation>Version %1 is not supported. The supported XQuery version is 1.0.</translation> - </message> - <message> - <source>No function with signature %1 is available</source> - <translation>No function with signature %1 is available</translation> - </message> - <message> - <source>It is not possible to redeclare prefix %1.</source> - <translation>It is not possible to redeclare prefix %1.</translation> - </message> - <message> - <source>Prefix %1 is already declared in the prolog.</source> - <translation>Prefix %1 is already declared in the prolog.</translation> - </message> - <message> - <source>The name of an option must have a prefix. There is no default namespace for options.</source> - <translation>The name of an option must have a prefix. There is no default namespace for options.</translation> - </message> - <message> - <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> - <translation>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</translation> - </message> - <message> - <source>The target namespace of a %1 cannot be empty.</source> - <translation>The target namespace of a %1 cannot be empty.</translation> - </message> - <message> - <source>The module import feature is not supported</source> - <translation>The module import feature is not supported</translation> - </message> - <message> - <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> - <translation>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</translation> - </message> - <message> - <source>A function already exists with the signature %1.</source> - <translation>A function already exists with the signature %1.</translation> - </message> - <message> - <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> - <translation>No external functions are supported. All supported functions can be used directly, without first declaring them as external</translation> - </message> - <message> - <source>The %1-axis is unsupported in XQuery</source> - <translation>The %1-axis is unsupported in XQuery</translation> - </message> - <message> - <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> - <translation>The namespace URI cannot be the empty string when binding to a prefix, %1.</translation> - </message> - <message> - <source>%1 is an invalid namespace URI.</source> - <translation>%1 is an invalid namespace URI.</translation> - </message> - <message> - <source>It is not possible to bind to the prefix %1</source> - <translation>It is not possible to bind to the prefix %1</translation> - </message> - <message> - <source>Two namespace declaration attributes have the same name: %1.</source> - <translation>Two namespace declaration attributes have the same name: %1.</translation> - </message> - <message> - <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> - <translation>The namespace URI must be a constant and cannot use enclosed expressions.</translation> - </message> - <message> - <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> - <translation>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</translation> - </message> - <message> - <source>empty</source> - <translation>empty</translation> - </message> - <message> - <source>zero or one</source> - <translation>zero or one</translation> - </message> - <message> - <source>exactly one</source> - <translation>exactly one</translation> - </message> - <message> - <source>one or more</source> - <translation>one or more</translation> - </message> - <message> - <source>zero or more</source> - <translation>zero or more</translation> - </message> - <message> - <source>The focus is undefined.</source> - <translation>The focus is undefined.</translation> - </message> - <message> - <source>An attribute by name %1 has already been created.</source> - <translation>An attribute by name %1 has already been created.</translation> - </message> - <message> - <source>Network timeout.</source> - <translation>Network timeout.</translation> - </message> - <message> - <source>Element %1 can't be serialized because it appears outside the document element.</source> - <translation>Element %1 can't be serialized because it appears outside the document element.</translation> - </message> - <message> - <source>Year %1 is invalid because it begins with %2.</source> - <translation>Year %1 is invalid because it begins with %2.</translation> - </message> - <message> - <source>Day %1 is outside the range %2..%3.</source> - <translation>Day %1 is outside the range %2..%3.</translation> - </message> - <message> - <source>Month %1 is outside the range %2..%3.</source> - <translation>Month %1 is outside the range %2..%3.</translation> - </message> - <message> - <source>Overflow: Can't represent date %1.</source> - <translation>Overflow: Can't represent date %1.</translation> - </message> - <message> - <source>Day %1 is invalid for month %2.</source> - <translation>Day %1 is invalid for month %2.</translation> - </message> - <message> - <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source> - <translation>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </translation> - </message> - <message> - <source>Time %1:%2:%3.%4 is invalid.</source> - <translation>Time %1:%2:%3.%4 is invalid.</translation> - </message> - <message> - <source>Overflow: Date can't be represented.</source> - <translation>Overflow: Date can't be represented.</translation> - </message> - <message> - <source>At least one time component must appear after the %1-delimiter.</source> - <translation>At least one time component must appear after the %1-delimiter.</translation> - </message> - <message> - <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> - <translation>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</translation> - </message> - <message> - <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source> - <translation>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</translation> - </message> - <message> - <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source> - <translation>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</translation> - </message> - <message> - <source>A value of type %1 cannot have an Effective Boolean Value.</source> - <translation>A value of type %1 cannot have an Effective Boolean Value.</translation> - </message> - <message> - <source>Value %1 of type %2 exceeds maximum (%3).</source> - <translation>Value %1 of type %2 exceeds maximum (%3).</translation> - </message> - <message> - <source>Value %1 of type %2 is below minimum (%3).</source> - <translation>Value %1 of type %2 is below minimum (%3).</translation> - </message> - <message> - <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source> - <translation>A value of type %1 must contain an even number of digits. The value %2 does not.</translation> - </message> - <message> - <source>%1 is not valid as a value of type %2.</source> - <translation>%1 is not valid as a value of type %2.</translation> - </message> - <message> - <source>Operator %1 cannot be used on type %2.</source> - <translation>Operator %1 cannot be used on type %2.</translation> - </message> - <message> - <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source> - <translation>Operator %1 cannot be used on atomic values of type %2 and %3.</translation> - </message> - <message> - <source>The namespace URI in the name for a computed attribute cannot be %1.</source> - <translation>The namespace URI in the name for a computed attribute cannot be %1.</translation> - </message> - <message> - <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source> - <translation>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</translation> - </message> - <message> - <source>Type error in cast, expected %1, received %2.</source> - <translation>Type error in cast, expected %1, received %2.</translation> - </message> - <message> - <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source> - <translation>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</translation> - </message> - <message> - <source>A comment cannot contain %1</source> - <translation>A comment cannot contain %1</translation> - </message> - <message> - <source>A comment cannot end with a %1.</source> - <translation>A comment cannot end with a %1.</translation> - </message> - <message> - <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source> - <translation>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</translation> - </message> - <message> - <source>A library module cannot be evaluated directly. It must be imported from a main module.</source> - <translation>A library module cannot be evaluated directly. It must be imported from a main module.</translation> - </message> - <message> - <source>No template by name %1 exists.</source> - <translation>No template by name %1 exists.</translation> - </message> - <message> - <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> - <translation>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</translation> - </message> - <message> - <source>A positional predicate must evaluate to a single numeric value.</source> - <translation>A positional predicate must evaluate to a single numeric value.</translation> - </message> - <message> - <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source> - <translation>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</translation> - </message> - <message> - <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> - <translation>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</translation> - </message> - <message> - <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> - <translation>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</translation> - </message> - <message> - <source>No namespace binding exists for the prefix %1</source> - <translation>No namespace binding exists for the prefix %1</translation> - </message> - <message> - <source>No namespace binding exists for the prefix %1 in %2</source> - <translation>No namespace binding exists for the prefix %1 in %2</translation> - </message> - <message> - <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source> - <translation>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</translation> - </message> - <message> - <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> - <translation>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</translation> - </message> - <message> - <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> - <translation>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</translation> - </message> - <message> - <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source> - <translation>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</translation> - </message> - <message> - <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> - <translation>%1 must be followed by %2 or %3, not at the end of the replacement string.</translation> - </message> - <message> - <source>%1 and %2 match the start and end of a line.</source> - <translation>%1 and %2 match the start and end of a line.</translation> - </message> - <message> - <source>Whitespace characters are removed, except when they appear in character classes</source> - <translation>Whitespace characters are removed, except when they appear in character classes</translation> - </message> - <message> - <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> - <translation>%1 is an invalid flag for regular expressions. Valid flags are:</translation> - </message> - <message> - <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> - <translation>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</translation> - </message> - <message> - <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> - <translation>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</translation> - </message> - <message> - <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> - <translation>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</translation> - </message> - <message> - <source>Required cardinality is %1; got cardinality %2.</source> - <translation>Required cardinality is %1; got cardinality %2.</translation> - </message> - <message> - <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> - <translation>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</translation> - </message> - <message> - <source>The keyword %1 cannot occur with any other mode name.</source> - <translation>The keyword %1 cannot occur with any other mode name.</translation> - </message> - <message> - <source>No variable with name %1 exists</source> - <translation>No variable with name %1 exists</translation> - </message> - <message> - <source>The value of attribute %1 must be of type %2, which %3 isn't.</source> - <translation>The value of attribute %1 must be of type %2, which %3 isn't.</translation> - </message> - <message> - <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source> - <translation>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</translation> - </message> - <message> - <source>A variable with name %1 has already been declared.</source> - <translation>A variable with name %1 has already been declared.</translation> - </message> - <message> - <source>No value is available for the external variable with name %1.</source> - <translation>No value is available for the external variable with name %1.</translation> - </message> - <message> - <source>A stylesheet function must have a prefixed name.</source> - <translation>A stylesheet function must have a prefixed name.</translation> - </message> - <message> - <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> - <translation>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</translation> - </message> - <message> - <source>An argument with name %1 has already been declared. Every argument name must be unique.</source> - <translation>An argument with name %1 has already been declared. Every argument name must be unique.</translation> - </message> - <message> - <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> - <translation>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</translation> - </message> - <message> - <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> - <translation>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</translation> - </message> - <message> - <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> - <translation>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</translation> - </message> - <message> - <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> - <translation>In an XSL-T pattern, function %1 cannot have a third argument.</translation> - </message> - <message> - <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> - <translation>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</translation> - </message> - <message> - <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> - <translation>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</translation> - </message> - <message> - <source>%1 is an invalid template mode name.</source> - <translation>%1 is an invalid template mode name.</translation> - </message> - <message> - <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> - <translation>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</translation> - </message> - <message> - <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> - <translation>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</translation> - </message> - <message> - <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> - <translation>None of the pragma expressions are supported. Therefore, a fallback expression must be present</translation> - </message> - <message> - <source>Each name of a template parameter must be unique; %1 is duplicated.</source> - <translation>Each name of a template parameter must be unique; %1 is duplicated.</translation> - </message> - <message> - <source>No function with name %1 is available.</source> - <translation>No function with name %1 is available.</translation> - </message> - <message> - <source>%1 is not a valid numeric literal.</source> - <translation>%1 is not a valid numeric literal.</translation> - </message> - <message> - <source>W3C XML Schema identity constraint selector</source> - <translation>W3C XML Schema identity constraint selector</translation> - </message> - <message> - <source>W3C XML Schema identity constraint field</source> - <translation>W3C XML Schema identity constraint field</translation> - </message> - <message> - <source>A construct was encountered which is disallowed in the current language(%1).</source> - <translation>A construct was encountered which is disallowed in the current language(%1).</translation> - </message> - <message> - <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</translation> - </message> - <message> - <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</translation> - </message> - <message> - <source>An attribute with name %1 has already appeared on this element.</source> - <translation>An attribute with name %1 has already appeared on this element.</translation> - </message> - <message> - <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> - <translation>A direct element constructor is not well-formed. %1 is ended with %2.</translation> - </message> - <message> - <source>The name %1 does not refer to any schema type.</source> - <translation>The name %1 does not refer to any schema type.</translation> - </message> - <message> - <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> - <translation>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</translation> - </message> - <message> - <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> - <translation>%1 is not an atomic type. Casting is only possible to atomic types.</translation> - </message> - <message> - <source>%1 is not a valid name for a processing-instruction.</source> - <translation>%1 is not a valid name for a processing-instruction.</translation> - </message> - <message> - <source>The name of an extension expression must be in a namespace.</source> - <translation>The name of an extension expression must be in a namespace.</translation> - </message> - <message> - <source>Required type is %1, but %2 was found.</source> - <translation>Required type is %1, but %2 was found.</translation> - </message> - <message> - <source>Promoting %1 to %2 may cause loss of precision.</source> - <translation>Promoting %1 to %2 may cause loss of precision.</translation> - </message> - <message> - <source>It's not possible to add attributes after any other kind of node.</source> - <translation>It's not possible to add attributes after any other kind of node.</translation> - </message> - <message> - <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> - <translation>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</translation> - </message> - <message> - <source>Integer division (%1) by zero (%2) is undefined.</source> - <translation>Integer division (%1) by zero (%2) is undefined.</translation> - </message> - <message> - <source>Division (%1) by zero (%2) is undefined.</source> - <translation>Division (%1) by zero (%2) is undefined.</translation> - </message> - <message> - <source>Modulus division (%1) by zero (%2) is undefined.</source> - <translation>Modulus division (%1) by zero (%2) is undefined.</translation> - </message> - <message numerus="yes"> - <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source> - <translation> - <numerusform>%1 takes at most %n argument(s). %2 is therefore invalid.</numerusform> - <numerusform>%1 takes at most %n argument(s). %2 is therefore invalid.</numerusform> - </translation> - </message> - <message numerus="yes"> - <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source> - <translation> - <numerusform>%1 requires at least %n argument(s). %2 is therefore invalid.</numerusform> - <numerusform>%1 requires at least %n argument(s). %2 is therefore invalid.</numerusform> - </translation> - </message> - <message> - <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> - <translation>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</translation> - </message> - <message> - <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> - <translation>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</translation> - </message> - <message> - <source>A default namespace declaration must occur before function, variable, and option declarations.</source> - <translation>A default namespace declaration must occur before function, variable, and option declarations.</translation> - </message> - <message> - <source>Namespace declarations must occur before function, variable, and option declarations.</source> - <translation>Namespace declarations must occur before function, variable, and option declarations.</translation> - </message> - <message> - <source>Module imports must occur before function, variable, and option declarations.</source> - <translation>Module imports must occur before function, variable, and option declarations.</translation> - </message> - <message> - <source>%1 is not a whole number of minutes.</source> - <translation>%1 is not a whole number of minutes.</translation> - </message> - <message> - <source>Attribute %1 can't be serialized because it appears at the top level.</source> - <translation>Attribute %1 can't be serialized because it appears at the top level.</translation> - </message> - <message> - <source>%1 is an unsupported encoding.</source> - <translation>%1 is an unsupported encoding.</translation> - </message> - <message> - <source>%1 contains octets which are disallowed in the requested encoding %2.</source> - <translation>%1 contains octets which are disallowed in the requested encoding %2.</translation> - </message> - <message> - <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> - <translation>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</translation> - </message> - <message> - <source>Ambiguous rule match.</source> - <translation>Ambiguous rule match.</translation> - </message> - <message> - <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> - <translation>In a namespace constructor, the value for a namespace cannot be an empty string.</translation> - </message> - <message> - <source>The prefix must be a valid %1, which %2 is not.</source> - <translation>The prefix must be a valid %1, which %2 is not.</translation> - </message> - <message> - <source>The prefix %1 cannot be bound.</source> - <translation>The prefix %1 cannot be bound.</translation> - </message> - <message> - <source>Only the prefix %1 can be bound to %2 and vice versa.</source> - <translation>Only the prefix %1 can be bound to %2 and vice versa.</translation> - </message> - <message> - <source>The parameter %1 is required, but no corresponding %2 is supplied.</source> - <translation>The parameter %1 is required, but no corresponding %2 is supplied.</translation> - </message> - <message> - <source>The parameter %1 is passed, but no corresponding %2 exists.</source> - <translation>The parameter %1 is passed, but no corresponding %2 exists.</translation> - </message> - <message> - <source>The URI cannot have a fragment</source> - <translation>The URI cannot have a fragment</translation> - </message> - <message> - <source>Element %1 is not allowed at this location.</source> - <translation>Element %1 is not allowed at this location.</translation> - </message> - <message> - <source>Text nodes are not allowed at this location.</source> - <translation>Text nodes are not allowed at this location.</translation> - </message> - <message> - <source>Parse error: %1</source> - <translation>Parse error: %1</translation> - </message> - <message> - <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> - <translation>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</translation> - </message> - <message> - <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> - <translation>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</translation> - </message> - <message> - <source>Unknown XSL-T attribute %1.</source> - <translation>Unknown XSL-T attribute %1.</translation> - </message> - <message> - <source>Attribute %1 and %2 are mutually exclusive.</source> - <translation>Attribute %1 and %2 are mutually exclusive.</translation> - </message> - <message> - <source>In a simplified stylesheet module, attribute %1 must be present.</source> - <translation>In a simplified stylesheet module, attribute %1 must be present.</translation> - </message> - <message> - <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> - <translation>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</translation> - </message> - <message> - <source>Element %1 must have at least one of the attributes %2 or %3.</source> - <translation>Element %1 must have at least one of the attributes %2 or %3.</translation> - </message> - <message> - <source>At least one mode must be specified in the %1-attribute on element %2.</source> - <translation>At least one mode must be specified in the %1-attribute on element %2.</translation> - </message> - <message> - <source>Element %1 must come last.</source> - <translation>Element %1 must come last.</translation> - </message> - <message> - <source>At least one %1-element must occur before %2.</source> - <translation>At least one %1-element must occur before %2.</translation> - </message> - <message> - <source>Only one %1-element can appear.</source> - <translation>Only one %1-element can appear.</translation> - </message> - <message> - <source>At least one %1-element must occur inside %2.</source> - <translation>At least one %1-element must occur inside %2.</translation> - </message> - <message> - <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> - <translation>When attribute %1 is present on %2, a sequence constructor cannot be used.</translation> - </message> - <message> - <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> - <translation>Element %1 must have either a %2-attribute or a sequence constructor.</translation> - </message> - <message> - <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> - <translation>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</translation> - </message> - <message> - <source>Element %1 cannot have children.</source> - <translation>Element %1 cannot have children.</translation> - </message> - <message> - <source>Element %1 cannot have a sequence constructor.</source> - <translation>Element %1 cannot have a sequence constructor.</translation> - </message> - <message> - <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> - <translation>The attribute %1 cannot appear on %2, when it is a child of %3.</translation> - </message> - <message> - <source>A parameter in a function cannot be declared to be a tunnel.</source> - <translation>A parameter in a function cannot be declared to be a tunnel.</translation> - </message> - <message> - <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> - <translation>This processor is not Schema-aware and therefore %1 cannot be used.</translation> - </message> - <message> - <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> - <translation>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</translation> - </message> - <message> - <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> - <translation>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</translation> - </message> - <message> - <source>Attribute %1 cannot have the value %2.</source> - <translation>Attribute %1 cannot have the value %2.</translation> - </message> - <message> - <source>The attribute %1 can only appear on the first %2 element.</source> - <translation>The attribute %1 can only appear on the first %2 element.</translation> - </message> - <message> - <source>At least one %1 element must appear as child of %2.</source> - <translation>At least one %1 element must appear as child of %2.</translation> - </message> - <message> - <source>%1 has inheritance loop in its base type %2.</source> - <translation>%1 has inheritance loop in its base type %2.</translation> - </message> - <message> - <source>Circular inheritance of base type %1.</source> - <translation>Circular inheritance of base type %1.</translation> - </message> - <message> - <source>Circular inheritance of union %1.</source> - <translation>Circular inheritance of union %1.</translation> - </message> - <message> - <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source> - <translation>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</translation> - </message> - <message> - <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source> - <translation>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</translation> - </message> - <message> - <source>Base type of simple type %1 cannot be complex type %2.</source> - <translation>Base type of simple type %1 cannot be complex type %2.</translation> - </message> - <message> - <source>Simple type %1 cannot have direct base type %2.</source> - <translation>Simple type %1 cannot have direct base type %2.</translation> - </message> - <message> - <source>Simple type %1 is not allowed to have base type %2.</source> - <translation>Simple type %1 is not allowed to have base type %2.</translation> - </message> - <message> - <source>Simple type %1 can only have simple atomic type as base type.</source> - <translation>Simple type %1 can only have simple atomic type as base type.</translation> - </message> - <message> - <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source> - <translation>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</translation> - </message> - <message> - <source>Variety of item type of %1 must be either atomic or union.</source> - <translation>Variety of item type of %1 must be either atomic or union.</translation> - </message> - <message> - <source>Variety of member types of %1 must be atomic.</source> - <translation>Variety of member types of %1 must be atomic.</translation> - </message> - <message> - <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source> - <translation>%1 is not allowed to derive from %2 by list as the latter defines it as final.</translation> - </message> - <message> - <source>Simple type %1 is only allowed to have %2 facet.</source> - <translation>Simple type %1 is only allowed to have %2 facet.</translation> - </message> - <message> - <source>Base type of simple type %1 must have variety of type list.</source> - <translation>Base type of simple type %1 must have variety of type list.</translation> - </message> - <message> - <source>Base type of simple type %1 has defined derivation by restriction as final.</source> - <translation>Base type of simple type %1 has defined derivation by restriction as final.</translation> - </message> - <message> - <source>Item type of base type does not match item type of %1.</source> - <translation>Item type of base type does not match item type of %1.</translation> - </message> - <message> - <source>Simple type %1 contains not allowed facet type %2.</source> - <translation>Simple type %1 contains not allowed facet type %2.</translation> - </message> - <message> - <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source> - <translation>%1 is not allowed to derive from %2 by union as the latter defines it as final.</translation> - </message> - <message> - <source>%1 is not allowed to have any facets.</source> - <translation>%1 is not allowed to have any facets.</translation> - </message> - <message> - <source>Base type %1 of simple type %2 must have variety of union.</source> - <translation>Base type %1 of simple type %2 must have variety of union.</translation> - </message> - <message> - <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source> - <translation>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</translation> - </message> - <message> - <source>Member type %1 cannot be derived from member type %2 of %3's base type %4.</source> - <translation>Member type %1 cannot be derived from member type %2 of %3's base type %4.</translation> - </message> - <message> - <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source> - <translation>Derivation method of %1 must be extension because the base type %2 is a simple type.</translation> - </message> - <message> - <source>Complex type %1 has duplicated element %2 in its content model.</source> - <translation>Complex type %1 has duplicated element %2 in its content model.</translation> - </message> - <message> - <source>Complex type %1 has non-deterministic content.</source> - <translation>Complex type %1 has non-deterministic content.</translation> - </message> - <message> - <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source> - <translation>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</translation> - </message> - <message> - <source>Content model of complex type %1 is not a valid extension of content model of %2.</source> - <translation>Content model of complex type %1 is not a valid extension of content model of %2.</translation> - </message> - <message> - <source>Complex type %1 must have simple content.</source> - <translation>Complex type %1 must have simple content.</translation> - </message> - <message> - <source>Complex type %1 must have the same simple type as its base class %2.</source> - <translation>Complex type %1 must have the same simple type as its base class %2.</translation> - </message> - <message> - <source>Complex type %1 cannot be derived from base type %2%3.</source> - <translation>Complex type %1 cannot be derived from base type %2%3.</translation> - </message> - <message> - <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source> - <translation>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</translation> - </message> - <message> - <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source> - <translation>Complex type %1 with simple content cannot be derived from complex base type %2.</translation> - </message> - <message> - <source>Item type of simple type %1 cannot be a complex type.</source> - <translation>Item type of simple type %1 cannot be a complex type.</translation> - </message> - <message> - <source>Member type of simple type %1 cannot be a complex type.</source> - <translation>Member type of simple type %1 cannot be a complex type.</translation> - </message> - <message> - <source>%1 is not allowed to have a member type with the same name as itself.</source> - <translation>%1 is not allowed to have a member type with the same name as itself.</translation> - </message> - <message> - <source>%1 facet collides with %2 facet.</source> - <translation>%1 facet collides with %2 facet.</translation> - </message> - <message> - <source>%1 facet must have the same value as %2 facet of base type.</source> - <translation>%1 facet must have the same value as %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet must be equal or greater than %2 facet of base type.</source> - <translation>%1 facet must be equal or greater than %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet must be less than or equal to %2 facet of base type.</source> - <translation>%1 facet must be less than or equal to %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet contains invalid regular expression</source> - <translation>%1 facet contains invalid regular expression</translation> - </message> - <message> - <source>Unknown notation %1 used in %2 facet.</source> - <translation>Unknown notation %1 used in %2 facet.</translation> - </message> - <message> - <source>%1 facet contains invalid value %2: %3.</source> - <translation>%1 facet contains invalid value %2: %3.</translation> - </message> - <message> - <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source> - <translation>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</translation> - </message> - <message> - <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source> - <translation>%1 facet cannot be %2 if %3 facet of base type is %4.</translation> - </message> - <message> - <source>%1 facet must be less than or equal to %2 facet.</source> - <translation>%1 facet must be less than or equal to %2 facet.</translation> - </message> - <message> - <source>%1 facet must be less than %2 facet of base type.</source> - <translation>%1 facet must be less than %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet and %2 facet cannot appear together.</source> - <translation>%1 facet and %2 facet cannot appear together.</translation> - </message> - <message> - <source>%1 facet must be greater than %2 facet of base type.</source> - <translation>%1 facet must be greater than %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet must be less than %2 facet.</source> - <translation>%1 facet must be less than %2 facet.</translation> - </message> - <message> - <source>%1 facet must be greater than or equal to %2 facet of base type.</source> - <translation>%1 facet must be greater than or equal to %2 facet of base type.</translation> - </message> - <message> - <source>Simple type contains not allowed facet %1.</source> - <translation>Simple type contains not allowed facet %1.</translation> - </message> - <message> - <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source> - <translation>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</translation> - </message> - <message> - <source>Only %1 and %2 facets are allowed when derived by union.</source> - <translation>Only %1 and %2 facets are allowed when derived by union.</translation> - </message> - <message> - <source>%1 contains %2 facet with invalid data: %3.</source> - <translation>%1 contains %2 facet with invalid data: %3.</translation> - </message> - <message> - <source>Attribute group %1 contains attribute %2 twice.</source> - <translation>Attribute group %1 contains attribute %2 twice.</translation> - </message> - <message> - <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source> - <translation>Attribute group %1 contains two different attributes that both have types derived from %2.</translation> - </message> - <message> - <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</translation> - </message> - <message> - <source>Complex type %1 contains attribute %2 twice.</source> - <translation>Complex type %1 contains attribute %2 twice.</translation> - </message> - <message> - <source>Complex type %1 contains two different attributes that both have types derived from %2.</source> - <translation>Complex type %1 contains two different attributes that both have types derived from %2.</translation> - </message> - <message> - <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</translation> - </message> - <message> - <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source> - <translation>Element %1 is not allowed to have a value constraint if its base type is complex.</translation> - </message> - <message> - <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source> - <translation>Element %1 is not allowed to have a value constraint if its type is derived from %2.</translation> - </message> - <message> - <source>Value constraint of element %1 is not of elements type: %2.</source> - <translation>Value constraint of element %1 is not of elements type: %2.</translation> - </message> - <message> - <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source> - <translation>Element %1 is not allowed to have substitution group affiliation as it is no global element.</translation> - </message> - <message> - <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source> - <translation>Type of element %1 cannot be derived from type of substitution group affiliation.</translation> - </message> - <message> - <source>Value constraint of attribute %1 is not of attributes type: %2.</source> - <translation>Value constraint of attribute %1 is not of attributes type: %2.</translation> - </message> - <message> - <source>Attribute %1 has value constraint but has type derived from %2.</source> - <translation>Attribute %1 has value constraint but has type derived from %2.</translation> - </message> - <message> - <source>%1 attribute in derived complex type must be %2 like in base type.</source> - <translation>%1 attribute in derived complex type must be %2 like in base type.</translation> - </message> - <message> - <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source> - <translation>Attribute %1 in derived complex type must have %2 value constraint like in base type.</translation> - </message> - <message> - <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source> - <translation>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</translation> - </message> - <message> - <source>Attribute %1 in derived complex type must have %2 value constraint.</source> - <translation>Attribute %1 in derived complex type must have %2 value constraint.</translation> - </message> - <message> - <source>processContent of base wildcard must be weaker than derived wildcard.</source> - <translation>processContent of base wildcard must be weaker than derived wildcard.</translation> - </message> - <message> - <source>Element %1 exists twice with different types.</source> - <translation>Element %1 exists twice with different types.</translation> - </message> - <message> - <source>Particle contains non-deterministic wildcards.</source> - <translation>Particle contains non-deterministic wildcards.</translation> - </message> - <message> - <source>Base attribute %1 is required but derived attribute is not.</source> - <translation>Base attribute %1 is required but derived attribute is not.</translation> - </message> - <message> - <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source> - <translation>Type of derived attribute %1 cannot be validly derived from type of base attribute.</translation> - </message> - <message> - <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source> - <translation>Value constraint of derived attribute %1 does not match value constraint of base attribute.</translation> - </message> - <message> - <source>Derived attribute %1 does not exist in the base definition.</source> - <translation>Derived attribute %1 does not exist in the base definition.</translation> - </message> - <message> - <source>Derived attribute %1 does not match the wildcard in the base definition.</source> - <translation>Derived attribute %1 does not match the wildcard in the base definition.</translation> - </message> - <message> - <source>Base attribute %1 is required but missing in derived definition.</source> - <translation>Base attribute %1 is required but missing in derived definition.</translation> - </message> - <message> - <source>Derived definition contains an %1 element that does not exists in the base definition</source> - <translation>Derived definition contains an %1 element that does not exists in the base definition</translation> - </message> - <message> - <source>Derived wildcard is not a subset of the base wildcard.</source> - <translation>Derived wildcard is not a subset of the base wildcard.</translation> - </message> - <message> - <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source> - <translation>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</translation> - </message> - <message> - <source>Attribute %1 from base type is missing in derived type.</source> - <translation>Attribute %1 from base type is missing in derived type.</translation> - </message> - <message> - <source>Type of derived attribute %1 differs from type of base attribute.</source> - <translation>Type of derived attribute %1 differs from type of base attribute.</translation> - </message> - <message> - <source>Base definition contains an %1 element that is missing in the derived definition</source> - <translation>Base definition contains an %1 element that is missing in the derived definition</translation> - </message> - <message> - <source>%1 references unknown %2 or %3 element %4.</source> - <translation>%1 references unknown %2 or %3 element %4.</translation> - </message> - <message> - <source>%1 references identity constraint %2 that is no %3 or %4 element.</source> - <translation>%1 references identity constraint %2 that is no %3 or %4 element.</translation> - </message> - <message> - <source>%1 has a different number of fields from the identity constraint %2 that it references.</source> - <translation>%1 has a different number of fields from the identity constraint %2 that it references.</translation> - </message> - <message> - <source>Base type %1 of %2 element cannot be resolved.</source> - <translation>Base type %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Item type %1 of %2 element cannot be resolved.</source> - <translation>Item type %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Member type %1 of %2 element cannot be resolved.</source> - <translation>Member type %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Type %1 of %2 element cannot be resolved.</source> - <translation>Type %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Base type %1 of complex type cannot be resolved.</source> - <translation>Base type %1 of complex type cannot be resolved.</translation> - </message> - <message> - <source>%1 cannot have complex base type that has a %2.</source> - <translation>%1 cannot have complex base type that has a %2.</translation> - </message> - <message> - <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source> - <translation>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</translation> - </message> - <message> - <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source> - <translation>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</translation> - </message> - <message> - <source>Type of %1 element must be a simple type, %2 is not.</source> - <translation>Type of %1 element must be a simple type, %2 is not.</translation> - </message> - <message> - <source>Substitution group %1 of %2 element cannot be resolved.</source> - <translation>Substitution group %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Substitution group %1 has circular definition.</source> - <translation>Substitution group %1 has circular definition.</translation> - </message> - <message> - <source>Duplicated element names %1 in %2 element.</source> - <translation>Duplicated element names %1 in %2 element.</translation> - </message> - <message> - <source>Reference %1 of %2 element cannot be resolved.</source> - <translation>Reference %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Circular group reference for %1.</source> - <translation>Circular group reference for %1.</translation> - </message> - <message> - <source>%1 element is not allowed in this scope</source> - <translation>%1 element is not allowed in this scope</translation> - </message> - <message> - <source>%1 element cannot have %2 attribute with value other than %3.</source> - <translation>%1 element cannot have %2 attribute with value other than %3.</translation> - </message> - <message> - <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source> - <translation>%1 element cannot have %2 attribute with value other than %3 or %4.</translation> - </message> - <message> - <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source> - <translation>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</translation> - </message> - <message> - <source>Attribute group %1 has circular reference.</source> - <translation>Attribute group %1 has circular reference.</translation> - </message> - <message> - <source>%1 attribute in %2 must have %3 use like in base type %4.</source> - <translation>%1 attribute in %2 must have %3 use like in base type %4.</translation> - </message> - <message> - <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source> - <translation>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</translation> - </message> - <message> - <source>%1 has attribute wildcard but its base type %2 has not.</source> - <translation>%1 has attribute wildcard but its base type %2 has not.</translation> - </message> - <message> - <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source> - <translation>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</translation> - </message> - <message> - <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source> - <translation>Enumeration facet contains invalid content: {%1} is not a value of type %2.</translation> - </message> - <message> - <source>Namespace prefix of qualified name %1 is not defined.</source> - <translation>Namespace prefix of qualified name %1 is not defined.</translation> - </message> - <message> - <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source> - <translation>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</translation> - </message> - <message> - <source>Empty particle cannot be derived from non-empty particle.</source> - <translation>Empty particle cannot be derived from non-empty particle.</translation> - </message> - <message> - <source>Derived particle is missing element %1.</source> - <translation>Derived particle is missing element %1.</translation> - </message> - <message> - <source>Derived element %1 is missing value constraint as defined in base particle.</source> - <translation>Derived element %1 is missing value constraint as defined in base particle.</translation> - </message> - <message> - <source>Derived element %1 has weaker value constraint than base particle.</source> - <translation>Derived element %1 has weaker value constraint than base particle.</translation> - </message> - <message> - <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source> - <translation>Fixed value constraint of element %1 differs from value constraint in base particle.</translation> - </message> - <message> - <source>Derived element %1 cannot be nillable as base element is not nillable.</source> - <translation>Derived element %1 cannot be nillable as base element is not nillable.</translation> - </message> - <message> - <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source> - <translation>Block constraints of derived element %1 must not be more weaker than in the base element.</translation> - </message> - <message> - <source>Simple type of derived element %1 cannot be validly derived from base element.</source> - <translation>Simple type of derived element %1 cannot be validly derived from base element.</translation> - </message> - <message> - <source>Complex type of derived element %1 cannot be validly derived from base element.</source> - <translation>Complex type of derived element %1 cannot be validly derived from base element.</translation> - </message> - <message> - <source>Element %1 is missing in derived particle.</source> - <translation>Element %1 is missing in derived particle.</translation> - </message> - <message> - <source>Element %1 does not match namespace constraint of wildcard in base particle.</source> - <translation>Element %1 does not match namespace constraint of wildcard in base particle.</translation> - </message> - <message> - <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source> - <translation>Wildcard in derived particle is not a valid subset of wildcard in base particle.</translation> - </message> - <message> - <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source> - <translation>processContent of wildcard in derived particle is weaker than wildcard in base particle.</translation> - </message> - <message> - <source>Derived particle allows content that is not allowed in the base particle.</source> - <translation>Derived particle allows content that is not allowed in the base particle.</translation> - </message> - <message> - <source>Can not process unknown element %1, expected elements are: %2.</source> - <translation>Can not process unknown element %1, expected elements are: %2.</translation> - </message> - <message> - <source>Element %1 is not allowed in this scope, possible elements are: %2.</source> - <translation>Element %1 is not allowed in this scope, possible elements are: %2.</translation> - </message> - <message> - <source>Child element is missing in that scope, possible child elements are: %1.</source> - <translation>Child element is missing in that scope, possible child elements are: %1.</translation> - </message> - <message> - <source>Document is not a XML schema.</source> - <translation>Document is not a XML schema.</translation> - </message> - <message> - <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source> - <translation>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</translation> - </message> - <message> - <source>%1 attribute of %2 element contains invalid content: {%3}.</source> - <translation>%1 attribute of %2 element contains invalid content: {%3}.</translation> - </message> - <message> - <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source> - <translation>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</translation> - </message> - <message> - <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source> - <translation>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</translation> - </message> - <message> - <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source> - <translation>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</translation> - </message> - <message> - <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source> - <translation>%1 element without %2 attribute is not allowed inside schema without target namespace.</translation> - </message> - <message> - <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source> - <translation>%1 element is not allowed inside %2 element if %3 attribute is present.</translation> - </message> - <message> - <source>%1 element has neither %2 attribute nor %3 child element.</source> - <translation>%1 element has neither %2 attribute nor %3 child element.</translation> - </message> - <message> - <source>%1 element with %2 child element must not have a %3 attribute.</source> - <translation>%1 element with %2 child element must not have a %3 attribute.</translation> - </message> - <message> - <source>%1 attribute of %2 element must be %3 or %4.</source> - <translation>%1 attribute of %2 element must be %3 or %4.</translation> - </message> - <message> - <source>%1 attribute of %2 element must have a value of %3.</source> - <translation>%1 attribute of %2 element must have a value of %3.</translation> - </message> - <message> - <source>%1 attribute of %2 element must have a value of %3 or %4.</source> - <translation>%1 attribute of %2 element must have a value of %3 or %4.</translation> - </message> - <message> - <source>%1 element must not have %2 and %3 attribute together.</source> - <translation>%1 element must not have %2 and %3 attribute together.</translation> - </message> - <message> - <source>Content of %1 attribute of %2 element must not be from namespace %3.</source> - <translation>Content of %1 attribute of %2 element must not be from namespace %3.</translation> - </message> - <message> - <source>%1 attribute of %2 element must not be %3.</source> - <translation>%1 attribute of %2 element must not be %3.</translation> - </message> - <message> - <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source> - <translation>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</translation> - </message> - <message> - <source>Specifying use='prohibited' inside an attribute group has no effect.</source> - <translation>Specifying use='prohibited' inside an attribute group has no effect.</translation> - </message> - <message> - <source>%1 element must have either %2 or %3 attribute.</source> - <translation>%1 element must have either %2 or %3 attribute.</translation> - </message> - <message> - <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source> - <translation>%1 element must have either %2 attribute or %3 or %4 as child element.</translation> - </message> - <message> - <source>%1 element requires either %2 or %3 attribute.</source> - <translation>%1 element requires either %2 or %3 attribute.</translation> - </message> - <message> - <source>Text or entity references not allowed inside %1 element</source> - <translation>Text or entity references not allowed inside %1 element</translation> - </message> - <message> - <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source> - <translation>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</translation> - </message> - <message> - <source>%1 element is not allowed in this context.</source> - <translation>%1 element is not allowed in this context.</translation> - </message> - <message> - <source>%1 attribute of %2 element has larger value than %3 attribute.</source> - <translation>%1 attribute of %2 element has larger value than %3 attribute.</translation> - </message> - <message> - <source>Prefix of qualified name %1 is not defined.</source> - <translation>Prefix of qualified name %1 is not defined.</translation> - </message> - <message> - <source>%1 attribute of %2 element must either contain %3 or the other values.</source> - <translation>%1 attribute of %2 element must either contain %3 or the other values.</translation> - </message> - <message> - <source>Component with ID %1 has been defined previously.</source> - <translation>Component with ID %1 has been defined previously.</translation> - </message> - <message> - <source>Element %1 already defined.</source> - <translation>Element %1 already defined.</translation> - </message> - <message> - <source>Attribute %1 already defined.</source> - <translation>Attribute %1 already defined.</translation> - </message> - <message> - <source>Type %1 already defined.</source> - <translation>Type %1 already defined.</translation> - </message> - <message> - <source>Attribute group %1 already defined.</source> - <translation>Attribute group %1 already defined.</translation> - </message> - <message> - <source>Element group %1 already defined.</source> - <translation>Element group %1 already defined.</translation> - </message> - <message> - <source>Notation %1 already defined.</source> - <translation>Notation %1 already defined.</translation> - </message> - <message> - <source>Identity constraint %1 already defined.</source> - <translation>Identity constraint %1 already defined.</translation> - </message> - <message> - <source>Duplicated facets in simple type %1.</source> - <translation>Duplicated facets in simple type %1.</translation> - </message> - <message> - <source>%1 is not valid according to %2.</source> - <translation>%1 is not valid according to %2.</translation> - </message> - <message> - <source>String content does not match the length facet.</source> - <translation>String content does not match the length facet.</translation> - </message> - <message> - <source>String content does not match the minLength facet.</source> - <translation>String content does not match the minLength facet.</translation> - </message> - <message> - <source>String content does not match the maxLength facet.</source> - <translation>String content does not match the maxLength facet.</translation> - </message> - <message> - <source>String content does not match pattern facet.</source> - <translation>String content does not match pattern facet.</translation> - </message> - <message> - <source>String content is not listed in the enumeration facet.</source> - <translation>String content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Signed integer content does not match the maxInclusive facet.</source> - <translation>Signed integer content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Signed integer content does not match the maxExclusive facet.</source> - <translation>Signed integer content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Signed integer content does not match the minInclusive facet.</source> - <translation>Signed integer content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Signed integer content does not match the minExclusive facet.</source> - <translation>Signed integer content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Signed integer content is not listed in the enumeration facet.</source> - <translation>Signed integer content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Signed integer content does not match pattern facet.</source> - <translation>Signed integer content does not match pattern facet.</translation> - </message> - <message> - <source>Signed integer content does not match in the totalDigits facet.</source> - <translation>Signed integer content does not match in the totalDigits facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match the maxInclusive facet.</source> - <translation>Unsigned integer content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match the maxExclusive facet.</source> - <translation>Unsigned integer content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match the minInclusive facet.</source> - <translation>Unsigned integer content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match the minExclusive facet.</source> - <translation>Unsigned integer content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Unsigned integer content is not listed in the enumeration facet.</source> - <translation>Unsigned integer content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match pattern facet.</source> - <translation>Unsigned integer content does not match pattern facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match in the totalDigits facet.</source> - <translation>Unsigned integer content does not match in the totalDigits facet.</translation> - </message> - <message> - <source>Double content does not match the maxInclusive facet.</source> - <translation>Double content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Double content does not match the maxExclusive facet.</source> - <translation>Double content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Double content does not match the minInclusive facet.</source> - <translation>Double content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Double content does not match the minExclusive facet.</source> - <translation>Double content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Double content is not listed in the enumeration facet.</source> - <translation>Double content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Double content does not match pattern facet.</source> - <translation>Double content does not match pattern facet.</translation> - </message> - <message> - <source>Decimal content does not match in the fractionDigits facet.</source> - <translation>Decimal content does not match in the fractionDigits facet.</translation> - </message> - <message> - <source>Decimal content does not match in the totalDigits facet.</source> - <translation>Decimal content does not match in the totalDigits facet.</translation> - </message> - <message> - <source>Date time content does not match the maxInclusive facet.</source> - <translation>Date time content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Date time content does not match the maxExclusive facet.</source> - <translation>Date time content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Date time content does not match the minInclusive facet.</source> - <translation>Date time content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Date time content does not match the minExclusive facet.</source> - <translation>Date time content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Date time content is not listed in the enumeration facet.</source> - <translation>Date time content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Date time content does not match pattern facet.</source> - <translation>Date time content does not match pattern facet.</translation> - </message> - <message> - <source>Duration content does not match the maxInclusive facet.</source> - <translation>Duration content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Duration content does not match the maxExclusive facet.</source> - <translation>Duration content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Duration content does not match the minInclusive facet.</source> - <translation>Duration content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Duration content does not match the minExclusive facet.</source> - <translation>Duration content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Duration content is not listed in the enumeration facet.</source> - <translation>Duration content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Duration content does not match pattern facet.</source> - <translation>Duration content does not match pattern facet.</translation> - </message> - <message> - <source>Boolean content does not match pattern facet.</source> - <translation>Boolean content does not match pattern facet.</translation> - </message> - <message> - <source>Binary content does not match the length facet.</source> - <translation>Binary content does not match the length facet.</translation> - </message> - <message> - <source>Binary content does not match the minLength facet.</source> - <translation>Binary content does not match the minLength facet.</translation> - </message> - <message> - <source>Binary content does not match the maxLength facet.</source> - <translation>Binary content does not match the maxLength facet.</translation> - </message> - <message> - <source>Binary content is not listed in the enumeration facet.</source> - <translation>Binary content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Invalid QName content: %1.</source> - <translation>Invalid QName content: %1.</translation> - </message> - <message> - <source>QName content is not listed in the enumeration facet.</source> - <translation>QName content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>QName content does not match pattern facet.</source> - <translation>QName content does not match pattern facet.</translation> - </message> - <message> - <source>Notation content is not listed in the enumeration facet.</source> - <translation>Notation content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>List content does not match length facet.</source> - <translation>List content does not match length facet.</translation> - </message> - <message> - <source>List content does not match minLength facet.</source> - <translation>List content does not match minLength facet.</translation> - </message> - <message> - <source>List content does not match maxLength facet.</source> - <translation>List content does not match maxLength facet.</translation> - </message> - <message> - <source>List content is not listed in the enumeration facet.</source> - <translation>List content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>List content does not match pattern facet.</source> - <translation>List content does not match pattern facet.</translation> - </message> - <message> - <source>Union content is not listed in the enumeration facet.</source> - <translation>Union content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Union content does not match pattern facet.</source> - <translation>Union content does not match pattern facet.</translation> - </message> - <message> - <source>Data of type %1 are not allowed to be empty.</source> - <translation>Data of type %1 are not allowed to be empty.</translation> - </message> - <message> - <source>Element %1 is missing child element.</source> - <translation>Element %1 is missing child element.</translation> - </message> - <message> - <source>There is one IDREF value with no corresponding ID: %1.</source> - <translation>There is one IDREF value with no corresponding ID: %1.</translation> - </message> - <message> - <source>Loaded schema file is invalid.</source> - <translation>Loaded schema file is invalid.</translation> - </message> - <message> - <source>%1 contains invalid data.</source> - <translation>%1 contains invalid data.</translation> - </message> - <message> - <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source> - <translation>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</translation> - </message> - <message> - <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source> - <translation>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</translation> - </message> - <message> - <source>No schema defined for validation.</source> - <translation>No schema defined for validation.</translation> - </message> - <message> - <source>No definition for element %1 available.</source> - <translation>No definition for element %1 available.</translation> - </message> - <message> - <source>Specified type %1 is not known to the schema.</source> - <translation>Specified type %1 is not known to the schema.</translation> - </message> - <message> - <source>Element %1 is not defined in this scope.</source> - <translation>Element %1 is not defined in this scope.</translation> - </message> - <message> - <source>Declaration for element %1 does not exist.</source> - <translation>Declaration for element %1 does not exist.</translation> - </message> - <message> - <source>Element %1 contains invalid content.</source> - <translation>Element %1 contains invalid content.</translation> - </message> - <message> - <source>Element %1 is declared as abstract.</source> - <translation>Element %1 is declared as abstract.</translation> - </message> - <message> - <source>Element %1 is not nillable.</source> - <translation>Element %1 is not nillable.</translation> - </message> - <message> - <source>Attribute %1 contains invalid data: %2</source> - <translation>Attribute %1 contains invalid data: %2</translation> - </message> - <message> - <source>Element contains content although it is nillable.</source> - <translation>Element contains content although it is nillable.</translation> - </message> - <message> - <source>Fixed value constraint not allowed if element is nillable.</source> - <translation>Fixed value constraint not allowed if element is nillable.</translation> - </message> - <message> - <source>Element %1 cannot contain other elements, as it has a fixed content.</source> - <translation>Element %1 cannot contain other elements, as it has a fixed content.</translation> - </message> - <message> - <source>Specified type %1 is not validly substitutable with element type %2.</source> - <translation>Specified type %1 is not validly substitutable with element type %2.</translation> - </message> - <message> - <source>Complex type %1 is not allowed to be abstract.</source> - <translation>Complex type %1 is not allowed to be abstract.</translation> - </message> - <message> - <source>Element %1 contains not allowed attributes.</source> - <translation>Element %1 contains not allowed attributes.</translation> - </message> - <message> - <source>Element %1 contains not allowed child element.</source> - <translation>Element %1 contains not allowed child element.</translation> - </message> - <message> - <source>Content of element %1 does not match its type definition: %2.</source> - <translation>Content of element %1 does not match its type definition: %2.</translation> - </message> - <message> - <source>Content of element %1 does not match defined value constraint.</source> - <translation>Content of element %1 does not match defined value constraint.</translation> - </message> - <message> - <source>Element %1 contains not allowed child content.</source> - <translation>Element %1 contains not allowed child content.</translation> - </message> - <message> - <source>Element %1 contains not allowed text content.</source> - <translation>Element %1 contains not allowed text content.</translation> - </message> - <message> - <source>Element %1 is missing required attribute %2.</source> - <translation>Element %1 is missing required attribute %2.</translation> - </message> - <message> - <source>Attribute %1 does not match the attribute wildcard.</source> - <translation>Attribute %1 does not match the attribute wildcard.</translation> - </message> - <message> - <source>Declaration for attribute %1 does not exist.</source> - <translation>Declaration for attribute %1 does not exist.</translation> - </message> - <message> - <source>Element %1 contains two attributes of type %2.</source> - <translation>Element %1 contains two attributes of type %2.</translation> - </message> - <message> - <source>Attribute %1 contains invalid content.</source> - <translation>Attribute %1 contains invalid content.</translation> - </message> - <message> - <source>Element %1 contains unknown attribute %2.</source> - <translation>Element %1 contains unknown attribute %2.</translation> - </message> - <message> - <source>Content of attribute %1 does not match its type definition: %2.</source> - <translation>Content of attribute %1 does not match its type definition: %2.</translation> - </message> - <message> - <source>Content of attribute %1 does not match defined value constraint.</source> - <translation>Content of attribute %1 does not match defined value constraint.</translation> - </message> - <message> - <source>Non-unique value found for constraint %1.</source> - <translation>Non-unique value found for constraint %1.</translation> - </message> - <message> - <source>Key constraint %1 contains absent fields.</source> - <translation>Key constraint %1 contains absent fields.</translation> - </message> - <message> - <source>Key constraint %1 contains references nillable element %2.</source> - <translation>Key constraint %1 contains references nillable element %2.</translation> - </message> - <message> - <source>No referenced value found for key reference %1.</source> - <translation>No referenced value found for key reference %1.</translation> - </message> - <message> - <source>More than one value found for field %1.</source> - <translation>More than one value found for field %1.</translation> - </message> - <message> - <source>Field %1 has no simple type.</source> - <translation>Field %1 has no simple type.</translation> - </message> - <message> - <source>ID value '%1' is not unique.</source> - <translation>ID value '%1' is not unique.</translation> - </message> - <message> - <source>'%1' attribute contains invalid QName content: %2.</source> - <translation>'%1' attribute contains invalid QName content: %2.</translation> - </message> - </context> +<context> + <name>QApplication</name> + <message> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation>RTL</translation> + </message> +</context> </TS> diff --git a/config.profiles/symbian/translations/qt_he.ts b/config.profiles/symbian/translations/qt_he.ts index 72a6df9..aca2bd7 100644 --- a/config.profiles/symbian/translations/qt_he.ts +++ b/config.profiles/symbian/translations/qt_he.ts @@ -2,7780 +2,11 @@ <!DOCTYPE TS> <TS version="2.0"> <context> - <name>AudioOutput</name> - <message> - <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/> - <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Revert back to device '%1'</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>CloseButton</name> - <message> - <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/> - <source>Close Tab</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>PPDOptionsModel</name> - <message> - <source>Name</source> - <translation type="obsolete">שם</translation> - </message> -</context> -<context> - <name>Phonon::</name> - <message> - <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/> - <source>Notifications</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Music</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Video</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Communication</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Games</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Accessibility</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Phonon::Gstreamer::Backend</name> - <message> - <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/> - <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. - Some video features have been disabled.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Warning: You do not seem to have the base GStreamer plugins installed. - All audio and video support has been disabled</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Phonon::Gstreamer::MediaObject</name> - <message> - <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/> - <source>Cannot start playback. - -Check your Gstreamer installation and make sure you -have libgstreamer-plugins-base installed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+113"/> - <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+676"/> - <location line="+8"/> - <location line="+15"/> - <location line="+9"/> - <location line="+6"/> - <location line="+19"/> - <location line="+335"/> - <location line="+24"/> - <source>Could not open media source.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-403"/> - <source>Invalid source type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+377"/> - <source>Could not locate media source.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Could not open audio device. The device is already in use.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Could not decode media source.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Phonon::VolumeSlider</name> - <message> - <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/> - <location line="+18"/> - <source>Volume: %1%</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-15"/> - <location line="+18"/> - <location line="+54"/> - <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Q3Accel</name> - <message> - <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/> - <source>%1, %2 not defined</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+36"/> - <source>Ambiguous %1 not handled</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Q3DataTable</name> - <message> - <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/> - <source>True</source> - <translation type="unfinished">אמת</translation> - </message> - <message> - <location line="+1"/> - <source>False</source> - <translation type="unfinished">שקר</translation> - </message> - <message> - <location line="+505"/> - <source>Insert</source> - <translation type="unfinished">הוסף</translation> - </message> - <message> - <location line="+1"/> - <source>Update</source> - <translation type="unfinished">עדכן</translation> - </message> - <message> - <location line="+1"/> - <source>Delete</source> - <translation type="unfinished">מחק</translation> - </message> -</context> -<context> - <name>Q3FileDialog</name> - <message> - <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/> - <source>Copy or Move a File</source> - <translation type="unfinished">העתק או העבר קובץ</translation> - </message> - <message> - <location line="+8"/> - <source>Read: %1</source> - <translation type="unfinished">קרא: %1</translation> - </message> - <message> - <location line="+6"/> - <location line="+30"/> - <source>Write: %1</source> - <translation type="unfinished">כתוב: %1</translation> - </message> - <message> - <location line="-22"/> - <location line="+1575"/> - <source>Cancel</source> - <translation type="unfinished">ביטול</translation> - </message> - <message> - <location line="-157"/> - <location line="+49"/> - <location line="+2153"/> - <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/> - <source>All Files (*)</source> - <translation type="unfinished">כל הקבצים (*)</translation> - </message> - <message> - <location line="-2089"/> - <source>Name</source> - <translation type="unfinished">שם</translation> - </message> - <message> - <location line="+1"/> - <source>Size</source> - <translation type="unfinished">גודל</translation> - </message> - <message> - <location line="+2"/> - <source>Type</source> - <translation type="unfinished">סוג</translation> - </message> - <message> - <location line="+1"/> - <source>Date</source> - <translation type="unfinished">תאריך</translation> - </message> - <message> - <location line="+1"/> - <source>Attributes</source> - <translation type="unfinished">מאפיינים</translation> - </message> - <message> - <location line="+35"/> - <location line="+2031"/> - <source>&OK</source> - <translation type="unfinished">&אישור</translation> - </message> - <message> - <location line="-1991"/> - <source>Look &in:</source> - <translation type="unfinished">&חפש ב:</translation> - </message> - <message> - <location line="+1"/> - <location line="+1981"/> - <location line="+16"/> - <source>File &name:</source> - <translation type="unfinished">&שם הקובץ:</translation> - </message> - <message> - <location line="-1996"/> - <source>File &type:</source> - <translation type="unfinished">&סוג הקובץ:</translation> - </message> - <message> - <location line="+7"/> - <source>Back</source> - <translation type="unfinished">אחורה</translation> - </message> - <message> - <location line="+7"/> - <source>One directory up</source> - <translation type="unfinished">ספריה אחת למעלה</translation> - </message> - <message> - <location line="+9"/> - <source>Create New Folder</source> - <translation type="unfinished">צור תיקיה חדשה</translation> - </message> - <message> - <location line="+18"/> - <source>List View</source> - <translation type="unfinished">תצוגת רשימה</translation> - </message> - <message> - <location line="+8"/> - <source>Detail View</source> - <translation type="unfinished">תצוגת פרטים</translation> - </message> - <message> - <location line="+9"/> - <source>Preview File Info</source> - <translation type="unfinished">תצוגה מקדימה של פרטי הקובץ</translation> - </message> - <message> - <location line="+23"/> - <source>Preview File Contents</source> - <translation type="unfinished">תצוגה מקדימה של תוכן הקובץ</translation> - </message> - <message> - <location line="+88"/> - <source>Read-write</source> - <translation type="unfinished">קריאה-כתיבה</translation> - </message> - <message> - <location line="+1"/> - <source>Read-only</source> - <translation type="unfinished">קריאה-בלבד</translation> - </message> - <message> - <location line="+1"/> - <source>Write-only</source> - <translation type="unfinished">כתיבה-בלבד</translation> - </message> - <message> - <location line="+1"/> - <source>Inaccessible</source> - <translation type="unfinished">לא נגיש</translation> - </message> - <message> - <location line="+2"/> - <source>Symlink to File</source> - <translation type="unfinished">קישור סמלי לקובץ</translation> - </message> - <message> - <location line="+1"/> - <source>Symlink to Directory</source> - <translation type="unfinished">קישור סמלי לספריה</translation> - </message> - <message> - <location line="+1"/> - <source>Symlink to Special</source> - <translation type="unfinished">קישור סמלי לפריט מיוחד</translation> - </message> - <message> - <location line="+1"/> - <source>File</source> - <translation type="unfinished">קובץ</translation> - </message> - <message> - <location line="+1"/> - <source>Dir</source> - <translation type="unfinished">ספריה</translation> - </message> - <message> - <location line="+1"/> - <source>Special</source> - <translation type="unfinished">מיוחד</translation> - </message> - <message> - <location line="+704"/> - <location line="+2100"/> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/> - <source>Open</source> - <translation type="unfinished">פתח</translation> - </message> - <message> - <location line="-1990"/> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/> - <source>Save As</source> - <translation type="unfinished">שמירה בשם</translation> - </message> - <message> - <location line="+642"/> - <location line="+5"/> - <location line="+355"/> - <source>&Open</source> - <translation type="unfinished">&פתח</translation> - </message> - <message> - <location line="-357"/> - <location line="+341"/> - <source>&Save</source> - <translation type="unfinished">&שמור</translation> - </message> - <message> - <location line="-334"/> - <source>&Rename</source> - <translation type="unfinished">ש&נה שם</translation> - </message> - <message> - <location line="+1"/> - <source>&Delete</source> - <translation type="unfinished">&מחק</translation> - </message> - <message> - <location line="+20"/> - <source>R&eload</source> - <translation type="unfinished">&טען מחדש</translation> - </message> - <message> - <location line="+4"/> - <source>Sort by &Name</source> - <translation type="unfinished">סדר לפי ש&ם</translation> - </message> - <message> - <location line="+2"/> - <source>Sort by &Size</source> - <translation type="unfinished">סדר לפי &גודל</translation> - </message> - <message> - <location line="+1"/> - <source>Sort by &Date</source> - <translation type="unfinished">סדר לפי &תאריך</translation> - </message> - <message> - <location line="+2"/> - <source>&Unsorted</source> - <translation type="unfinished">&ללא סדר</translation> - </message> - <message> - <location line="+15"/> - <source>Sort</source> - <translation type="unfinished">סדר</translation> - </message> - <message> - <location line="+4"/> - <source>Show &hidden files</source> - <translation type="unfinished">הצג קבצים &מוסתרים</translation> - </message> - <message> - <location line="+31"/> - <source>the file</source> - <translation type="unfinished">הקובץ</translation> - </message> - <message> - <location line="+2"/> - <source>the directory</source> - <translation type="unfinished">הספריה</translation> - </message> - <message> - <location line="+2"/> - <source>the symlink</source> - <translation type="unfinished">הקישור הסמלי</translation> - </message> - <message> - <location line="+3"/> - <source>Delete %1</source> - <translation type="unfinished">מחק את %1</translation> - </message> - <message> - <location line="+1"/> - <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> - <translation type="unfinished"><qt>האם אתה בטוח שברצונך למחוק %1 "%2"?</qt></translation> - </message> - <message> - <location line="+2"/> - <source>&Yes</source> - <translation type="unfinished">&כן</translation> - </message> - <message> - <location line="+0"/> - <source>&No</source> - <translation type="unfinished">&לא</translation> - </message> - <message> - <location line="+36"/> - <source>New Folder 1</source> - <translation type="unfinished">תיקיה חדשה 1</translation> - </message> - <message> - <location line="+5"/> - <source>New Folder</source> - <translation type="unfinished">תיקיה חדשה</translation> - </message> - <message> - <location line="+5"/> - <source>New Folder %1</source> - <translation type="unfinished">תיקיה חדשה %1</translation> - </message> - <message> - <location line="+98"/> - <source>Find Directory</source> - <translation type="unfinished">חפש ספריה</translation> - </message> - <message> - <location line="+5"/> - <location line="+108"/> - <source>Directories</source> - <translation type="unfinished">ספריות</translation> - </message> - <message> - <location line="-2"/> - <source>Directory:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+40"/> - <location line="+1110"/> - <source>Error</source> - <translation type="unfinished">שגיאה</translation> - </message> - <message> - <location line="-1109"/> - <source>%1 -File not found. -Check path and filename.</source> - <translation type="unfinished">%1 -הקובץ לא נמצא. -בדוק את הנתיב ואת שם הקובץ.</translation> - </message> - <message> - <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/> - <source>All Files (*.*)</source> - <translation type="unfinished">כל הקבצים (*.*)</translation> - </message> - <message> - <location line="+375"/> - <source>Open </source> - <translation type="unfinished">פתח</translation> - </message> - <message> - <location line="+155"/> - <source>Select a Directory</source> - <translation type="unfinished">בחר ספריה</translation> - </message> -</context> -<context> - <name>Q3LocalFs</name> - <message> - <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/> - <location line="+10"/> - <source>Could not read directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+45"/> - <source>Could not create directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+34"/> - <source>Could not remove file or directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+27"/> - <source>Could not rename -%1 -to -%2</source> - <translation type="unfinished">לא ניתן לשנות את השם של -%1 -אל -%2</translation> - </message> - <message> - <location line="+25"/> - <source>Could not open -%1</source> - <translation type="unfinished">לא ניתן לפתוח את -%1</translation> - </message> - <message> - <location line="+68"/> - <source>Could not write -%1</source> - <translation type="unfinished">לא ניתן לכתוב את -%1</translation> - </message> -</context> -<context> - <name>Q3MainWindow</name> - <message> - <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/> - <source>Line up</source> - <translation type="unfinished">סדר בשורה</translation> - </message> - <message> - <location line="+2"/> - <source>Customize...</source> - <translation type="unfinished">התאמה אישית...</translation> - </message> -</context> -<context> - <name>Q3NetworkProtocol</name> - <message> - <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/> - <source>Operation stopped by the user</source> - <translation type="unfinished">הפעולה הופסקה על ידי המשתמש</translation> - </message> -</context> -<context> - <name>Q3ProgressDialog</name> - <message> - <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/> - <location line="+61"/> - <source>Cancel</source> - <translation type="unfinished">ביטול</translation> - </message> -</context> -<context> - <name>Q3TabDialog</name> - <message> - <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/> - <location line="+814"/> - <source>OK</source> - <translation type="unfinished">אישור</translation> - </message> - <message> - <location line="-356"/> - <source>Apply</source> - <translation type="unfinished">החל</translation> - </message> - <message> - <location line="+43"/> - <source>Help</source> - <translation type="unfinished">עזרה</translation> - </message> - <message> - <location line="+45"/> - <source>Defaults</source> - <translation type="unfinished">ברירות מחדל</translation> - </message> - <message> - <location line="+50"/> - <source>Cancel</source> - <translation type="unfinished">ביטול</translation> - </message> -</context> -<context> - <name>Q3TextEdit</name> - <message> - <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/> - <source>&Undo</source> - <translation type="unfinished">&בטל</translation> - </message> - <message> - <location line="+1"/> - <source>&Redo</source> - <translation type="unfinished">בצע &שוב</translation> - </message> - <message> - <location line="+5"/> - <source>Cu&t</source> - <translation type="unfinished">&גזור</translation> - </message> - <message> - <location line="+1"/> - <source>&Copy</source> - <translation type="unfinished">הע&תק</translation> - </message> - <message> - <location line="+2"/> - <source>&Paste</source> - <translation type="unfinished">ה&דבק</translation> - </message> - <message> - <location line="+3"/> - <source>Clear</source> - <translation type="unfinished">נקה</translation> - </message> - <message> - <location line="+4"/> - <location line="+2"/> - <source>Select All</source> - <translation type="unfinished">בחר הכל</translation> - </message> -</context> -<context> - <name>Q3TitleBar</name> - <message> - <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/> - <source>System</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Restore up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Minimize</source> - <translation type="unfinished">מזער</translation> - </message> - <message> - <location line="+3"/> - <source>Restore down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Maximize</source> - <translation type="unfinished">הגדל</translation> - </message> - <message> - <location line="+2"/> - <source>Close</source> - <translation type="unfinished">סגור</translation> - </message> - <message> - <location line="+18"/> - <source>Contains commands to manipulate the window</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Puts a minimized back to normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Moves the window out of the way</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Puts a maximized window back to normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Makes the window full screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Closes the window</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Displays the name of the window and contains controls to manipulate it</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Q3ToolBar</name> - <message> - <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/> - <source>More...</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>Q3UrlOperator</name> - <message> - <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/> - <location line="+260"/> - <location line="+4"/> - <source>The protocol `%1' is not supported</source> - <translation type="unfinished">הפרוטוקול "%1" אינו נתמך</translation> - </message> - <message> - <location line="-260"/> - <source>The protocol `%1' does not support listing directories</source> - <translation type="unfinished">הפרוטוקול "%1" לא תומך בהצגת ספריות</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support creating new directories</source> - <translation type="unfinished">הפרוטוקול "%1" לא תומך ביצירת ספריית חדשות</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support removing files or directories</source> - <translation type="unfinished">הפרוטוקול "%1" לא תומך בהסרת קבצים או ספריות</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support renaming files or directories</source> - <translation type="unfinished">הפרוטוקול "%1" לא תומך בשינוי שמותיהם של קבצים או ספריות</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support getting files</source> - <translation type="unfinished">הפרוטוקול "%1" לא תומך בהורדת קבצים</translation> - </message> - <message> - <location line="+3"/> - <source>The protocol `%1' does not support putting files</source> - <translation type="unfinished">הפרוטוקול "%1" לא תומך בהעלאת קבצים</translation> - </message> - <message> - <location line="+243"/> - <location line="+4"/> - <source>The protocol `%1' does not support copying or moving files or directories</source> - <translation type="unfinished">הפרוטוקול "%1" לא תומך בהעתקה או העברה של קבצים או ספריות</translation> - </message> - <message> - <location line="+237"/> - <location line="+1"/> - <source>(unknown)</source> - <translation type="unfinished">(לא ידוע)</translation> - </message> -</context> -<context> - <name>Q3Wizard</name> - <message> - <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/> - <source>&Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>< &Back</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>&Next ></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>&Finish</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>&Help</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QAbstractSocket</name> - <message> - <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/> - <location line="+26"/> - <source>Host not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+50"/> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/> - <source>Connection refused</source> - <translation type="unfinished">החיבור נדחה</translation> - </message> - <message> - <location line="+141"/> - <source>Connection timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-547"/> - <location line="+787"/> - <location line="+208"/> - <source>Operation on socket is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+137"/> - <source>Socket operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+380"/> - <source>Socket is not connected</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/> - <source>Network unreachable</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QAbstractSpinBox</name> - <message> - <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/> - <source>&Step up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Step &down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-8"/> - <source>&Select All</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QApplication</name> - <message> - <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/> - <source>QT_LAYOUT_DIRECTION</source> - <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> - <translation>RTL</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/> - <source>Executable '%1' requires Qt %2, found Qt %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Incompatible Qt Library Error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/> - <source>Activate</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Activates the program's main window</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QAxSelect</name> - <message> - <location filename="../src/activeqt/container/qaxselect.ui"/> - <source>Select ActiveX Control</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>OK</source> - <translation type="unfinished">אישור</translation> - </message> - <message> - <location/> - <source>&Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>COM &Object:</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QCheckBox</name> - <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/> - <source>Uncheck</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Check</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Toggle</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QColorDialog</name> - <message> - <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/> - <source>Hu&e:</source> - <translation>&גוון:</translation> - </message> - <message> - <location line="+1"/> - <source>&Sat:</source> - <translation>&הרוויה:</translation> - </message> - <message> - <location line="+1"/> - <source>&Val:</source> - <translation>&ערך:</translation> - </message> - <message> - <location line="+1"/> - <source>&Red:</source> - <translation>&אדום:</translation> - </message> - <message> - <location line="+1"/> - <source>&Green:</source> - <translation>&ירוק:</translation> - </message> - <message> - <location line="+1"/> - <source>Bl&ue:</source> - <translation>&כחול:</translation> - </message> - <message> - <location line="+1"/> - <source>A&lpha channel:</source> - <translation>ע&רוץ אלפא:</translation> - </message> - <message> - <location line="+101"/> - <source>Select Color</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+137"/> - <source>&Basic colors</source> - <translation>&צבעים בסיסיים</translation> - </message> - <message> - <location line="+1"/> - <source>&Custom colors</source> - <translation>צבעים &מותאמים אישית</translation> - </message> - <message> - <source>&Define Custom Colors >></source> - <translation type="obsolete">&הגדר צבעים מותאמים אישית >></translation> - </message> - <message> - <source>OK</source> - <translation type="obsolete">אישור</translation> - </message> - <message> - <source>Cancel</source> - <translation type="obsolete">ביטול</translation> - </message> - <message> - <location line="+1"/> - <source>&Add to Custom Colors</source> - <translation>ה&וסף לצבעים מותאמים אישית</translation> - </message> - <message> - <source>Select color</source> - <translation type="obsolete">בחירת צבע</translation> - </message> -</context> -<context> - <name>QComboBox</name> - <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/> - <location line="+65"/> - <source>Open</source> - <translation type="unfinished">פתח</translation> - </message> - <message> - <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/> - <source>False</source> - <translation type="unfinished">שקר</translation> - </message> - <message> - <location line="+1"/> - <source>True</source> - <translation type="unfinished">אמת</translation> - </message> - <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/> - <source>Close</source> - <translation type="unfinished">סגור</translation> - </message> -</context> -<context> - <name>QCoreApplication</name> - <message> - <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/> - <source>%1: key is empty</source> - <comment>QSystemSemaphore</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>%1: unable to make key</source> - <comment>QSystemSemaphore</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>%1: ftok failed</source> - <comment>QSystemSemaphore</comment> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDB2Driver</name> - <message> - <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/> - <source>Unable to connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+303"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to set autocommit</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDB2Result</name> - <message> - <location line="-1043"/> - <location line="+243"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-206"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+196"/> - <source>Unable to bind variable</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+92"/> - <source>Unable to fetch record %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to fetch next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Unable to fetch first</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDateTimeEdit</name> - <message> - <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/> - <source>AM</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>am</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>PM</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>pm</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDial</name> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/> - <source>QDial</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>SpeedoMeter</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>SliderHandle</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDialog</name> - <message> - <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/> - <source>What's This?</source> - <translation>מה זה?</translation> - </message> - <message> - <location line="-115"/> - <source>Done</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDialogButtonBox</name> - <message> - <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/> - <location line="+464"/> - <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/> - <source>OK</source> - <translation type="unfinished">אישור</translation> - </message> - <message> - <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/> - <source>Save</source> - <translation type="unfinished">שמור</translation> - </message> - <message> - <location line="+0"/> - <source>&Save</source> - <translation type="unfinished">&שמור</translation> - </message> - <message> - <location line="+3"/> - <source>Open</source> - <translation type="unfinished">פתח</translation> - </message> - <message> - <location line="+3"/> - <source>Cancel</source> - <translation type="unfinished">ביטול</translation> - </message> - <message> - <location line="+0"/> - <source>&Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Close</source> - <translation type="unfinished">סגור</translation> - </message> - <message> - <location line="+0"/> - <source>&Close</source> - <translation type="unfinished">&סגור</translation> - </message> - <message> - <location line="+3"/> - <source>Apply</source> - <translation type="unfinished">החל</translation> - </message> - <message> - <location line="+3"/> - <source>Reset</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Help</source> - <translation type="unfinished">עזרה</translation> - </message> - <message> - <location line="+4"/> - <source>Don't Save</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Discard</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>&Yes</source> - <translation type="unfinished">&כן</translation> - </message> - <message> - <location line="+3"/> - <source>Yes to &All</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>&No</source> - <translation type="unfinished">&לא</translation> - </message> - <message> - <location line="+3"/> - <source>N&o to All</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Save All</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Abort</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Retry</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Ignore</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Restore Defaults</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-29"/> - <source>Close without Saving</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-27"/> - <source>&OK</source> - <translation type="unfinished">&אישור</translation> - </message> -</context> -<context> - <name>QDirModel</name> - <message> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/> - <source>Name</source> - <translation type="unfinished">שם</translation> - </message> - <message> - <location line="+1"/> - <source>Size</source> - <translation type="unfinished">גודל</translation> - </message> - <message> - <location line="+3"/> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Type</source> - <comment>All other platforms</comment> - <translation type="unfinished">סוג</translation> - </message> - <message> - <location line="+6"/> - <source>Date Modified</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDockWidget</name> - <message> - <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/> - <source>Close</source> - <translation type="unfinished">סגור</translation> - </message> - <message> - <location line="+2"/> - <source>Dock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Float</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QDoubleSpinBox</name> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/> - <source>More</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Less</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QErrorMessage</name> - <message> - <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+391"/> - <source>&Show this message again</source> - <translation>&הצג הודעה זו שנית</translation> - </message> - <message> - <location line="+1"/> - <source>&OK</source> - <translation>&אישור</translation> - </message> - <message> - <location line="-200"/> - <source>Debug Message:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Warning:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Fatal Error:</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFile</name> - <message> - <location filename="../src/corelib/io/qfile.cpp" line="+708"/> - <location line="+141"/> - <source>Destination file exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-108"/> - <source>Cannot remove source file</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+120"/> - <source>Cannot open %1 for input</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Cannot open for output</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Failure to write block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Cannot create %1 for output</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFileDialog</name> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/> - <location line="+444"/> - <source>All Files (*)</source> - <translation>כל הקבצים (*)</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Back</source> - <translation type="unfinished">אחורה</translation> - </message> - <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>List View</source> - <translation type="unfinished">תצוגת רשימה</translation> - </message> - <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Detail View</source> - <translation type="unfinished">תצוגת פרטים</translation> - </message> - <message> - <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+414"/> - <location line="+1"/> - <source>File</source> - <translation type="unfinished">קובץ</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-461"/> - <source>Open</source> - <translation>פתח</translation> - </message> - <message> - <location line="+2"/> - <source>Save As</source> - <translation type="unfinished">שמירה בשם</translation> - </message> - <message> - <location line="+678"/> - <location line="+50"/> - <location line="+1471"/> - <location line="+75"/> - <source>&Open</source> - <translation>&פתח</translation> - </message> - <message> - <location line="-1596"/> - <location line="+50"/> - <source>&Save</source> - <translation>&שמור</translation> - </message> - <message> - <location line="-699"/> - <source>&Rename</source> - <translation type="unfinished">ש&נה שם</translation> - </message> - <message> - <location line="+1"/> - <source>&Delete</source> - <translation type="unfinished">&מחק</translation> - </message> - <message> - <location line="+1"/> - <source>Show &hidden files</source> - <translation type="unfinished">הצג קבצים &מוסתרים</translation> - </message> - <message> - <location line="+1964"/> - <source>New Folder</source> - <translation type="unfinished">תיקיה חדשה</translation> - </message> - <message> - <location line="-1999"/> - <source>Find Directory</source> - <translation type="unfinished">חפש ספריה</translation> - </message> - <message> - <location line="+685"/> - <source>Directories</source> - <translation>ספריות</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/> - <source>All Files (*.*)</source> - <translation type="unfinished">כל הקבצים (*.*)</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+832"/> - <source>%1 already exists. -Do you want to replace it?</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>%1 -File not found. -Please verify the correct file name was given.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/> - <source>My Computer</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Parent Directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Files of type:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1496"/> - <location line="+648"/> - <source>Directory:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+794"/> - <location line="+862"/> - <source>%1 -Directory not found. -Please verify the correct directory name was given.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-218"/> - <source>'%1' is write protected. -Do you want to delete it anyway?</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Are sure you want to delete '%1'?</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Could not delete directory.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+407"/> - <source>Recent Places</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="-4"/> - <source>Drive</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+33"/> - <source>Unknown</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2525"/> - <source>Show </source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Forward</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+7"/> - <source>&New Folder</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+656"/> - <location line="+38"/> - <source>&Choose</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/> - <source>Remove</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/> - <location line="+652"/> - <source>File &name:</source> - <translation type="unfinished">&שם הקובץ:</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfiledialog.ui"/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Look in:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> - <source>Create New Folder</source> - <translation type="unfinished">צור תיקיה חדשה</translation> - </message> -</context> -<context> - <name>QFileSystemModel</name> - <message> - <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+744"/> - <source>%1 TB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>%1 GB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>%1 MB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>%1 KB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>%1 bytes</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+77"/> - <source>Invalid filename</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+63"/> - <source>Name</source> - <translation type="unfinished">שם</translation> - </message> - <message> - <location line="+2"/> - <source>Size</source> - <translation type="unfinished">גודל</translation> - </message> - <message> - <location line="+4"/> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Type</source> - <comment>All other platforms</comment> - <translation type="unfinished">סוג</translation> - </message> - <message> - <location line="+7"/> - <source>Date Modified</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/> - <source>My Computer</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Computer</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFontDatabase</name> - <message> - <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/> - <location line="+1176"/> - <source>Normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1173"/> - <location line="+12"/> - <location line="+1149"/> - <source>Bold</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1158"/> - <location line="+1160"/> - <source>Demi Bold</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1157"/> - <location line="+18"/> - <location line="+1135"/> - <source>Black</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1145"/> - <source>Demi</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <location line="+1145"/> - <source>Light</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1004"/> - <location line="+1007"/> - <source>Italic</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1004"/> - <location line="+1006"/> - <source>Oblique</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+705"/> - <source>Any</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Latin</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Greek</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Cyrillic</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Armenian</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Hebrew</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Arabic</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Syriac</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Thaana</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Devanagari</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Bengali</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Gurmukhi</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Gujarati</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Oriya</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Tamil</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Telugu</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Kannada</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Malayalam</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Sinhala</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Thai</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Lao</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Tibetan</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Myanmar</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Georgian</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Khmer</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Simplified Chinese</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Traditional Chinese</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Japanese</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Korean</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Vietnamese</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Symbol</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Ogham</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Runic</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFontDialog</name> - <message> - <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/> - <source>&Font</source> - <translation>&גופן</translation> - </message> - <message> - <location line="+1"/> - <source>Font st&yle</source> - <translation>&סגנון גופן</translation> - </message> - <message> - <location line="+1"/> - <source>&Size</source> - <translation>גו&דל</translation> - </message> - <message> - <location line="+1"/> - <source>Effects</source> - <translation>אפקטים</translation> - </message> - <message> - <location line="+1"/> - <source>Stri&keout</source> - <translation>קו &חוצה</translation> - </message> - <message> - <location line="+1"/> - <source>&Underline</source> - <translation>קו &תחתי</translation> - </message> - <message> - <location line="+1"/> - <source>Sample</source> - <translation>דוגמה</translation> - </message> - <message> - <location line="-603"/> - <location line="+247"/> - <source>Select Font</source> - <translation>בחר גופן</translation> - </message> - <message> - <location line="+357"/> - <source>Wr&iting System</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QFtp</name> - <message> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+2303"/> - <source>Host %1 found</source> - <translation type="unfinished">המארח %1 נמצא</translation> - </message> - <message> - <location line="+7"/> - <source>Host found</source> - <translation type="unfinished">המארח נמצא</translation> - </message> - <message> - <location filename="../src/network/access/qftp.cpp" line="+1003"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1456"/> - <location line="+1451"/> - <source>Connected to host %1</source> - <translation>מחובר למארח %1</translation> - </message> - <message> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+7"/> - <source>Connected to host</source> - <translation type="unfinished">מחובר למארח</translation> - </message> - <message> - <location line="-5"/> - <source>Connection to %1 closed</source> - <translation type="unfinished">החיבור אל %1 נסגר</translation> - </message> - <message> - <location filename="../src/network/access/qftp.cpp" line="+1375"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-243"/> - <location line="+250"/> - <source>Connection closed</source> - <translation>החיבור נסגר</translation> - </message> - <message> - <location line="-1487"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1566"/> - <source>Host %1 not found</source> - <translation type="unfinished">המארח %1 לא נמצא</translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/> - <source>Connection refused to host %1</source> - <translation type="unfinished">החיבור אל המארח %1 נדחה</translation> - </message> - <message> - <location line="+4"/> - <source>Connection timed out to host %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+501"/> - <location line="+29"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+458"/> - <location line="+728"/> - <source>Unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+889"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/> - <source>Connecting to host failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Login failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Listing directory failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Changing directory failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Downloading file failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Uploading file failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Removing file failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Creating directory failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> - <source>Removing directory failed: -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-1524"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="-1356"/> - <source>Not connected</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+396"/> - <location filename="../src/qt3support/network/q3ftp.cpp" line="+332"/> - <source>Connection refused for data connection</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QHostInfo</name> - <message> - <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/> - <source>Unknown error</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QHostInfoAgent</name> - <message> - <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/> - <location line="+9"/> - <location line="+64"/> - <location line="+31"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/> - <location line="+9"/> - <location line="+40"/> - <location line="+27"/> - <source>Host not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-44"/> - <location line="+39"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/> - <location line="+29"/> - <source>Unknown address type</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/> - <location line="+27"/> - <source>Unknown error</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QHttp</name> - <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+1836"/> - <source>Connection refused</source> - <translation>החיבור נדחה</translation> - </message> - <message> - <location filename="../src/network/access/qhttp.cpp" line="+2631"/> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> - <source>Host %1 not found</source> - <translation>המארח %1 לא נמצא</translation> - </message> - <message> - <location line="-62"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-45"/> - <source>Wrong content length</source> - <translation>אורך תוכן שגוי</translation> - </message> - <message> - <location line="-2204"/> - <source>HTTPS connection requested but SSL support not compiled in</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2286"/> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/> - <location line="+19"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+48"/> - <source>HTTP request failed</source> - <translation>בקשת ה-HTTP נכשלה</translation> - </message> - <message> - <location filename="../src/qt3support/network/q3http.cpp" line="+450"/> - <source>Host %1 found</source> - <translation type="unfinished">המארח %1 נמצא</translation> - </message> - <message> - <location line="+14"/> - <source>Host found</source> - <translation type="unfinished">המארח נמצא</translation> - </message> - <message> - <location line="-11"/> - <source>Connected to host %1</source> - <translation type="unfinished">מחובר למארח %1</translation> - </message> - <message> - <location line="+14"/> - <source>Connected to host</source> - <translation type="unfinished">מחובר למארח</translation> - </message> - <message> - <location line="-11"/> - <source>Connection to %1 closed</source> - <translation type="unfinished">החיבור אל %1 נסגר</translation> - </message> - <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+14"/> - <source>Connection closed</source> - <translation type="unfinished">החיבור נסגר</translation> - </message> - <message> - <location filename="../src/network/access/qhttp.cpp" line="-1077"/> - <location line="+820"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-1152"/> - <location line="+567"/> - <source>Unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-568"/> - <location filename="../src/qt3support/network/q3http.cpp" line="-370"/> - <source>Request aborted</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+579"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+381"/> - <source>No server set to connect to</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+168"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+60"/> - <source>Server closed connection unexpectedly</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+151"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+113"/> - <source>Invalid HTTP response header</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+28"/> - <source>Unknown authentication method</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+97"/> - <location line="+48"/> - <location filename="../src/qt3support/network/q3http.cpp" line="+40"/> - <location line="+47"/> - <source>Invalid HTTP chunked body</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+38"/> - <source>Error writing response to device</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-173"/> - <source>Proxy authentication required</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Authentication required</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-138"/> - <source>Connection refused (or timed out)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/> - <source>Proxy requires authentication</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Host requires authentication</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Data corrupted</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unknown protocol specified</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>SSL handshake failed</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QHttpSocketEngine</name> - <message> - <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/> - <source>Did not receive HTTP response from proxy</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+25"/> - <source>Error parsing authentication request from proxy</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+31"/> - <source>Authentication required</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+27"/> - <source>Proxy denied connection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Error communicating with HTTP proxy</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>Proxy server not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Proxy connection refused</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Proxy server connection timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Proxy connection closed prematurely</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QIBaseDriver</name> - <message> - <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/> - <source>Error opening database</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+54"/> - <source>Could not start transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QIBaseResult</name> - <message> - <location line="-1097"/> - <source>Unable to create BLOB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unable to write BLOB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>Unable to open BLOB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>Unable to read BLOB</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+125"/> - <location line="+189"/> - <source>Could not find array</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-157"/> - <source>Could not get array data</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+212"/> - <source>Could not get query info</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Could not start transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+33"/> - <source>Could not allocate statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Could not prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <location line="+7"/> - <source>Could not describe input statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Could not describe statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+115"/> - <source>Unable to close statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Unable to execute query</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+46"/> - <source>Could not fetch next item</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+160"/> - <source>Could not get statement info</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QIODevice</name> - <message> - <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/> - <source>Permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Too many open files</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>No such file or directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>No space left on device</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/> - <source>Unknown error</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QInputContext</name> - <message> - <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/> - <source>XIM</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>XIM input method</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Windows input method</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Mac OS X input method</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QInputDialog</name> - <message> - <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/> - <source>Enter a value:</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QLibrary</name> - <message> - <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/> - <source>Could not mmap '%1': %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+22"/> - <source>Plugin verification data mismatch in '%1'</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Could not unmap '%1': %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+302"/> - <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+340"/> - <source>Unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-377"/> - <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/> - <source>The shared library was not found.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>The file '%1' is not a valid Qt plugin.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+43"/> - <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/> - <source>Cannot load library %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/> - <source>Cannot unload library %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+31"/> - <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/> - <source>Cannot resolve symbol "%1" in %2: %3</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QLineEdit</name> - <message> - <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/> - <source>&Undo</source> - <translation type="unfinished">&בטל</translation> - </message> - <message> - <location line="+4"/> - <source>&Redo</source> - <translation type="unfinished">בצע &שוב</translation> - </message> - <message> - <location line="+7"/> - <source>Cu&t</source> - <translation type="unfinished">&גזור</translation> - </message> - <message> - <location line="+4"/> - <source>&Copy</source> - <translation type="unfinished">הע&תק</translation> - </message> - <message> - <location line="+4"/> - <source>&Paste</source> - <translation type="unfinished">ה&דבק</translation> - </message> - <message> - <location line="+11"/> - <source>Select All</source> - <translation type="unfinished">בחר הכל</translation> - </message> - <message> - <location line="-6"/> - <source>Delete</source> - <translation type="unfinished">מחק</translation> - </message> -</context> -<context> - <name>QLocalServer</name> - <message> - <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/> - <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/> - <source>%1: Name error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/> - <source>%1: Permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>%1: Address in use</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/> - <source>%1: Unknown error %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QLocalSocket</name> - <message> - <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/> - <source>%1: Connection refused</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Remote closed</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/> - <location line="+43"/> - <source>%1: Invalid name</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Socket access error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Socket resource error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Socket operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: Datagram too large</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/> - <source>%1: Connection error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> - <source>%1: The socket operation is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1: Unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/> - <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/> - <source>%1: Unknown error %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMYSQLDriver</name> - <message> - <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/> - <source>Unable to open database '</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Unable to connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+127"/> - <source>Unable to begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMYSQLResult</name> - <message> - <location line="-922"/> - <source>Unable to fetch data</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+176"/> - <source>Unable to execute query</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unable to store result</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+190"/> - <location line="+8"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+34"/> - <source>Unable to reset statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+87"/> - <source>Unable to bind value</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <location line="+21"/> - <source>Unable to bind outvalues</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-12"/> - <source>Unable to store statement results</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-253"/> - <source>Unable to execute next query</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Unable to store next result</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMdiArea</name> - <message> - <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/> - <source>(Untitled)</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMdiSubWindow</name> - <message> - <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/> - <source>%1 - [%2]</source> - <translation type="unfinished">%1 - [%2]</translation> - </message> - <message> - <location line="+72"/> - <source>Close</source> - <translation type="unfinished">סגור</translation> - </message> - <message> - <location line="-18"/> - <source>Minimize</source> - <translation type="unfinished">מזער</translation> - </message> - <message> - <location line="+13"/> - <source>Restore Down</source> - <translation type="unfinished">שחזר למטה</translation> - </message> - <message> - <location line="+707"/> - <source>&Restore</source> - <translation type="unfinished">ש&חזר</translation> - </message> - <message> - <location line="+3"/> - <source>&Move</source> - <translation type="unfinished">ה&זז</translation> - </message> - <message> - <location line="+1"/> - <source>&Size</source> - <translation type="unfinished">גו&דל</translation> - </message> - <message> - <location line="+1"/> - <source>Mi&nimize</source> - <translation type="unfinished">&מזער</translation> - </message> - <message> - <location line="+2"/> - <source>Ma&ximize</source> - <translation type="unfinished">&הגדל</translation> - </message> - <message> - <location line="+2"/> - <source>Stay on &Top</source> - <translation type="unfinished">&תמיד עליון</translation> - </message> - <message> - <location line="+3"/> - <source>&Close</source> - <translation type="unfinished">&סגור</translation> - </message> - <message> - <location line="-787"/> - <source>- [%1]</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+58"/> - <source>Maximize</source> - <translation type="unfinished">הגדל</translation> - </message> - <message> - <location line="+3"/> - <source>Unshade</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Shade</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Restore</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Help</source> - <translation type="unfinished">עזרה</translation> - </message> - <message> - <location line="+3"/> - <source>Menu</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMenu</name> - <message> - <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/> - <location line="+225"/> - <source>Close</source> - <translation type="unfinished">סגור</translation> - </message> - <message> - <location line="-224"/> - <location line="+225"/> - <source>Open</source> - <translation type="unfinished">פתח</translation> - </message> - <message> - <location line="-223"/> - <location line="+225"/> - <location line="+51"/> - <source>Execute</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMenuBar</name> - <message> - <source>Options</source> - <translation type="obsolete">אפשרויות</translation> - </message> -</context> -<context> - <name>QMessageBox</name> - <message> - <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1964"/> - <location line="+852"/> - <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/> - <location line="+8"/> - <source>OK</source> - <translation>אישור</translation> - </message> - <message> - <location line="+509"/> - <source>About Qt</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-508"/> - <source>Help</source> - <translation type="unfinished">עזרה</translation> - </message> - <message> - <location line="-1097"/> - <source>Show Details...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Hide Details...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1570"/> - <source><h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMultiInputContext</name> - <message> - <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/> - <source>Select IM</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QMultiInputContextPlugin</name> - <message> - <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/> - <source>Multiple input method switcher</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Multiple input method switcher that uses the context menu of the text widgets</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNativeSocketEngine</name> - <message> - <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/> - <source>The remote host closed the connection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Network operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Out of resources</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unsupported socket operation</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Protocol type not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Invalid socket descriptor</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Network unreachable</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Connection timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Connection refused</source> - <translation type="unfinished">החיבור נדחה</translation> - </message> - <message> - <location line="+3"/> - <source>The bound address is already in use</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>The address is not available</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>The address is protected</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unable to send a message</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unable to receive a message</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unable to write</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Network error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Another socket is already listening on the same port</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-66"/> - <source>Unable to initialize non-blocking socket</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Unable to initialize broadcast socket</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Host unreachable</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+24"/> - <source>Datagram was too large to send</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+18"/> - <source>Operation on non-socket</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-3"/> - <source>The proxy type is invalid for this operation</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkAccessCacheBackend</name> - <message> - <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/> - <source>Error opening %1</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkAccessFileBackend</name> - <message> - <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/> - <source>Request for opening non-local file %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+42"/> - <source>Error opening %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+56"/> - <source>Write error writing to %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+33"/> - <source>Cannot open %1: Path is a directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Read error reading from %1: %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkAccessFtpBackend</name> - <message> - <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/> - <source>No suitable proxy found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>Cannot open %1: is a directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+130"/> - <source>Logging in to %1 failed: authentication required</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+39"/> - <source>Error while downloading %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Error while uploading %1: %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkAccessHttpBackend</name> - <message> - <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/> - <source>No suitable proxy found</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkReply</name> - <message> - <location line="+128"/> - <source>Error downloading %1 - server replied: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/> - <source>Protocol "%1" is unknown</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QNetworkReplyImpl</name> - <message> - <location line="+432"/> - <location line="+22"/> - <source>Operation canceled</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QOCIDriver</name> - <message> - <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/> - <source>Unable to logon</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-144"/> - <source>Unable to initialize</source> - <comment>QOCIDriver</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+215"/> - <source>Unable to begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QOCIResult</name> - <message> - <location line="-963"/> - <location line="+161"/> - <location line="+15"/> - <source>Unable to bind column for batch execute</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to execute batch statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+302"/> - <source>Unable to goto next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+59"/> - <source>Unable to alloc statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+36"/> - <source>Unable to bind value</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QODBCDriver</name> - <message> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/> - <source>Unable to connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Unable to connect - Driver doesn't support all needed functionality</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+242"/> - <source>Unable to disable autocommit</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to enable autocommit</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QODBCResult</name> - <message> - <location line="-1218"/> - <location line="+349"/> - <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-332"/> - <location line="+626"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-555"/> - <source>Unable to fetch next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+279"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+268"/> - <source>Unable to bind variable</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/> - <location line="+578"/> - <source>Unable to fetch last</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/> - <source>Unable to fetch</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+44"/> - <source>Unable to fetch first</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Unable to fetch previous</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QObject</name> - <message> - <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/> - <source>Home</source> - <translation type="unfinished">Home</translation> - </message> - <message> - <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/> - <source>Operation not supported on %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+53"/> - <source>Invalid URI: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/> - <source>Write error writing to %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+57"/> - <source>Read error reading from %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+31"/> - <source>Socket error on %1: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Remote host closed the connection prematurely on %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+53"/> - <source>Protocol error: packet of size 0 received</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/> - <location line="+57"/> - <source>No host name given</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPPDOptionsModel</name> - <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/> - <source>Name</source> - <translation type="unfinished">שם</translation> - </message> - <message> - <location line="+2"/> - <source>Value</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPSQLDriver</name> - <message> - <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/> - <source>Unable to connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+49"/> - <source>Could not begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Could not commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>Could not rollback transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+358"/> - <source>Unable to subscribe</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+32"/> - <source>Unable to unsubscribe</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPSQLResult</name> - <message> - <location line="-1058"/> - <source>Unable to create query</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+374"/> - <source>Unable to prepare statement</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPageSetupWidget</name> - <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/> - <source>Centimeters (cm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Millimeters (mm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Inches (in)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Points (pt)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/> - <source>Form</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Paper</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Page size:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Width:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Height:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Paper source:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Orientation</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Portrait</source> - <translation type="unfinished">לאורך</translation> - </message> - <message> - <location/> - <source>Landscape</source> - <translation type="unfinished">לרוחב</translation> - </message> - <message> - <location/> - <source>Reverse landscape</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Reverse portrait</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Margins</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>top margin</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>left margin</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>right margin</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>bottom margin</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPluginLoader</name> - <message> - <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/> - <source>Unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-68"/> - <source>The plugin was not loaded.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintDialog</name> - <message> - <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/> - <source>locally connected</source> - <translation>מחוברת מקומית</translation> - </message> - <message> - <location line="+23"/> - <location line="+225"/> - <source>Aliases: %1</source> - <translation>שמות נוספים: %1</translation> - </message> - <message> - <location line="+223"/> - <location line="+199"/> - <source>unknown</source> - <translation>לא ידוע</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/> - <source>OK</source> - <translation type="unfinished">אישור</translation> - </message> - <message> - <source>Cancel</source> - <translation type="obsolete">ביטול</translation> - </message> - <message> - <source>Print in color if available</source> - <translation type="obsolete">הדפס בצבע אם הדבר זמין</translation> - </message> - <message> - <source>Printer</source> - <translation type="obsolete">מדפסת</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+375"/> - <source>Print all</source> - <translation type="unfinished">הדפס הכל</translation> - </message> - <message> - <location line="+2"/> - <source>Print range</source> - <translation type="unfinished">טווח הדפסה</translation> - </message> - <message> - <source>Print last page first</source> - <translation type="obsolete">הדפס את העמוד הראשון אחרון</translation> - </message> - <message> - <source>Number of copies:</source> - <translation type="obsolete">מספר עותקים:</translation> - </message> - <message> - <source>Paper format</source> - <translation type="obsolete">תבנית נייר</translation> - </message> - <message> - <source>Portrait</source> - <translation type="obsolete">לאורך</translation> - </message> - <message> - <source>Landscape</source> - <translation type="obsolete">לרוחב</translation> - </message> - <message> - <location line="-48"/> - <source>A0 (841 x 1189 mm)</source> - <translation>A0 (841 x 1189 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>A1 (594 x 841 mm)</source> - <translation>A1 (594 x 841 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>A2 (420 x 594 mm)</source> - <translation>A2 (420 x 594 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>A3 (297 x 420 mm)</source> - <translation>A3 (297 x 420 mm)</translation> - </message> - <message> - <location line="+2"/> - <source>A5 (148 x 210 mm)</source> - <translation>A5 (148 x 210 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>A6 (105 x 148 mm)</source> - <translation>A6 (105 x 148 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>A7 (74 x 105 mm)</source> - <translation>A7 (74 x 105 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>A8 (52 x 74 mm)</source> - <translation>A8 (52 x 74 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>A9 (37 x 52 mm)</source> - <translation>A9 (37 x 52 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B0 (1000 x 1414 mm)</source> - <translation>B0 (1000 x 1414 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B1 (707 x 1000 mm)</source> - <translation>B1 (707 x 1000 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B2 (500 x 707 mm)</source> - <translation>B2 (500 x 707 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B3 (353 x 500 mm)</source> - <translation>B3 (353 x 500 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B4 (250 x 353 mm)</source> - <translation>B4 (250 x 353 mm)</translation> - </message> - <message> - <location line="+2"/> - <source>B6 (125 x 176 mm)</source> - <translation>B6 (125 x 176 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B7 (88 x 125 mm)</source> - <translation>B7 (88 x 125 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B8 (62 x 88 mm)</source> - <translation>B8 (62 x 88 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B9 (44 x 62 mm)</source> - <translation>B9 (44 x 62 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>B10 (31 x 44 mm)</source> - <translation>B10 (31 x 44 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>C5E (163 x 229 mm)</source> - <translation>C5E (163 x 229 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>DLE (110 x 220 mm)</source> - <translation>DLE (110 x 220 mm)</translation> - </message> - <message> - <location line="+2"/> - <source>Folio (210 x 330 mm)</source> - <translation>Folio (210 x 330 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>Ledger (432 x 279 mm)</source> - <translation>Ledger (432 x 279 mm)</translation> - </message> - <message> - <location line="+3"/> - <source>Tabloid (279 x 432 mm)</source> - <translation>Tabloid (279 x 432 mm)</translation> - </message> - <message> - <location line="+1"/> - <source>US Common #10 Envelope (105 x 241 mm)</source> - <translation>US Common #10 Envelope (105 x 241 mm)</translation> - </message> - <message> - <location line="-25"/> - <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/> - <location line="+13"/> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/> - <source>Print</source> - <translation type="unfinished">הדפס</translation> - </message> - <message> - <source>File</source> - <translation type="obsolete">קובץ</translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/> - <source>Print To File ...</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Other</source> - <translation type="obsolete">אחר</translation> - </message> - <message> - <location line="+80"/> - <source>File %1 is not writable. -Please choose a different file name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1 already exists. -Do you want to overwrite it?</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-208"/> - <source>File exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source><qt>Do you want to overwrite it?</qt></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+227"/> - <source>Print selection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/> - <source>%1 is a directory. -Please choose a different file name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/> - <source>A0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A4</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A5</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A6</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A7</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A8</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>A9</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B4</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B5</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B6</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B7</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B8</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B9</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>B10</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>C5E</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>DLE</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Executive</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Folio</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Ledger</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Legal</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Letter</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Tabloid</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>US Common #10 Envelope</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Custom</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/> - <location line="+68"/> - <source>&Options >></source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-63"/> - <source>&Print</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+67"/> - <source>&Options <<</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+253"/> - <source>Print to File (PDF)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Print to File (Postscript)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+45"/> - <source>Local file</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Write %1 file</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/> - <source>The 'From' value cannot be greater than the 'To' value.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintPreviewDialog</name> - <message> - <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/> - <location line="+12"/> - <source>Page Setup</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/> - <source>%1%</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+79"/> - <source>Print Preview</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+29"/> - <source>Next page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Previous page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>First page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Last page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Fit width</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Fit page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Zoom in</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Zoom out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Portrait</source> - <translation type="unfinished">לאורך</translation> - </message> - <message> - <location line="+1"/> - <source>Landscape</source> - <translation type="unfinished">לרוחב</translation> - </message> - <message> - <location line="+10"/> - <source>Show single page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Show facing pages</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Show overview of all pages</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Print</source> - <translation type="unfinished">הדפס</translation> - </message> - <message> - <location line="+1"/> - <source>Page setup</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Close</source> - <translation type="unfinished">סגור</translation> - </message> - <message> - <location line="+151"/> - <source>Export to PDF</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Export to PostScript</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintPropertiesDialog</name> - <message> - <source>Save</source> - <translation type="obsolete">שמור</translation> - </message> - <message> - <source>OK</source> - <translation type="obsolete">אישור</translation> - </message> -</context> -<context> - <name>QPrintPropertiesWidget</name> - <message> - <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/> - <source>Form</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Page</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Advanced</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintSettingsOutput</name> - <message> - <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/> - <source>Form</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Copies</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Print range</source> - <translation type="unfinished">טווח הדפסה</translation> - </message> - <message> - <location/> - <source>Print all</source> - <translation type="unfinished">הדפס הכל</translation> - </message> - <message> - <location/> - <source>Pages from</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>to</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Selection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Output Settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Copies:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Collate</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Reverse</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Options</source> - <translation type="unfinished">אפשרויות</translation> - </message> - <message> - <location/> - <source>Color Mode</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Color</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Grayscale</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Duplex Printing</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>None</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Long side</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Short side</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QPrintWidget</name> - <message> - <location filename="../src/gui/dialogs/qprintwidget.ui"/> - <source>Form</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Printer</source> - <translation type="unfinished">מדפסת</translation> - </message> - <message> - <location/> - <source>&Name:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>P&roperties</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Location:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Preview</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Type:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>Output &file:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location/> - <source>...</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QProcess</name> - <message> - <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/> - <source>Could not open input redirection for reading</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/> - <source>Could not open output redirection for writing</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+235"/> - <source>Resource error (fork failure): %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+259"/> - <location line="+53"/> - <location line="+74"/> - <location line="+67"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/> - <location line="+50"/> - <location line="+75"/> - <location line="+42"/> - <location line="+54"/> - <source>Process operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/io/qprocess.cpp" line="+533"/> - <location line="+52"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/> - <location line="+50"/> - <source>Error reading from process</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+47"/> - <location line="+779"/> - <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/> - <source>Error writing to process</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-709"/> - <source>Process crashed</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+912"/> - <source>No program defined</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/> - <source>Process failed to start</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QProgressDialog</name> - <message> - <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/> - <source>Cancel</source> - <translation>ביטול</translation> - </message> -</context> -<context> - <name>QPushButton</name> - <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/> - <source>Open</source> - <translation type="unfinished">פתח</translation> - </message> -</context> -<context> - <name>QRadioButton</name> - <message> - <location line="+12"/> - <source>Check</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QRegExp</name> - <message> - <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/> - <source>no error occurred</source> - <translation type="unfinished">לא אירעה כל שגיאה</translation> - </message> - <message> - <location line="+1"/> - <source>disabled feature used</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>bad char class syntax</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>bad lookahead syntax</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>bad repetition syntax</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>invalid octal value</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>missing left delim</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>unexpected end</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>met internal limit</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSQLite2Driver</name> - <message> - <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/> - <source>Error to open database</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+41"/> - <source>Unable to begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Unable to rollback Transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSQLite2Result</name> - <message> - <location line="-323"/> - <source>Unable to fetch results</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+147"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSQLiteDriver</name> - <message> - <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/> - <source>Error opening database</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Error closing database</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Unable to begin transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to commit transaction</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Unable to rollback transaction</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSQLiteResult</name> - <message> - <location line="-400"/> - <location line="+66"/> - <location line="+8"/> - <source>Unable to fetch row</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+63"/> - <source>Unable to execute statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Unable to reset statement</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+45"/> - <source>Unable to bind parameters</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Parameter count mismatch</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-208"/> - <source>No query</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QScrollBar</name> - <message> - <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/> - <source>Scroll here</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Left edge</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Top</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Right edge</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Bottom</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Page left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/> - <source>Page up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Page right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/> - <source>Page down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Scroll left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Scroll right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/> - <source>Line up</source> - <translation type="unfinished">סדר בשורה</translation> - </message> - <message> - <location line="+4"/> - <source>Position</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Line down</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSharedMemory</name> - <message> - <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/> - <source>%1: unable to set key on lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+81"/> - <source>%1: create size is less then 0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+168"/> - <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/> - <source>%1: unable to lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+22"/> - <source>%1: unable to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/> - <source>%1: permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/> - <source>%1: already exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> - <source>%1: doesn't exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> - <source>%1: out of resources</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/> - <source>%1: unknown error %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>%1: key is empty</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>%1: unix key file doesn't exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>%1: ftok failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+51"/> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/> - <source>%1: unable to make key</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>%1: system-imposed size restrictions</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+53"/> - <source>%1: not attached</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/> - <source>%1: invalid size</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+68"/> - <source>%1: key error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+38"/> - <source>%1: size query failed</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QShortcut</name> - <message> - <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/> - <source>Space</source> - <translation type="unfinished">רווח</translation> - </message> - <message> - <location line="+1"/> - <source>Esc</source> - <translation type="unfinished">Esc</translation> - </message> - <message> - <location line="+1"/> - <source>Tab</source> - <translation type="unfinished">Tab</translation> - </message> - <message> - <location line="+1"/> - <source>Backtab</source> - <translation type="unfinished">Backtab</translation> - </message> - <message> - <location line="+1"/> - <source>Backspace</source> - <translation type="unfinished">Backspace</translation> - </message> - <message> - <location line="+1"/> - <source>Return</source> - <translation type="unfinished">Return</translation> - </message> - <message> - <location line="+1"/> - <source>Enter</source> - <translation type="unfinished">Enter</translation> - </message> - <message> - <location line="+1"/> - <source>Ins</source> - <translation type="unfinished">Ins</translation> - </message> - <message> - <location line="+1"/> - <source>Del</source> - <translation type="unfinished">Del</translation> - </message> - <message> - <location line="+1"/> - <source>Pause</source> - <translation type="unfinished">Pause</translation> - </message> - <message> - <location line="+1"/> - <source>Print</source> - <translation type="unfinished">הדפס</translation> - </message> - <message> - <location line="+1"/> - <source>SysReq</source> - <translation type="unfinished">SysReq</translation> - </message> - <message> - <location line="+1"/> - <source>Home</source> - <translation type="unfinished">Home</translation> - </message> - <message> - <location line="+1"/> - <source>End</source> - <translation type="unfinished">End</translation> - </message> - <message> - <location line="+1"/> - <source>Left</source> - <translation type="unfinished">שמאלה</translation> - </message> - <message> - <location line="+1"/> - <source>Up</source> - <translation type="unfinished">למעלה</translation> - </message> - <message> - <location line="+1"/> - <source>Right</source> - <translation type="unfinished">ימינה</translation> - </message> - <message> - <location line="+1"/> - <source>Down</source> - <translation type="unfinished">למטה</translation> - </message> - <message> - <location line="+1"/> - <source>PgUp</source> - <translation type="unfinished">PgUp</translation> - </message> - <message> - <location line="+1"/> - <source>PgDown</source> - <translation type="unfinished">PgDown</translation> - </message> - <message> - <location line="+1"/> - <source>CapsLock</source> - <translation type="unfinished">CapsLock</translation> - </message> - <message> - <location line="+1"/> - <source>NumLock</source> - <translation type="unfinished">NumLock</translation> - </message> - <message> - <location line="+1"/> - <source>ScrollLock</source> - <translation type="unfinished">ScrollLock</translation> - </message> - <message> - <location line="+1"/> - <source>Menu</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Help</source> - <translation type="unfinished">עזרה</translation> - </message> - <message> - <location line="+3"/> - <source>Back</source> - <translation type="unfinished">אחורה</translation> - </message> - <message> - <location line="+1"/> - <source>Forward</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Stop</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Refresh</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Volume Down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Volume Mute</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Volume Up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Bass Boost</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Bass Up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Bass Down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Treble Up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Treble Down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Media Play</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Media Stop</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Media Previous</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Media Next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Media Record</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Favorites</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Search</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Standby</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Open URL</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch Mail</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch Media</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (0)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (1)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (2)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (3)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (4)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (5)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (6)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (7)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (8)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (9)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (A)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (B)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (C)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (D)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (E)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Launch (F)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Print Screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Page Up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Page Down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Caps Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Num Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Number Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Scroll Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Insert</source> - <translation type="unfinished">הוסף</translation> - </message> - <message> - <location line="+1"/> - <source>Delete</source> - <translation type="unfinished">מחק</translation> - </message> - <message> - <location line="+1"/> - <source>Escape</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>System Request</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Select</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Yes</source> - <translation type="unfinished">כן</translation> - </message> - <message> - <location line="+1"/> - <source>No</source> - <translation type="unfinished">לא</translation> - </message> - <message> - <location line="+4"/> - <source>Context1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Context2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Context3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Context4</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Call</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Hangup</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Flip</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+527"/> - <location line="+122"/> - <source>Ctrl</source> - <translation type="unfinished">Ctrl</translation> - </message> - <message> - <location line="-121"/> - <location line="+125"/> - <source>Shift</source> - <translation type="unfinished">Shift</translation> - </message> - <message> - <location line="-124"/> - <location line="+122"/> - <source>Alt</source> - <translation type="unfinished">Alt</translation> - </message> - <message> - <location line="-121"/> - <location line="+117"/> - <source>Meta</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-25"/> - <source>+</source> - <translation type="unfinished">+</translation> - </message> - <message> - <location line="+46"/> - <source>F%1</source> - <translation type="unfinished">F%1</translation> - </message> - <message> - <location line="-720"/> - <source>Home Page</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSlider</name> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/> - <source>Page left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Page up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Position</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Page right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Page down</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSocks5SocketEngine</name> - <message> - <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/> - <source>Connection to proxy refused</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Connection to proxy closed prematurely</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Proxy host not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Connection to proxy timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Proxy authentication failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Proxy authentication failed: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>SOCKS version 5 protocol error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>General SOCKSv5 server failure</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Connection not allowed by SOCKSv5 server</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>TTL expired</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>SOCKSv5 command not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Address type not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Unknown SOCKSv5 proxy error code 0x%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+685"/> - <source>Network operation timed out</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSpinBox</name> - <message> - <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/> - <source>More</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Less</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSql</name> - <message> - <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/> - <source>Delete</source> - <translation type="unfinished">מחק</translation> - </message> - <message> - <location line="+1"/> - <source>Delete this record?</source> - <translation type="unfinished">האם למחוק רשומה זו?</translation> - </message> - <message> - <location line="+1"/> - <location line="+16"/> - <location line="+36"/> - <source>Yes</source> - <translation type="unfinished">כן</translation> - </message> - <message> - <location line="-51"/> - <location line="+16"/> - <location line="+36"/> - <source>No</source> - <translation type="unfinished">לא</translation> - </message> - <message> - <location line="-44"/> - <source>Insert</source> - <translation type="unfinished">הוסף</translation> - </message> - <message> - <location line="+2"/> - <source>Update</source> - <translation type="unfinished">עדכן</translation> - </message> - <message> - <location line="+4"/> - <source>Save edits?</source> - <translation type="unfinished">האם לשמור את העריכה?</translation> - </message> - <message> - <location line="+3"/> - <source>Cancel</source> - <translation type="unfinished">ביטול</translation> - </message> - <message> - <location line="+32"/> - <source>Confirm</source> - <translation type="unfinished">אישור</translation> - </message> - <message> - <location line="+1"/> - <source>Cancel your edits?</source> - <translation type="unfinished">האם לבטל את העריכה שלך?</translation> - </message> -</context> -<context> - <name>QSslSocket</name> - <message> - <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/> - <source>Unable to write data: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+119"/> - <source>Error while reading: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+96"/> - <source>Error during SSL handshake: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-524"/> - <source>Error creating SSL context (%1)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+25"/> - <source>Invalid or empty cipher list (%1)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+62"/> - <source>Error creating SSL session, %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Error creating SSL session: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-61"/> - <source>Cannot provide a certificate with no key, %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Error loading local certificate, %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>Error loading private key, %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Private key does not certificate public key, %1</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QSystemSemaphore</name> - <message> - <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/> - <source>%1: out of resources</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-13"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/> - <source>%1: permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1: already exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1: does not exist</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/> - <source>%1: unknown error %2</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QTDSDriver</name> - <message> - <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/> - <source>Unable to open connection</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Unable to use database</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QTabBar</name> - <message> - <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/> - <source>Scroll Left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll Right</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QTcpServer</name> - <message> - <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/> - <source>Operation on socket is not supported</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QTextControl</name> - <message> - <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/> - <source>&Undo</source> - <translation type="unfinished">&בטל</translation> - </message> - <message> - <location line="+2"/> - <source>&Redo</source> - <translation type="unfinished">בצע &שוב</translation> - </message> - <message> - <location line="+4"/> - <source>Cu&t</source> - <translation type="unfinished">&גזור</translation> - </message> - <message> - <location line="+5"/> - <source>&Copy</source> - <translation type="unfinished">הע&תק</translation> - </message> - <message> - <location line="+7"/> - <source>Copy &Link Location</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>&Paste</source> - <translation type="unfinished">ה&דבק</translation> - </message> - <message> - <location line="+3"/> - <source>Delete</source> - <translation type="unfinished">מחק</translation> - </message> - <message> - <location line="+7"/> - <source>Select All</source> - <translation type="unfinished">בחר הכל</translation> - </message> -</context> -<context> - <name>QToolButton</name> - <message> - <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/> - <location line="+6"/> - <source>Press</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-4"/> - <location line="+8"/> - <source>Open</source> - <translation type="unfinished">פתח</translation> - </message> -</context> -<context> - <name>QUdpSocket</name> - <message> - <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/> - <source>This platform does not support IPv6</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QUndoGroup</name> - <message> - <location filename="../src/gui/util/qundogroup.cpp" line="+386"/> - <source>Undo</source> - <translation type="unfinished">בטל</translation> - </message> - <message> - <location line="+28"/> - <source>Redo</source> - <translation type="unfinished">שחזר</translation> - </message> -</context> -<context> - <name>QUndoModel</name> - <message> - <location filename="../src/gui/util/qundoview.cpp" line="+101"/> - <source><empty></source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QUndoStack</name> - <message> - <location filename="../src/gui/util/qundostack.cpp" line="+834"/> - <source>Undo</source> - <translation type="unfinished">בטל</translation> - </message> - <message> - <location line="+27"/> - <source>Redo</source> - <translation type="unfinished">שחזר</translation> - </message> -</context> -<context> - <name>QUnicodeControlCharacterMenu</name> - <message> - <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/> - <source>LRM Left-to-right mark</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>RLM Right-to-left mark</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>ZWJ Zero width joiner</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>ZWNJ Zero width non-joiner</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>ZWSP Zero width space</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>LRE Start of left-to-right embedding</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>RLE Start of right-to-left embedding</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>LRO Start of left-to-right override</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>RLO Start of right-to-left override</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>PDF Pop directional formatting</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Insert Unicode control character</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWebFrame</name> - <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/> - <source>Request cancelled</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Request blocked</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Cannot show URL</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Frame load interruped by policy change</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Cannot show mimetype</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>File does not exist</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWebPage</name> - <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/> - <source>Bad HTTP request</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/> - <source>Submit</source> - <comment>default label for Submit buttons in forms on web pages</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Submit</source> - <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Reset</source> - <comment>default label for Reset buttons in forms on web pages</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>This is a searchable index. Enter search keywords: </source> - <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Choose File</source> - <comment>title for file button used in HTML forms</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>No file selected</source> - <comment>text to display in file button used in HTML forms when no file is selected</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Open in New Window</source> - <comment>Open in New Window context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Save Link...</source> - <comment>Download Linked File context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Copy Link</source> - <comment>Copy Link context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Open Image</source> - <comment>Open Image in New Window context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Save Image</source> - <comment>Download Image context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Copy Image</source> - <comment>Copy Link context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Open Frame</source> - <comment>Open Frame in New Window context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Copy</source> - <comment>Copy context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Go Back</source> - <comment>Back context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Go Forward</source> - <comment>Forward context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Stop</source> - <comment>Stop context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Reload</source> - <comment>Reload context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Cut</source> - <comment>Cut context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Paste</source> - <comment>Paste context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>No Guesses Found</source> - <comment>No Guesses Found context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Ignore</source> - <comment>Ignore Spelling context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Add To Dictionary</source> - <comment>Learn Spelling context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Search The Web</source> - <comment>Search The Web context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Look Up In Dictionary</source> - <comment>Look Up in Dictionary context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Open Link</source> - <comment>Open Link context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Ignore</source> - <comment>Ignore Grammar context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Spelling</source> - <comment>Spelling and Grammar context sub-menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Show Spelling and Grammar</source> - <comment>menu item title</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Hide Spelling and Grammar</source> - <comment>menu item title</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Check Spelling</source> - <comment>Check spelling context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Check Spelling While Typing</source> - <comment>Check spelling while typing context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Check Grammar With Spelling</source> - <comment>Check grammar with spelling context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Fonts</source> - <comment>Font context sub-menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Bold</source> - <comment>Bold context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Italic</source> - <comment>Italic context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Underline</source> - <comment>Underline context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Outline</source> - <comment>Outline context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Direction</source> - <comment>Writing direction context sub-menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Text Direction</source> - <comment>Text direction context sub-menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Default</source> - <comment>Default writing direction context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>LTR</source> - <comment>Left to Right context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>RTL</source> - <comment>Right to Left context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Inspect</source> - <comment>Inspect Element context menu item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>No recent searches</source> - <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Recent searches</source> - <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Clear recent searches</source> - <comment>menu item in Recent Searches menu that empties menu's contents</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+75"/> - <source>Unknown</source> - <comment>Unknown filesize FTP directory listing item</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>%1 (%2x%3 pixels)</source> - <comment>Title string for images</comment> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/> - <source>Web Inspector - %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/> - <source>Scroll here</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Left edge</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Top</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Right edge</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Bottom</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Page left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Page up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Page right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Page down</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Scroll left</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll up</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1"/> - <source>Scroll right</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>Scroll down</source> - <translation type="unfinished"></translation> - </message> - <message numerus="yes"> - <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/> - <source>%n file(s)</source> - <comment>number of chosen file</comment> - <translation type="unfinished"> - <numerusform></numerusform> - </translation> - </message> - <message> - <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/> - <source>JavaScript Alert - %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>JavaScript Confirm - %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>JavaScript Prompt - %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+333"/> - <source>Move the cursor to the next character</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the previous character</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the next word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the previous word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the next line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the previous line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the start of the line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the end of the line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the start of the block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the end of the block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the start of the document</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Move the cursor to the end of the document</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select all</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the next character</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the previous character</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the next word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the previous word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the next line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the previous line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the start of the line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the end of the line</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the start of the block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the end of the block</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the start of the document</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Select to the end of the document</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Delete to the start of the word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Delete to the end of the word</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+33"/> - <source>Insert a new paragraph</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Insert a new line</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWhatsThisAction</name> - <message> - <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/> - <source>What's This?</source> - <translation type="unfinished">מה זה?</translation> - </message> -</context> -<context> - <name>QWidget</name> - <message> - <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/> - <source>*</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWizard</name> - <message> - <location filename="../src/gui/dialogs/qwizard.cpp" line="+649"/> - <source>Cancel</source> - <translation type="unfinished">ביטול</translation> - </message> - <message> - <location line="+2"/> - <source>Help</source> - <translation type="unfinished">עזרה</translation> - </message> - <message> - <location line="-14"/> - <source>Go Back</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>Continue</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+5"/> - <source>Commit</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Done</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-10"/> - <source>< &Back</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>&Finish</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>&Help</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-8"/> - <source>&Next</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+0"/> - <source>&Next ></source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QWorkspace</name> - <message> - <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/> - <source>&Restore</source> - <translation type="unfinished">ש&חזר</translation> - </message> - <message> - <location line="+1"/> - <source>&Move</source> - <translation type="unfinished">ה&זז</translation> - </message> - <message> - <location line="+1"/> - <source>&Size</source> - <translation type="unfinished">&שנה גודל</translation> - </message> - <message> - <location line="+2"/> - <source>Mi&nimize</source> - <translation type="unfinished">&מזער</translation> - </message> - <message> - <location line="+2"/> - <source>Ma&ximize</source> - <translation type="unfinished">&הגדל</translation> - </message> - <message> - <location line="+2"/> - <source>&Close</source> - <translation type="unfinished">&סגור</translation> - </message> - <message> - <location line="+6"/> - <source>Stay on &Top</source> - <translation type="unfinished">&תמיד עליון</translation> - </message> - <message> - <location line="+3"/> - <location line="+1059"/> - <source>Sh&ade</source> - <translation type="unfinished">&גלול</translation> - </message> - <message> - <location line="-278"/> - <location line="+60"/> - <source>%1 - [%2]</source> - <translation>%1 - [%2]</translation> - </message> - <message> - <location line="-1837"/> - <source>Minimize</source> - <translation type="unfinished">מזער</translation> - </message> - <message> - <location line="+2"/> - <source>Restore Down</source> - <translation type="unfinished">שחזר למטה</translation> - </message> - <message> - <location line="-4"/> - <source>Close</source> - <translation type="unfinished">סגור</translation> - </message> - <message> - <location line="+2053"/> - <source>&Unshade</source> - <translation type="unfinished">&בטל גלילה</translation> - </message> -</context> -<context> - <name>QXml</name> - <message> - <location filename="../src/xml/sax/qxml.cpp" line="+58"/> - <source>no error occurred</source> - <translation>לא אירעה כל שגיאה</translation> - </message> - <message> - <location line="+1"/> - <source>error triggered by consumer</source> - <translation>נגרמה שגיאה על ידי הצרכן</translation> - </message> - <message> - <location line="+1"/> - <source>unexpected end of file</source> - <translation>סוף קובץ לא צפוי</translation> - </message> - <message> - <location line="+1"/> - <source>more than one document type definition</source> - <translation>יותר מהגדרה אחת של סוג מסמך</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing element</source> - <translation>אירעה שגיאה בעת עיבוד המרכיב</translation> - </message> - <message> - <location line="+1"/> - <source>tag mismatch</source> - <translation>אי-התאמה בתגית</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing content</source> - <translation>אירעה שגיאה בעת עיבוד התוכן</translation> - </message> - <message> - <location line="+1"/> - <source>unexpected character</source> - <translation>תו לא צפוי</translation> - </message> - <message> - <location line="+1"/> - <source>invalid name for processing instruction</source> - <translation>שם לא תקף עבור הוראת העיבוד</translation> - </message> - <message> - <location line="+1"/> - <source>version expected while reading the XML declaration</source> - <translation>הייתה צפויה גירסה בעת קריאה ההכרזה על XML</translation> - </message> - <message> - <location line="+1"/> - <source>wrong value for standalone declaration</source> - <translation>ערך שגוי עבור ההגדרה העצמאית</translation> - </message> - <message> - <location line="+1"/> - <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> - <translation>הייתה צפויה הכרזה על קידוד או הכרזה עצמאית בעת קריאת ההכרזה על XML</translation> - </message> - <message> - <location line="+1"/> - <source>standalone declaration expected while reading the XML declaration</source> - <translation>הייתה צפויה הכרזה עצמאית בעת קריאת ההכרזה על XML</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing document type definition</source> - <translation>אירעה שגיאה בעת עיבוד הגדרת סוג המסמך</translation> - </message> - <message> - <location line="+1"/> - <source>letter is expected</source> - <translation>הייתה צפויה אות</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing comment</source> - <translation>אירעה שגיאה בעת עיבוד ההערה</translation> - </message> - <message> - <location line="+1"/> - <source>error occurred while parsing reference</source> - <translation>אירעה שגיאה בעת עיבוד ההתייחסות</translation> - </message> - <message> - <location line="+1"/> - <source>internal general entity reference not allowed in DTD</source> - <translation>התייחסות ליישות כללית פנימית אינה מותרת ב-DTD</translation> - </message> - <message> - <location line="+1"/> - <source>external parsed general entity reference not allowed in attribute value</source> - <translation>התייחסות ליישות כללית מעובדת חיצונית אינה מותרת בערך המאפיין</translation> - </message> - <message> - <location line="+1"/> - <source>external parsed general entity reference not allowed in DTD</source> - <translation>התייחסות ליישות כללית מעובדת חיצונית אינה מותרת ב-DTD</translation> - </message> - <message> - <location line="+1"/> - <source>unparsed entity reference in wrong context</source> - <translation>התייחסות ליישות לא מעובדת בהקשר שגוי</translation> - </message> - <message> - <location line="+1"/> - <source>recursive entities</source> - <translation>יישות רקורסיבית</translation> - </message> - <message> - <location line="+1"/> - <source>error in the text declaration of an external entity</source> - <translation>שגיאה בהכרזת טקסט של יישות חיצונית</translation> - </message> -</context> -<context> - <name>QXmlStream</name> - <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/> - <source>Extra content at end of document.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+222"/> - <source>Invalid entity value.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+107"/> - <source>Invalid XML character.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+259"/> - <source>Sequence ']]>' not allowed in content.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+309"/> - <source>Namespace prefix '%1' not declared</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+78"/> - <source>Attribute redefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+115"/> - <source>Unexpected character '%1' in public id literal.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+28"/> - <source>Invalid XML version string.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Unsupported XML version.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>%1 is an invalid encoding name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Encoding %1 is unsupported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>Standalone accepts only yes or no.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Invalid attribute in XML declaration.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>Premature end of document.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>Invalid document.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+40"/> - <source>Expected </source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>, but got '</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Unexpected '</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+210"/> - <source>Expected character data.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/> - <source>Recursive entity detected.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+516"/> - <source>Start tag expected.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+222"/> - <source>XML declaration not at start of document.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-31"/> - <source>NDATA in parameter entity declaration.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+34"/> - <source>%1 is an invalid processing instruction name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Invalid processing instruction name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/> - <location line="+12"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/> - <location line="+53"/> - <source>Illegal namespace declaration.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/> - <source>Invalid XML name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>Opening and ending tag mismatch.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+18"/> - <source>Reference to unparsed entity '%1'.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-13"/> - <location line="+61"/> - <location line="+40"/> - <source>Entity '%1' not declared.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-26"/> - <source>Reference to external entity '%1' in attribute value.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+40"/> - <source>Invalid character reference.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/> - <source>Encountered incorrectly encoded content.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+274"/> - <source>The standalone pseudo attribute must appear after the encoding.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/> - <source>%1 is an invalid PUBLIC identifier.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QtXmlPatterns</name> - <message> - <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/> - <source>An %1-attribute with value %2 has already been declared.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>An %1-attribute must have a valid %2 as value, which %3 isn't.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/> - <source>Network timeout.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/> - <source>Element %1 can't be serialized because it appears outside the document element.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+60"/> - <source>Attribute %1 can't be serialized because it appears at the top level.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/> - <source>Year %1 is invalid because it begins with %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>Day %1 is outside the range %2..%3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Month %1 is outside the range %2..%3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Overflow: Can't represent date %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Day %1 is invalid for month %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+49"/> - <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Time %1:%2:%3.%4 is invalid.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+115"/> - <source>Overflow: Date can't be represented.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/> - <location line="+15"/> - <source>At least one component must be present.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-7"/> - <source>At least one time component must appear after the %1-delimiter.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/> - <source>No operand in an integer division, %1, can be %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>The first operand in an integer division, %1, cannot be infinity (%2).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>The second operand in a division, %1, cannot be zero (%2).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/> - <source>%1 is not a valid value of type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/> - <source>When casting to %1 from %2, the source value cannot be %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/> - <source>Integer division (%1) by zero (%2) is undefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Division (%1) by zero (%2) is undefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Modulus division (%1) by zero (%2) is undefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+122"/> - <location line="+32"/> - <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-20"/> - <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+32"/> - <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/> - <source>A value of type %1 cannot have an Effective Boolean Value.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/> - <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/> - <source>Value %1 of type %2 exceeds maximum (%3).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Value %1 of type %2 is below minimum (%3).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/> - <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+19"/> - <source>%1 is not valid as a value of type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/> - <source>Operator %1 cannot be used on type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+17"/> - <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/> - <source>The namespace URI in the name for a computed attribute cannot be %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/> - <source>Type error in cast, expected %1, received %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+29"/> - <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/> - <source>No casting is possible with %1 as the target type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>It is not possible to cast from %1 to %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+27"/> - <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>It's not possible to cast the value %1 of type %2 to %3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Failure when casting from %1 to %2: %3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/> - <source>A comment cannot contain %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>A comment cannot end with a %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/> - <source>No comparisons can be done involving the type %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>Operator %1 is not available between atomic values of type %2 and %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/> - <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/> - <source>A library module cannot be evaluated directly. It must be imported from a main module.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+40"/> - <source>No template by name %1 exists.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/> - <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+32"/> - <source>A positional predicate must evaluate to a single numeric value.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/> - <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+24"/> - <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/> - <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/> - <source>The data of a processing instruction cannot contain the string %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/> - <source>No namespace binding exists for the prefix %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/> - <source>No namespace binding exists for the prefix %1 in %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/> - <source>%1 is an invalid %2</source> - <translation type="unfinished"></translation> - </message> - <message numerus="yes"> - <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/> - <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source> - <translation type="unfinished"> - <numerusform></numerusform> - </translation> - </message> - <message numerus="yes"> - <location line="+11"/> - <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source> - <translation type="unfinished"> - <numerusform></numerusform> - </translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/> - <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+74"/> - <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+91"/> - <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/> - <source>%1 is not a valid XML 1.0 character.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/> - <source>The first argument to %1 cannot be of type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/> - <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/> - <source>%1 was called.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/> - <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+39"/> - <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+26"/> - <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/> - <source>%1 matches newline characters</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>%1 and %2 match the start and end of a line.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Matches are case insensitive</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>Whitespace characters are removed, except when they appear in character classes</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+99"/> - <source>%1 is an invalid regular expression pattern: %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+30"/> - <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/> - <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/> - <source>It will not be possible to retrieve %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/> - <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/> - <source>The default collection is undefined</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>%1 cannot be retrieved</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/> - <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/> - <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>%1 is not a whole number of minutes.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/> - <source>Required cardinality is %1; got cardinality %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/> - <source>The item %1 did not match the required type %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/> - <location line="+7253"/> - <source>%1 is an unknown schema type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-6971"/> - <source>Only one %1 declaration can occur in the query prolog.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+188"/> - <source>The initialization of variable %1 depends on itself</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+63"/> - <source>No variable by name %1 exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/> - <source>The variable %1 is unused</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/> - <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+55"/> - <source>No function with signature %1 is available</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+72"/> - <location line="+10"/> - <source>A default namespace declaration must occur before function, variable, and option declarations.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Namespace declarations must occur before function, variable, and option declarations.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>Module imports must occur before function, variable, and option declarations.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+200"/> - <source>It is not possible to redeclare prefix %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+18"/> - <source>Prefix %1 is already declared in the prolog.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+95"/> - <source>The name of an option must have a prefix. There is no default namespace for options.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+171"/> - <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>The target namespace of a %1 cannot be empty.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>The module import feature is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+52"/> - <source>No value is available for the external variable by name %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-4154"/> - <source>A construct was encountered which only is allowed in XQuery.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+118"/> - <source>A template by name %1 has already been declared.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3581"/> - <source>The keyword %1 cannot occur with any other mode name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+29"/> - <source>The value of attribute %1 must of type %2, which %3 isn't.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+75"/> - <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+312"/> - <source>A variable by name %1 has already been declared.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+135"/> - <source>A stylesheet function must have a prefixed name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+34"/> - <source>A function already exists with the signature %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+37"/> - <source>An argument by name %1 has already been declared. Every argument name must be unique.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+179"/> - <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+63"/> - <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+126"/> - <source>%1 is an invalid template mode name.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+44"/> - <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+758"/> - <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+39"/> - <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+267"/> - <source>Each name of a template parameter must be unique; %1 is duplicated.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+129"/> - <source>The %1-axis is unsupported in XQuery</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+1150"/> - <source>%1 is not a valid name for a processing-instruction.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-7029"/> - <source>%1 is not a valid numeric literal.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6165"/> - <source>No function by name %1 is available.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+102"/> - <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>%1 is an invalid namespace URI.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>It is not possible to bind to the prefix %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>Two namespace declaration attributes have the same name: %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+89"/> - <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>An attribute by name %1 has already appeared on this element.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+61"/> - <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+458"/> - <source>The name %1 does not refer to any schema type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+145"/> - <location line="+71"/> - <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+48"/> - <source>The name of an extension expression must be in a namespace.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/> - <source>empty</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>zero or one</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>exactly one</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>one or more</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+2"/> - <source>zero or more</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/> - <source>Required type is %1, but %2 was found.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+44"/> - <source>Promoting %1 to %2 may cause loss of precision.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+49"/> - <source>The focus is undefined.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/> - <source>It's not possible to add attributes after any other kind of node.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>An attribute by name %1 has already been created.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/> - <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/> - <source>%1 is an unsupported encoding.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+16"/> - <source>%1 contains octets which are disallowed in the requested encoding %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+18"/> - <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/> - <source>Ambiguous rule match.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/> - <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+11"/> - <source>The prefix must be a valid %1, which %2 is not.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+14"/> - <source>The prefix %1 cannot be bound.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+10"/> - <source>Only the prefix %1 can be bound to %2 and vice versa.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/> - <source>Circularity detected</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/> - <source>The parameter %1 is required, but no corresponding %2 is supplied.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="-71"/> - <source>The parameter %1 is passed, but no corresponding %2 exists.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/> - <source>The URI cannot have a fragment</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/> - <source>Element %1 is not allowed at this location.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Text nodes are not allowed at this location.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Parse error: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+62"/> - <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+108"/> - <source>Unknown XSL-T attribute %1.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+23"/> - <source>Attribute %1 and %2 are mutually exclusive.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+166"/> - <source>In a simplified stylesheet module, attribute %1 must be present.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+72"/> - <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Element %1 must have at least one of the attributes %2 or %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+28"/> - <source>At least one mode must be specified in the %1-attribute on element %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/> - <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> - <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+9"/> - <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+12"/> - <source>The attribute %1 must appear on element %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+8"/> - <source>The element with local name %1 does not exist in XSL-T.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/> - <source>Element %1 must come last.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+24"/> - <source>At least one %1-element must occur before %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+7"/> - <source>Only one %1-element can appear.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+31"/> - <source>At least one %1-element must occur inside %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+58"/> - <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> - <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+125"/> - <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+270"/> - <source>Element %1 cannot have children.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+434"/> - <source>Element %1 cannot have a sequence constructor.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+86"/> - <location line="+9"/> - <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+15"/> - <source>A parameter in a function cannot be declared to be a tunnel.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+149"/> - <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+57"/> - <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+48"/> - <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+20"/> - <source>Attribute %1 cannot have the value %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+58"/> - <source>The attribute %1 can only appear on the first %2 element.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+99"/> - <source>At least one %1 element must appear as child of %2.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>VolumeSlider</name> - <message> - <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/> - <source>Muted</source> - <translation type="unfinished"></translation> - </message> + <name>QApplication</name> <message> - <location line="+5"/> - <location line="+15"/> - <source>Volume: %1%</source> - <translation type="unfinished"></translation> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation>RTL</translation> </message> </context> </TS> diff --git a/config.profiles/symbian/translations/qt_ur.ts b/config.profiles/symbian/translations/qt_ur.ts index 13797d5..4b26d3a 100644 --- a/config.profiles/symbian/translations/qt_ur.ts +++ b/config.profiles/symbian/translations/qt_ur.ts @@ -2,8506 +2,12 @@ <!DOCTYPE TS> <TS version="2.0" language="ur"> - <context> - <name>CloseButton</name> - <message> - <source>Close Tab</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>FakeReply</name> - <message> - <source>Fake error !</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Invalid URL</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::</name> - <message> - <source>Notifications</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Music</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Video</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Communication</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Games</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accessibility</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::AudioOutput</name> - <message> - <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source> - <translation type="unfinished"></translation> - </message> - <message> - <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Revert back to device '%1'</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::Gstreamer::Backend</name> - <message> - <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. - Some video features have been disabled.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Warning: You do not seem to have the base GStreamer plugins installed. - All audio and video support has been disabled</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::Gstreamer::MediaObject</name> - <message> - <source>Cannot start playback. - -Check your GStreamer installation and make sure you -have libgstreamer-plugins-base installed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not open media source.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Invalid source type.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not locate media source.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not open audio device. The device is already in use.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not decode media source.</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF</name> - <message> - <source>Audio Output</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The audio output device</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>No error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Out of memory</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Overflow</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Underflow</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Already exists</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Path not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>In use</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Not ready</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Access denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not connect</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Disconnected</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Permission denied</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Insufficient bandwidth</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Network unavailable</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Network communication error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Streaming not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Server alert</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Invalid protocol</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Invalid URL</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Multicast error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Proxy server error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Proxy server not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Audio output error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Video output error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Decoder error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Audio or video components could not be played</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>DRM error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Unknown error (%1)</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::AbstractMediaPlayer</name> - <message> - <source>Not ready to play</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Error opening file</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Error opening URL</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Setting volume failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Playback complete</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::AudioEqualizer</name> - <message> - <source>%1 Hz</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::AudioPlayer</name> - <message> - <source>Getting position failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Opening clip failed</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::EffectFactory</name> - <message> - <source>Enabled</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::EnvironmentalReverb</name> - <message> - <source>Decay HF ratio (%)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Decay time (ms)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Density (%)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Diffusion (%)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Reflections delay (ms)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Reflections level (mB)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Reverb delay (ms)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Reverb level (mB)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Room HF level</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Room level (mB)</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::MediaObject</name> - <message> - <source>Error opening source: type not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Error opening source: media type could not be determined</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::StereoWidening</name> - <message> - <source>Level (%)</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::MMF::VideoPlayer</name> - <message> - <source>Pause failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Seek failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Getting position failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Opening clip failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Buffering clip failed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Video display error</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Phonon::VolumeSlider</name> - <message> - <source>Volume: %1%</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Muted</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3Accel</name> - <message> - <source>%1, %2 not defined</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Ambiguous %1 not handled</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3DataTable</name> - <message> - <source>True</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>False</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Insert</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Update</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Delete</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3FileDialog</name> - <message> - <source>Copy or Move a File</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Read: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Write: %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>All Files (*)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Name</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Size</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Type</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Date</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Attributes</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&OK</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Look &in:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>File &name:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>File &type:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Back</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>One directory up</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Create New Folder</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>List View</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Detail View</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Preview File Info</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Preview File Contents</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Read-write</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Read-only</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Write-only</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Inaccessible</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Symlink to File</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Symlink to Directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Symlink to Special</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>File</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Dir</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Special</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Open</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Save As</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Open</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Save</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Rename</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Delete</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>R&eload</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort by &Name</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort by &Size</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort by &Date</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Unsorted</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Show &hidden files</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>the file</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>the directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>the symlink</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Delete %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Yes</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&No</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>New Folder 1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>New Folder</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>New Folder %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Find Directory</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Directory:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>%1 -File not found. -Check path and filename.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>All Files (*.*)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Open </source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select a Directory</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3LocalFs</name> - <message> - <source>Could not read directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not create directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not remove file or directory -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not rename -%1 -to -%2</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not open -%1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Could not write -%1</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3MainWindow</name> - <message> - <source>Line up</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Customize...</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3NetworkProtocol</name> - <message> - <source>Operation stopped by the user</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3ProgressDialog</name> - <message> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3TabDialog</name> - <message> - <source>OK</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Apply</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Help</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Defaults</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3TextEdit</name> - <message> - <source>&Undo</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Redo</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Cu&t</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Copy</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Paste</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Clear</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select All</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3TitleBar</name> - <message> - <source>System</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Restore up</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Minimize</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Restore down</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Maximize</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Close</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Contains commands to manipulate the window</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Puts a minimized window back to normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Moves the window out of the way</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Puts a maximized window back to normal</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Makes the window full screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Closes the window</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Displays the name of the window and contains controls to manipulate it</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3ToolBar</name> - <message> - <source>More...</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3UrlOperator</name> - <message> - <source>The protocol `%1' is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support listing directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support creating new directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support removing files or directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support renaming files or directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support getting files</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support putting files</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The protocol `%1' does not support copying or moving files or directories</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>(unknown)</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>Q3Wizard</name> - <message> - <source>&Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>< &Back</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Next ></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Finish</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QAbstractSocket</name> - <message> - <source>Host not found</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Connection refused</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Connection timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Operation on socket is not supported</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Socket operation timed out</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Socket is not connected</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Network unreachable</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QAbstractSpinBox</name> - <message> - <source>&Step up</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Step &down</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Select All</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QAccessibleButton</name> - <message> - <source>Press</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QApplication</name> - <message> - <source>QT_LAYOUT_DIRECTION</source> - <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> - <translation type="unfinished">RTL</translation> - </message> - <message> - <source>Executable '%1' requires Qt %2, found Qt %3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Incompatible Qt Library Error</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Activate</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Activates the program's main window</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QAxSelect</name> - <message> - <source>Select ActiveX Control</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>OK</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>COM &Object:</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QCheckBox</name> - <message> - <source>Uncheck</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Check</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Toggle</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QColorDialog</name> - <message> - <source>Hu&e:</source> - <translation>Hu&e:</translation> - </message> - <message> - <source>&Sat:</source> - <translation>&Sat:</translation> - </message> - <message> - <source>&Val:</source> - <translation>&Val:</translation> - </message> - <message> - <source>&Red:</source> - <translation>&Red:</translation> - </message> - <message> - <source>&Green:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Bl&ue:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>A&lpha channel:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select Color</source> - <translation>Select Color</translation> - </message> - <message> - <source>&Basic colors</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Custom colors</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Add to Custom Colors</source> - <translation type="unfinished"></translation> - </message> - </context> - <context> - <name>QComboBox</name> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - <message> - <source>False</source> - <translation>False</translation> - </message> - <message> - <source>True</source> - <translation>True</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - </context> - <context> - <name>QCoreApplication</name> - <message> - <source>%1: key is empty</source> - <comment>QSystemSemaphore</comment> - <translation>%1: key is empty</translation> - </message> - <message> - <source>%1: unable to make key</source> - <comment>QSystemSemaphore</comment> - <translation>%1: unable to make key</translation> - </message> - <message> - <source>%1: ftok failed</source> - <comment>QSystemSemaphore</comment> - <translation>%1: ftok failed</translation> - </message> - <message> - <source>%1: already exists</source> - <comment>QSystemSemaphore</comment> - <translation>%1: already exists</translation> - </message> - <message> - <source>%1: does not exist</source> - <comment>QSystemSemaphore</comment> - <translation>%1: does not exist</translation> - </message> - <message> - <source>%1: out of resources</source> - <comment>QSystemSemaphore</comment> - <translation>%1: out of resources</translation> - </message> - <message> - <source>%1: unknown error %2</source> - <comment>QSystemSemaphore</comment> - <translation>%1: unknown error %2</translation> - </message> - </context> - <context> - <name>QDB2Driver</name> - <message> - <source>Unable to connect</source> - <translation>Unable to connect</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - <message> - <source>Unable to set autocommit</source> - <translation>Unable to set autocommit</translation> - </message> - </context> - <context> - <name>QDB2Result</name> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - <message> - <source>Unable to bind variable</source> - <translation>Unable to bind variable</translation> - </message> - <message> - <source>Unable to fetch record %1</source> - <translation>Unable to fetch record %1</translation> - </message> - <message> - <source>Unable to fetch next</source> - <translation>Unable to fetch next</translation> - </message> - <message> - <source>Unable to fetch first</source> - <translation>Unable to fetch first</translation> - </message> - </context> - <context> - <name>QDateTimeEdit</name> - <message> - <source>AM</source> - <translation>AM</translation> - </message> - <message> - <source>am</source> - <translation>am</translation> - </message> - <message> - <source>PM</source> - <translation>PM</translation> - </message> - <message> - <source>pm</source> - <translation>pm</translation> - </message> - </context> - <context> - <name>QDial</name> - <message> - <source>QDial</source> - <translation>QDial</translation> - </message> - <message> - <source>SpeedoMeter</source> - <translation>SpeedoMeter</translation> - </message> - <message> - <source>SliderHandle</source> - <translation>SliderHandle</translation> - </message> - </context> - <context> - <name>QDialog</name> - <message> - <source>What's This?</source> - <translation>What's This?</translation> - </message> - <message> - <source>Done</source> - <translation>Done</translation> - </message> - </context> - <context> - <name>QDialogButtonBox</name> - <message> - <source>OK</source> - <translation>OK</translation> - </message> - <message> - <source>Save</source> - <translation>Save</translation> - </message> - <message> - <source>&Save</source> - <translation>&Save</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - <message> - <source>&Cancel</source> - <translation>&Cancel</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>&Close</source> - <translation>&Close</translation> - </message> - <message> - <source>Apply</source> - <translation>Apply</translation> - </message> - <message> - <source>Reset</source> - <translation>Reset</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>Don't Save</source> - <translation>Don't Save</translation> - </message> - <message> - <source>Discard</source> - <translation>Discard</translation> - </message> - <message> - <source>&Yes</source> - <translation>&Yes</translation> - </message> - <message> - <source>Yes to &All</source> - <translation>Yes to &All</translation> - </message> - <message> - <source>&No</source> - <translation>&No</translation> - </message> - <message> - <source>N&o to All</source> - <translation>N&o to All</translation> - </message> - <message> - <source>Save All</source> - <translation>Save All</translation> - </message> - <message> - <source>Abort</source> - <translation>Abort</translation> - </message> - <message> - <source>Retry</source> - <translation>Retry</translation> - </message> - <message> - <source>Ignore</source> - <translation>Ignore</translation> - </message> - <message> - <source>Restore Defaults</source> - <translation>Restore Defaults</translation> - </message> - <message> - <source>Close without Saving</source> - <translation>Close without Saving</translation> - </message> - <message> - <source>&OK</source> - <translation>&OK</translation> - </message> - </context> - <context> - <name>QDirModel</name> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Size</source> - <translation>Size</translation> - </message> - <message> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation>Kind</translation> - </message> - <message> - <source>Type</source> - <comment>All other platforms</comment> - <translation>Type</translation> - </message> - <message> - <source>Date Modified</source> - <translation>Date Modified</translation> - </message> - </context> - <context> - <name>QDockWidget</name> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Dock</source> - <translation>Dock</translation> - </message> - <message> - <source>Float</source> - <translation>Float</translation> - </message> - </context> - <context> - <name>QDoubleSpinBox</name> - <message> - <source>More</source> - <translation>More</translation> - </message> - <message> - <source>Less</source> - <translation>Less</translation> - </message> - </context> - <context> - <name>QErrorMessage</name> - <message> - <source>&Show this message again</source> - <translation>&Show this message again</translation> - </message> - <message> - <source>&OK</source> - <translation>&OK</translation> - </message> - <message> - <source>Debug Message:</source> - <translation>Debug Message:</translation> - </message> - <message> - <source>Warning:</source> - <translation>Warning:</translation> - </message> - <message> - <source>Fatal Error:</source> - <translation>Fatal Error:</translation> - </message> - </context> - <context> - <name>QFile</name> - <message> - <source>Destination file exists</source> - <translation>Destination file exists</translation> - </message> - <message> - <source>Will not rename sequential file using block copy</source> - <translation>Will not rename sequential file using block copy</translation> - </message> - <message> - <source>Cannot remove source file</source> - <translation>Cannot remove source file</translation> - </message> - <message> - <source>Cannot open %1 for input</source> - <translation>Cannot open %1 for input</translation> - </message> - <message> - <source>Cannot open for output</source> - <translation>Cannot open for output</translation> - </message> - <message> - <source>Failure to write block</source> - <translation>Failure to write block</translation> - </message> - <message> - <source>Cannot create %1 for output</source> - <translation>Cannot create %1 for output</translation> - </message> - </context> - <context> - <name>QFileDialog</name> - <message> - <source>All Files (*)</source> - <translation>All Files (*)</translation> - </message> - <message> - <source>Back</source> - <translation>Back</translation> - </message> - <message> - <source>List View</source> - <translation>List View</translation> - </message> - <message> - <source>Detail View</source> - <translation>Detail View</translation> - </message> - <message> - <source>File</source> - <translation>File</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - <message> - <source>Save As</source> - <translation>Save As</translation> - </message> - <message> - <source>&Open</source> - <translation>&Open</translation> - </message> - <message> - <source>&Save</source> - <translation>&Save</translation> - </message> - <message> - <source>Recent Places</source> - <translation>Recent Places</translation> - </message> - <message> - <source>&Rename</source> - <translation>&Rename</translation> - </message> - <message> - <source>&Delete</source> - <translation>&Delete</translation> - </message> - <message> - <source>Show &hidden files</source> - <translation>Show &hidden files</translation> - </message> - <message> - <source>New Folder</source> - <translation>New Folder</translation> - </message> - <message> - <source>Find Directory</source> - <translation>Find Directory</translation> - </message> - <message> - <source>Directories</source> - <translation>Directories</translation> - </message> - <message> - <source>All Files (*.*)</source> - <translation>All Files (*.*)</translation> - </message> - <message> - <source>Directory:</source> - <translation>Directory:</translation> - </message> - <message> - <source>%1 already exists. -Do you want to replace it?</source> - <translation>%1 already exists. -Do you want to replace it?</translation> - </message> - <message> - <source>%1 -File not found. -Please verify the correct file name was given.</source> - <translation>%1 -File not found. -Please verify the correct file name was given.</translation> - </message> - <message> - <source>My Computer</source> - <translation>My Computer</translation> - </message> - <message> - <source>Parent Directory</source> - <translation>Parent Directory</translation> - </message> - <message> - <source>Files of type:</source> - <translation>Files of type:</translation> - </message> - <message> - <source>%1 -Directory not found. -Please verify the correct directory name was given.</source> - <translation>%1 -Directory not found. -Please verify the correct directory name was given.</translation> - </message> - <message> - <source>'%1' is write protected. -Do you want to delete it anyway?</source> - <translation>'%1' is write protected. -Do you want to delete it anyway?</translation> - </message> - <message> - <source>Are sure you want to delete '%1'?</source> - <translation>Are sure you want to delete '%1'?</translation> - </message> - <message> - <source>Could not delete directory.</source> - <translation>Could not delete directory.</translation> - </message> - <message> - <source>Drive</source> - <translation>Drive</translation> - </message> - <message> - <source>File Folder</source> - <comment>Match Windows Explorer</comment> - <translation>File Folder</translation> - </message> - <message> - <source>Folder</source> - <comment>All other platforms</comment> - <translation>Folder</translation> - </message> - <message> - <source>Alias</source> - <comment>Mac OS X Finder</comment> - <translation>Alias</translation> - </message> - <message> - <source>Shortcut</source> - <comment>All other platforms</comment> - <translation>Shortcut</translation> - </message> - <message> - <source>Unknown</source> - <translation>Unknown</translation> - </message> - <message> - <source>Show </source> - <translation>Show </translation> - </message> - <message> - <source>Forward</source> - <translation>Forward</translation> - </message> - <message> - <source>&New Folder</source> - <translation>&New Folder</translation> - </message> - <message> - <source>&Choose</source> - <translation>&Choose</translation> - </message> - <message> - <source>Remove</source> - <translation>Remove</translation> - </message> - <message> - <source>File &name:</source> - <translation>File &name:</translation> - </message> - <message> - <source>Look in:</source> - <translation>Look in:</translation> - </message> - <message> - <source>Create New Folder</source> - <translation>Create New Folder</translation> - </message> - </context> - <context> - <name>QFileSystemModel</name> - <message> - <source>%1 TB</source> - <translation>%1 TB</translation> - </message> - <message> - <source>%1 GB</source> - <translation>%1 GB</translation> - </message> - <message> - <source>%1 MB</source> - <translation>%1 MB</translation> - </message> - <message> - <source>%1 KB</source> - <translation>%1 KB</translation> - </message> - <message> - <source>%1 bytes</source> - <translation>%1 bytes</translation> - </message> - <message> - <source>Invalid filename</source> - <translation>Invalid filename</translation> - </message> - <message> - <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> - <translation><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</translation> - </message> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Size</source> - <translation>Size</translation> - </message> - <message> - <source>Kind</source> - <comment>Match OS X Finder</comment> - <translation>Kind</translation> - </message> - <message> - <source>Type</source> - <comment>All other platforms</comment> - <translation>Type</translation> - </message> - <message> - <source>Date Modified</source> - <translation>Date Modified</translation> - </message> - <message> - <source>My Computer</source> - <translation>My Computer</translation> - </message> - <message> - <source>Computer</source> - <translation>Computer</translation> - </message> - <message> - <source>%1 byte(s)</source> - <translation>%1 byte(s)</translation> - </message> - </context> - <context> - <name>QFontDatabase</name> - <message> - <source>Normal</source> - <translation>Normal</translation> - </message> - <message> - <source>Bold</source> - <translation>Bold</translation> - </message> - <message> - <source>Demi Bold</source> - <translation>Demi Bold</translation> - </message> - <message> - <source>Black</source> - <translation>Black</translation> - </message> - <message> - <source>Demi</source> - <translation>Demi</translation> - </message> - <message> - <source>Light</source> - <translation>Light</translation> - </message> - <message> - <source>Italic</source> - <translation>Italic</translation> - </message> - <message> - <source>Oblique</source> - <translation>Oblique</translation> - </message> - <message> - <source>Any</source> - <translation>Any</translation> - </message> - <message> - <source>Latin</source> - <translation>Latin</translation> - </message> - <message> - <source>Greek</source> - <translation>Greek</translation> - </message> - <message> - <source>Cyrillic</source> - <translation>Cyrillic</translation> - </message> - <message> - <source>Armenian</source> - <translation>Armenian</translation> - </message> - <message> - <source>Hebrew</source> - <translation>Hebrew</translation> - </message> - <message> - <source>Arabic</source> - <translation>Arabic</translation> - </message> - <message> - <source>Syriac</source> - <translation>Syriac</translation> - </message> - <message> - <source>Thaana</source> - <translation>Thaana</translation> - </message> - <message> - <source>Devanagari</source> - <translation>Devanagari</translation> - </message> - <message> - <source>Bengali</source> - <translation>Bengali</translation> - </message> - <message> - <source>Gurmukhi</source> - <translation>Gurmukhi</translation> - </message> - <message> - <source>Gujarati</source> - <translation>Gujarati</translation> - </message> - <message> - <source>Oriya</source> - <translation>Oriya</translation> - </message> - <message> - <source>Tamil</source> - <translation>Tamil</translation> - </message> - <message> - <source>Telugu</source> - <translation>Telugu</translation> - </message> - <message> - <source>Kannada</source> - <translation>Kannada</translation> - </message> - <message> - <source>Malayalam</source> - <translation>Malayalam</translation> - </message> - <message> - <source>Sinhala</source> - <translation>Sinhala</translation> - </message> - <message> - <source>Thai</source> - <translation>Thai</translation> - </message> - <message> - <source>Lao</source> - <translation>Lao</translation> - </message> - <message> - <source>Tibetan</source> - <translation>Tibetan</translation> - </message> - <message> - <source>Myanmar</source> - <translation>Myanmar</translation> - </message> - <message> - <source>Georgian</source> - <translation>Georgian</translation> - </message> - <message> - <source>Khmer</source> - <translation>Khmer</translation> - </message> - <message> - <source>Simplified Chinese</source> - <translation>Simplified Chinese</translation> - </message> - <message> - <source>Traditional Chinese</source> - <translation>Traditional Chinese</translation> - </message> - <message> - <source>Japanese</source> - <translation>Japanese</translation> - </message> - <message> - <source>Korean</source> - <translation>Korean</translation> - </message> - <message> - <source>Vietnamese</source> - <translation>Vietnamese</translation> - </message> - <message> - <source>Symbol</source> - <translation>Symbol</translation> - </message> - <message> - <source>Ogham</source> - <translation>Ogham</translation> - </message> - <message> - <source>Runic</source> - <translation>Runic</translation> - </message> - <message> - <source>N'Ko</source> - <translation>N'Ko</translation> - </message> - </context> - <context> - <name>QFontDialog</name> - <message> - <source>&Font</source> - <translation>&Font</translation> - </message> - <message> - <source>Font st&yle</source> - <translation>Font st&yle</translation> - </message> - <message> - <source>&Size</source> - <translation>&Size</translation> - </message> - <message> - <source>Effects</source> - <translation>Effects</translation> - </message> - <message> - <source>Stri&keout</source> - <translation>Stri&keout</translation> - </message> - <message> - <source>&Underline</source> - <translation>&Underline</translation> - </message> - <message> - <source>Sample</source> - <translation>Sample</translation> - </message> - <message> - <source>Select Font</source> - <translation>Select Font</translation> - </message> - <message> - <source>Wr&iting System</source> - <translation>Wr&iting System</translation> - </message> - </context> - <context> - <name>QFtp</name> - <message> - <source>Host %1 found</source> - <translation>Host %1 found</translation> - </message> - <message> - <source>Host found</source> - <translation>Host found</translation> - </message> - <message> - <source>Connected to host %1</source> - <translation>Connected to host %1</translation> - </message> - <message> - <source>Connected to host</source> - <translation>Connected to host</translation> - </message> - <message> - <source>Connection to %1 closed</source> - <translation>Connection to %1 closed</translation> - </message> - <message> - <source>Connection closed</source> - <translation>Connection closed</translation> - </message> - <message> - <source>Host %1 not found</source> - <translation>Host %1 not found</translation> - </message> - <message> - <source>Connection refused to host %1</source> - <translation>Connection refused to host %1</translation> - </message> - <message> - <source>Connection timed out to host %1</source> - <translation>Connection timed out to host %1</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>Connecting to host failed: -%1</source> - <translation>Connecting to host failed: -%1</translation> - </message> - <message> - <source>Login failed: -%1</source> - <translation>Login failed: -%1</translation> - </message> - <message> - <source>Listing directory failed: -%1</source> - <translation>Listing directory failed: -%1</translation> - </message> - <message> - <source>Changing directory failed: -%1</source> - <translation>Changing directory failed: -%1</translation> - </message> - <message> - <source>Downloading file failed: -%1</source> - <translation>Downloading file failed: -%1</translation> - </message> - <message> - <source>Uploading file failed: -%1</source> - <translation>Uploading file failed: -%1</translation> - </message> - <message> - <source>Removing file failed: -%1</source> - <translation>Removing file failed: -%1</translation> - </message> - <message> - <source>Creating directory failed: -%1</source> - <translation>Creating directory failed: -%1</translation> - </message> - <message> - <source>Removing directory failed: -%1</source> - <translation>Removing directory failed: -%1</translation> - </message> - <message> - <source>Not connected</source> - <translation>Not connected</translation> - </message> - <message> - <source>Connection refused for data connection</source> - <translation>Connection refused for data connection</translation> - </message> - </context> - <context> - <name>QHostInfo</name> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - </context> - <context> - <name>QHostInfoAgent</name> - <message> - <source>Host not found</source> - <translation>Host not found</translation> - </message> - <message> - <source>Unknown address type</source> - <translation>Unknown address type</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>No host name given</source> - <translation>No host name given</translation> - </message> - <message> - <source>Invalid hostname</source> - <translation>Invalid hostname</translation> - </message> - </context> - <context> - <name>QHttp</name> - <message> - <source>Connection refused</source> - <translation>Connection refused</translation> - </message> - <message> - <source>Host %1 not found</source> - <translation>Host %1 not found</translation> - </message> - <message> - <source>Wrong content length</source> - <translation>Wrong content length</translation> - </message> - <message> - <source>HTTP request failed</source> - <translation>HTTP request failed</translation> - </message> - <message> - <source>Host %1 found</source> - <translation>Host %1 found</translation> - </message> - <message> - <source>Host found</source> - <translation>Host found</translation> - </message> - <message> - <source>Connected to host %1</source> - <translation>Connected to host %1</translation> - </message> - <message> - <source>Connected to host</source> - <translation>Connected to host</translation> - </message> - <message> - <source>Connection to %1 closed</source> - <translation>Connection to %1 closed</translation> - </message> - <message> - <source>Connection closed</source> - <translation>Connection closed</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>Request aborted</source> - <translation>Request aborted</translation> - </message> - <message> - <source>No server set to connect to</source> - <translation>No server set to connect to</translation> - </message> - <message> - <source>Server closed connection unexpectedly</source> - <translation>Server closed connection unexpectedly</translation> - </message> - <message> - <source>Invalid HTTP response header</source> - <translation>Invalid HTTP response header</translation> - </message> - <message> - <source>Unknown authentication method</source> - <translation>Unknown authentication method</translation> - </message> - <message> - <source>Invalid HTTP chunked body</source> - <translation>Invalid HTTP chunked body</translation> - </message> - <message> - <source>Error writing response to device</source> - <translation>Error writing response to device</translation> - </message> - <message> - <source>Proxy authentication required</source> - <translation>Proxy authentication required</translation> - </message> - <message> - <source>Authentication required</source> - <translation>Authentication required</translation> - </message> - <message> - <source>Proxy requires authentication</source> - <translation>Proxy requires authentication</translation> - </message> - <message> - <source>Host requires authentication</source> - <translation>Host requires authentication</translation> - </message> - <message> - <source>Data corrupted</source> - <translation>Data corrupted</translation> - </message> - <message> - <source>SSL handshake failed</source> - <translation>SSL handshake failed</translation> - </message> - <message> - <source>Unknown protocol specified</source> - <translation>Unknown protocol specified</translation> - </message> - <message> - <source>Connection refused (or timed out)</source> - <translation>Connection refused (or timed out)</translation> - </message> - <message> - <source>HTTPS connection requested but SSL support not compiled in</source> - <translation>HTTPS connection requested but SSL support not compiled in</translation> - </message> - </context> - <context> - <name>QHttpSocketEngine</name> - <message> - <source>Did not receive HTTP response from proxy</source> - <translation>Did not receive HTTP response from proxy</translation> - </message> - <message> - <source>Error parsing authentication request from proxy</source> - <translation>Error parsing authentication request from proxy</translation> - </message> - <message> - <source>Authentication required</source> - <translation>Authentication required</translation> - </message> - <message> - <source>Proxy denied connection</source> - <translation>Proxy denied connection</translation> - </message> - <message> - <source>Error communicating with HTTP proxy</source> - <translation>Error communicating with HTTP proxy</translation> - </message> - <message> - <source>Proxy server not found</source> - <translation>Proxy server not found</translation> - </message> - <message> - <source>Proxy connection refused</source> - <translation>Proxy connection refused</translation> - </message> - <message> - <source>Proxy server connection timed out</source> - <translation>Proxy server connection timed out</translation> - </message> - <message> - <source>Proxy connection closed prematurely</source> - <translation>Proxy connection closed prematurely</translation> - </message> - </context> - <context> - <name>QIBaseDriver</name> - <message> - <source>Error opening database</source> - <translation>Error opening database</translation> - </message> - <message> - <source>Could not start transaction</source> - <translation>Could not start transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QIBaseResult</name> - <message> - <source>Unable to create BLOB</source> - <translation>Unable to create BLOB</translation> - </message> - <message> - <source>Unable to write BLOB</source> - <translation>Unable to write BLOB</translation> - </message> - <message> - <source>Unable to open BLOB</source> - <translation>Unable to open BLOB</translation> - </message> - <message> - <source>Unable to read BLOB</source> - <translation>Unable to read BLOB</translation> - </message> - <message> - <source>Could not find array</source> - <translation>Could not find array</translation> - </message> - <message> - <source>Could not get array data</source> - <translation>Could not get array data</translation> - </message> - <message> - <source>Could not get query info</source> - <translation>Could not get query info</translation> - </message> - <message> - <source>Could not start transaction</source> - <translation>Could not start transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Could not allocate statement</source> - <translation>Could not allocate statement</translation> - </message> - <message> - <source>Could not prepare statement</source> - <translation>Could not prepare statement</translation> - </message> - <message> - <source>Could not describe input statement</source> - <translation>Could not describe input statement</translation> - </message> - <message> - <source>Could not describe statement</source> - <translation>Could not describe statement</translation> - </message> - <message> - <source>Unable to close statement</source> - <translation>Unable to close statement</translation> - </message> - <message> - <source>Unable to execute query</source> - <translation>Unable to execute query</translation> - </message> - <message> - <source>Could not fetch next item</source> - <translation>Could not fetch next item</translation> - </message> - <message> - <source>Could not get statement info</source> - <translation>Could not get statement info</translation> - </message> - </context> - <context> - <name>QIODevice</name> - <message> - <source>Permission denied</source> - <translation>Permission denied</translation> - </message> - <message> - <source>Too many open files</source> - <translation>Too many open files</translation> - </message> - <message> - <source>No such file or directory</source> - <translation>No such file or directory</translation> - </message> - <message> - <source>No space left on device</source> - <translation>No space left on device</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - </context> - <context> - <name>QInputContext</name> - <message> - <source>XIM</source> - <translation>XIM</translation> - </message> - <message> - <source>FEP</source> - <translation>FEP</translation> - </message> - <message> - <source>XIM input method</source> - <translation>XIM input method</translation> - </message> - <message> - <source>Windows input method</source> - <translation>Windows input method</translation> - </message> - <message> - <source>Mac OS X input method</source> - <translation>Mac OS X input method</translation> - </message> - <message> - <source>S60 FEP input method</source> - <translation>S60 FEP input method</translation> - </message> - </context> - <context> - <name>QInputDialog</name> - <message> - <source>Enter a value:</source> - <translation>Enter a value:</translation> - </message> - </context> - <context> - <name>QLibrary</name> - <message> - <source>Could not mmap '%1': %2</source> - <translation>Could not mmap '%1': %2</translation> - </message> - <message> - <source>Plugin verification data mismatch in '%1'</source> - <translation>Plugin verification data mismatch in '%1'</translation> - </message> - <message> - <source>Could not unmap '%1': %2</source> - <translation>Could not unmap '%1': %2</translation> - </message> - <message> - <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> - <translation>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</translation> - </message> - <message> - <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> - <translation>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>The shared library was not found.</source> - <translation>The shared library was not found.</translation> - </message> - <message> - <source>The file '%1' is not a valid Qt plugin.</source> - <translation>The file '%1' is not a valid Qt plugin.</translation> - </message> - <message> - <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> - <translation>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</translation> - </message> - <message> - <source>Cannot load library %1: %2</source> - <translation>Cannot load library %1: %2</translation> - </message> - <message> - <source>Cannot unload library %1: %2</source> - <translation>Cannot unload library %1: %2</translation> - </message> - <message> - <source>Cannot resolve symbol "%1" in %2: %3</source> - <translation>Cannot resolve symbol "%1" in %2: %3</translation> - </message> - </context> - <context> - <name>QLineEdit</name> - <message> - <source>Select All</source> - <translation>Select All</translation> - </message> - <message> - <source>&Undo</source> - <translation>&Undo</translation> - </message> - <message> - <source>&Redo</source> - <translation>&Redo</translation> - </message> - <message> - <source>Cu&t</source> - <translation>Cu&t</translation> - </message> - <message> - <source>&Copy</source> - <translation>&Copy</translation> - </message> - <message> - <source>&Paste</source> - <translation>&Paste</translation> - </message> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - </context> - <context> - <name>QLocalServer</name> - <message> - <source>%1: Name error</source> - <translation>%1: Name error</translation> - </message> - <message> - <source>%1: Permission denied</source> - <translation>%1: Permission denied</translation> - </message> - <message> - <source>%1: Address in use</source> - <translation>%1: Address in use</translation> - </message> - <message> - <source>%1: Unknown error %2</source> - <translation>%1: Unknown error %2</translation> - </message> - </context> - <context> - <name>QLocalSocket</name> - <message> - <source>%1: Connection refused</source> - <translation>%1: Connection refused</translation> - </message> - <message> - <source>%1: Remote closed</source> - <translation>%1: Remote closed</translation> - </message> - <message> - <source>%1: Invalid name</source> - <translation>%1: Invalid name</translation> - </message> - <message> - <source>%1: Socket access error</source> - <translation>%1: Socket access error</translation> - </message> - <message> - <source>%1: Socket resource error</source> - <translation>%1: Socket resource error</translation> - </message> - <message> - <source>%1: Socket operation timed out</source> - <translation>%1: Socket operation timed out</translation> - </message> - <message> - <source>%1: Datagram too large</source> - <translation>%1: Datagram too large</translation> - </message> - <message> - <source>%1: Connection error</source> - <translation>%1: Connection error</translation> - </message> - <message> - <source>%1: The socket operation is not supported</source> - <translation>%1: The socket operation is not supported</translation> - </message> - <message> - <source>%1: Unknown error</source> - <translation>%1: Unknown error</translation> - </message> - <message> - <source>%1: Unknown error %2</source> - <translation>%1: Unknown error %2</translation> - </message> - </context> - <context> - <name>QMYSQLDriver</name> - <message> - <source>Unable to open database '</source> - <translation>Unable to open database '</translation> - </message> - <message> - <source>Unable to connect</source> - <translation>Unable to connect</translation> - </message> - <message> - <source>Unable to begin transaction</source> - <translation>Unable to begin transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QMYSQLResult</name> - <message> - <source>Unable to fetch data</source> - <translation>Unable to fetch data</translation> - </message> - <message> - <source>Unable to execute query</source> - <translation>Unable to execute query</translation> - </message> - <message> - <source>Unable to store result</source> - <translation>Unable to store result</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - <message> - <source>Unable to reset statement</source> - <translation>Unable to reset statement</translation> - </message> - <message> - <source>Unable to bind value</source> - <translation>Unable to bind value</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - <message> - <source>Unable to bind outvalues</source> - <translation>Unable to bind outvalues</translation> - </message> - <message> - <source>Unable to store statement results</source> - <translation>Unable to store statement results</translation> - </message> - <message> - <source>Unable to execute next query</source> - <translation>Unable to execute next query</translation> - </message> - <message> - <source>Unable to store next result</source> - <translation>Unable to store next result</translation> - </message> - </context> - <context> - <name>QMdiArea</name> - <message> - <source>(Untitled)</source> - <translation>(Untitled)</translation> - </message> - </context> - <context> - <name>QMdiSubWindow</name> - <message> - <source>%1 - [%2]</source> - <translation>%1 - [%2]</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Minimize</source> - <translation>Minimize</translation> - </message> - <message> - <source>Restore Down</source> - <translation>Restore Down</translation> - </message> - <message> - <source>&Restore</source> - <translation>&Restore</translation> - </message> - <message> - <source>&Move</source> - <translation>&Move</translation> - </message> - <message> - <source>&Size</source> - <translation>&Size</translation> - </message> - <message> - <source>Mi&nimize</source> - <translation>Mi&nimize</translation> - </message> - <message> - <source>Ma&ximize</source> - <translation>Ma&ximize</translation> - </message> - <message> - <source>Stay on &Top</source> - <translation>Stay on &Top</translation> - </message> - <message> - <source>&Close</source> - <translation>&Close</translation> - </message> - <message> - <source>Maximize</source> - <translation>Maximize</translation> - </message> - <message> - <source>Unshade</source> - <translation>Unshade</translation> - </message> - <message> - <source>Shade</source> - <translation>Shade</translation> - </message> - <message> - <source>Restore</source> - <translation>Restore</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>Menu</source> - <translation>Menu</translation> - </message> - <message> - <source>- [%1]</source> - <translation>- [%1]</translation> - </message> - </context> - <context> - <name>QMenu</name> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - <message> - <source>Execute</source> - <translation>Execute</translation> - </message> - </context> - <context> - <name>QMenuBar</name> - <message> - <source>Actions</source> - <translation>Actions</translation> - </message> - </context> - <context> - <name>QMessageBox</name> - <message> - <source>OK</source> - <translation>OK</translation> - </message> - <message> - <source><h3>About Qt</h3><p>This program uses Qt version %1.</p></source> - <translation><h3>About Qt</h3><p>This program uses Qt version %1.</p></translation> - </message> - <message> - <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></translation> - </message> - <message> - <source>About Qt</source> - <translation>About Qt</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>Show Details...</source> - <translation>Show Details...</translation> - </message> - <message> - <source>Hide Details...</source> - <translation>Hide Details...</translation> - </message> - </context> - <context> - <name>QMultiInputContext</name> - <message> - <source>Select IM</source> - <translation>Select IM</translation> - </message> - </context> - <context> - <name>QMultiInputContextPlugin</name> - <message> - <source>Multiple input method switcher</source> - <translation>Multiple input method switcher</translation> - </message> - <message> - <source>Multiple input method switcher that uses the context menu of the text widgets</source> - <translation>Multiple input method switcher that uses the context menu of the text widgets</translation> - </message> - </context> - <context> - <name>QNativeSocketEngine</name> - <message> - <source>The remote host closed the connection</source> - <translation>The remote host closed the connection</translation> - </message> - <message> - <source>Network operation timed out</source> - <translation>Network operation timed out</translation> - </message> - <message> - <source>Out of resources</source> - <translation>Out of resources</translation> - </message> - <message> - <source>Unsupported socket operation</source> - <translation>Unsupported socket operation</translation> - </message> - <message> - <source>Protocol type not supported</source> - <translation>Protocol type not supported</translation> - </message> - <message> - <source>Invalid socket descriptor</source> - <translation>Invalid socket descriptor</translation> - </message> - <message> - <source>Network unreachable</source> - <translation>Network unreachable</translation> - </message> - <message> - <source>Permission denied</source> - <translation>Permission denied</translation> - </message> - <message> - <source>Connection timed out</source> - <translation>Connection timed out</translation> - </message> - <message> - <source>Connection refused</source> - <translation>Connection refused</translation> - </message> - <message> - <source>The bound address is already in use</source> - <translation>The bound address is already in use</translation> - </message> - <message> - <source>The address is not available</source> - <translation>The address is not available</translation> - </message> - <message> - <source>The address is protected</source> - <translation>The address is protected</translation> - </message> - <message> - <source>Unable to send a message</source> - <translation>Unable to send a message</translation> - </message> - <message> - <source>Unable to receive a message</source> - <translation>Unable to receive a message</translation> - </message> - <message> - <source>Unable to write</source> - <translation>Unable to write</translation> - </message> - <message> - <source>Network error</source> - <translation>Network error</translation> - </message> - <message> - <source>Another socket is already listening on the same port</source> - <translation>Another socket is already listening on the same port</translation> - </message> - <message> - <source>Unable to initialize non-blocking socket</source> - <translation>Unable to initialize non-blocking socket</translation> - </message> - <message> - <source>Unable to initialize broadcast socket</source> - <translation>Unable to initialize broadcast socket</translation> - </message> - <message> - <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> - <translation>Attempt to use IPv6 socket on a platform with no IPv6 support</translation> - </message> - <message> - <source>Host unreachable</source> - <translation>Host unreachable</translation> - </message> - <message> - <source>Datagram was too large to send</source> - <translation>Datagram was too large to send</translation> - </message> - <message> - <source>Operation on non-socket</source> - <translation>Operation on non-socket</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>The proxy type is invalid for this operation</source> - <translation>The proxy type is invalid for this operation</translation> - </message> - </context> - <context> - <name>QNetworkAccessCacheBackend</name> - <message> - <source>Error opening %1</source> - <translation>Error opening %1</translation> - </message> - </context> - <context> - <name>QNetworkAccessDebugPipeBackend</name> - <message> - <source>Write error writing to %1: %2</source> - <translation>Write error writing to %1: %2</translation> - </message> - </context> - <context> - <name>QNetworkAccessFileBackend</name> - <message> - <source>Request for opening non-local file %1</source> - <translation>Request for opening non-local file %1</translation> - </message> - <message> - <source>Error opening %1: %2</source> - <translation>Error opening %1: %2</translation> - </message> - <message> - <source>Write error writing to %1: %2</source> - <translation>Write error writing to %1: %2</translation> - </message> - <message> - <source>Cannot open %1: Path is a directory</source> - <translation>Cannot open %1: Path is a directory</translation> - </message> - <message> - <source>Read error reading from %1: %2</source> - <translation>Read error reading from %1: %2</translation> - </message> - </context> - <context> - <name>QNetworkAccessFtpBackend</name> - <message> - <source>No suitable proxy found</source> - <translation>No suitable proxy found</translation> - </message> - <message> - <source>Cannot open %1: is a directory</source> - <translation>Cannot open %1: is a directory</translation> - </message> - <message> - <source>Logging in to %1 failed: authentication required</source> - <translation>Logging in to %1 failed: authentication required</translation> - </message> - <message> - <source>Error while downloading %1: %2</source> - <translation>Error while downloading %1: %2</translation> - </message> - <message> - <source>Error while uploading %1: %2</source> - <translation>Error while uploading %1: %2</translation> - </message> - </context> - <context> - <name>QNetworkAccessHttpBackend</name> - <message> - <source>No suitable proxy found</source> - <translation>No suitable proxy found</translation> - </message> - </context> - <context> - <name>QNetworkReply</name> - <message> - <source>Error downloading %1 - server replied: %2</source> - <translation>Error downloading %1 - server replied: %2</translation> - </message> - <message> - <source>Protocol "%1" is unknown</source> - <translation>Protocol "%1" is unknown</translation> - </message> - </context> - <context> - <name>QNetworkReplyImpl</name> - <message> - <source>Operation canceled</source> - <translation>Operation canceled</translation> - </message> - </context> - <context> - <name>QOCIDriver</name> - <message> - <source>Unable to logon</source> - <translation>Unable to logon</translation> - </message> - <message> - <source>Unable to initialize</source> - <comment>QOCIDriver</comment> - <translation>Unable to initialize</translation> - </message> - <message> - <source>Unable to begin transaction</source> - <translation>Unable to begin transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QOCIResult</name> - <message> - <source>Unable to bind column for batch execute</source> - <translation>Unable to bind column for batch execute</translation> - </message> - <message> - <source>Unable to execute batch statement</source> - <translation>Unable to execute batch statement</translation> - </message> - <message> - <source>Unable to goto next</source> - <translation>Unable to goto next</translation> - </message> - <message> - <source>Unable to alloc statement</source> - <translation>Unable to alloc statement</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - <message> - <source>Unable to get statement type</source> - <translation>Unable to get statement type</translation> - </message> - <message> - <source>Unable to bind value</source> - <translation>Unable to bind value</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - </context> - <context> - <name>QODBCDriver</name> - <message> - <source>Unable to connect</source> - <translation>Unable to connect</translation> - </message> - <message> - <source>Unable to disable autocommit</source> - <translation>Unable to disable autocommit</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - <message> - <source>Unable to enable autocommit</source> - <translation>Unable to enable autocommit</translation> - </message> - <message> - <source>Unable to connect - Driver doesn't support all functionality required</source> - <translation>Unable to connect - Driver doesn't support all functionality required</translation> - </message> - </context> - <context> - <name>QODBCResult</name> - <message> - <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> - <translation>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - <message> - <source>Unable to fetch next</source> - <translation>Unable to fetch next</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - <message> - <source>Unable to bind variable</source> - <translation>Unable to bind variable</translation> - </message> - <message> - <source>Unable to fetch last</source> - <translation>Unable to fetch last</translation> - </message> - <message> - <source>Unable to fetch</source> - <translation>Unable to fetch</translation> - </message> - <message> - <source>Unable to fetch first</source> - <translation>Unable to fetch first</translation> - </message> - <message> - <source>Unable to fetch previous</source> - <translation>Unable to fetch previous</translation> - </message> - </context> - <context> - <name>QObject</name> - <message> - <source>Invalid hostname</source> - <translation>Invalid hostname</translation> - </message> - <message> - <source>Operation not supported on %1</source> - <translation>Operation not supported on %1</translation> - </message> - <message> - <source>Invalid URI: %1</source> - <translation>Invalid URI: %1</translation> - </message> - <message> - <source>Socket error on %1: %2</source> - <translation>Socket error on %1: %2</translation> - </message> - <message> - <source>Remote host closed the connection prematurely on %1</source> - <translation>Remote host closed the connection prematurely on %1</translation> - </message> - <message> - <source>No host name given</source> - <translation>No host name given</translation> - </message> - </context> - <context> - <name>QPPDOptionsModel</name> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Value</source> - <translation>Value</translation> - </message> - </context> - <context> - <name>QPSQLDriver</name> - <message> - <source>Unable to connect</source> - <translation>Unable to connect</translation> - </message> - <message> - <source>Could not begin transaction</source> - <translation>Could not begin transaction</translation> - </message> - <message> - <source>Could not commit transaction</source> - <translation>Could not commit transaction</translation> - </message> - <message> - <source>Could not rollback transaction</source> - <translation>Could not rollback transaction</translation> - </message> - <message> - <source>Unable to subscribe</source> - <translation>Unable to subscribe</translation> - </message> - <message> - <source>Unable to unsubscribe</source> - <translation>Unable to unsubscribe</translation> - </message> - </context> - <context> - <name>QPSQLResult</name> - <message> - <source>Unable to create query</source> - <translation>Unable to create query</translation> - </message> - <message> - <source>Unable to prepare statement</source> - <translation>Unable to prepare statement</translation> - </message> - </context> - <context> - <name>QPageSetupWidget</name> - <message> - <source>Centimeters (cm)</source> - <translation>Centimeters (cm)</translation> - </message> - <message> - <source>Millimeters (mm)</source> - <translation>Millimeters (mm)</translation> - </message> - <message> - <source>Inches (in)</source> - <translation>Inches (in)</translation> - </message> - <message> - <source>Points (pt)</source> - <translation>Points (pt)</translation> - </message> - <message> - <source>Form</source> - <translation>Form</translation> - </message> - <message> - <source>Paper</source> - <translation>Paper</translation> - </message> - <message> - <source>Page size:</source> - <translation>Page size:</translation> - </message> - <message> - <source>Width:</source> - <translation>Width:</translation> - </message> - <message> - <source>Height:</source> - <translation>Height:</translation> - </message> - <message> - <source>Paper source:</source> - <translation>Paper source:</translation> - </message> - <message> - <source>Orientation</source> - <translation>Orientation</translation> - </message> - <message> - <source>Portrait</source> - <translation>Portrait</translation> - </message> - <message> - <source>Landscape</source> - <translation>Landscape</translation> - </message> - <message> - <source>Reverse landscape</source> - <translation>Reverse landscape</translation> - </message> - <message> - <source>Reverse portrait</source> - <translation>Reverse portrait</translation> - </message> - <message> - <source>Margins</source> - <translation>Margins</translation> - </message> - <message> - <source>top margin</source> - <translation>top margin</translation> - </message> - <message> - <source>left margin</source> - <translation>left margin</translation> - </message> - <message> - <source>right margin</source> - <translation>right margin</translation> - </message> - <message> - <source>bottom margin</source> - <translation>bottom margin</translation> - </message> - </context> - <context> - <name>QPluginLoader</name> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - <message> - <source>The plugin was not loaded.</source> - <translation>The plugin was not loaded.</translation> - </message> - </context> - <context> - <name>QPrintDialog</name> - <message> - <source>locally connected</source> - <translation>locally connected</translation> - </message> - <message> - <source>Aliases: %1</source> - <translation>Aliases: %1</translation> - </message> - <message> - <source>unknown</source> - <translation>unknown</translation> - </message> - <message> - <source>OK</source> - <translation>OK</translation> - </message> - <message> - <source>Print all</source> - <translation>Print all</translation> - </message> - <message> - <source>Print range</source> - <translation>Print range</translation> - </message> - <message> - <source>A0 (841 x 1189 mm)</source> - <translation>A0 (841 x 1189 mm)</translation> - </message> - <message> - <source>A1 (594 x 841 mm)</source> - <translation>A1 (594 x 841 mm)</translation> - </message> - <message> - <source>A2 (420 x 594 mm)</source> - <translation>A2 (420 x 594 mm)</translation> - </message> - <message> - <source>A3 (297 x 420 mm)</source> - <translation>A3 (297 x 420 mm)</translation> - </message> - <message> - <source>A5 (148 x 210 mm)</source> - <translation>A5 (148 x 210 mm)</translation> - </message> - <message> - <source>A6 (105 x 148 mm)</source> - <translation>A6 (105 x 148 mm)</translation> - </message> - <message> - <source>A7 (74 x 105 mm)</source> - <translation>A7 (74 x 105 mm)</translation> - </message> - <message> - <source>A8 (52 x 74 mm)</source> - <translation>A8 (52 x 74 mm)</translation> - </message> - <message> - <source>A9 (37 x 52 mm)</source> - <translation>A9 (37 x 52 mm)</translation> - </message> - <message> - <source>B0 (1000 x 1414 mm)</source> - <translation>B0 (1000 x 1414 mm)</translation> - </message> - <message> - <source>B1 (707 x 1000 mm)</source> - <translation>B1 (707 x 1000 mm)</translation> - </message> - <message> - <source>B2 (500 x 707 mm)</source> - <translation>B2 (500 x 707 mm)</translation> - </message> - <message> - <source>B3 (353 x 500 mm)</source> - <translation>B3 (353 x 500 mm)</translation> - </message> - <message> - <source>B4 (250 x 353 mm)</source> - <translation>B4 (250 x 353 mm)</translation> - </message> - <message> - <source>B6 (125 x 176 mm)</source> - <translation>B6 (125 x 176 mm)</translation> - </message> - <message> - <source>B7 (88 x 125 mm)</source> - <translation>B7 (88 x 125 mm)</translation> - </message> - <message> - <source>B8 (62 x 88 mm)</source> - <translation>B8 (62 x 88 mm)</translation> - </message> - <message> - <source>B9 (44 x 62 mm)</source> - <translation>B9 (44 x 62 mm)</translation> - </message> - <message> - <source>B10 (31 x 44 mm)</source> - <translation>B10 (31 x 44 mm)</translation> - </message> - <message> - <source>C5E (163 x 229 mm)</source> - <translation>C5E (163 x 229 mm)</translation> - </message> - <message> - <source>DLE (110 x 220 mm)</source> - <translation>DLE (110 x 220 mm)</translation> - </message> - <message> - <source>Folio (210 x 330 mm)</source> - <translation>Folio (210 x 330 mm)</translation> - </message> - <message> - <source>Ledger (432 x 279 mm)</source> - <translation>Ledger (432 x 279 mm)</translation> - </message> - <message> - <source>Tabloid (279 x 432 mm)</source> - <translation>Tabloid (279 x 432 mm)</translation> - </message> - <message> - <source>US Common #10 Envelope (105 x 241 mm)</source> - <translation>US Common #10 Envelope (105 x 241 mm)</translation> - </message> - <message> - <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> - <translation>A4 (210 x 297 mm, 8.26 x 11.7 inches)</translation> - </message> - <message> - <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> - <translation>B5 (176 x 250 mm, 6.93 x 9.84 inches)</translation> - </message> - <message> - <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> - <translation>Executive (7.5 x 10 inches, 191 x 254 mm)</translation> - </message> - <message> - <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> - <translation>Legal (8.5 x 14 inches, 216 x 356 mm)</translation> - </message> - <message> - <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> - <translation>Letter (8.5 x 11 inches, 216 x 279 mm)</translation> - </message> - <message> - <source>Print selection</source> - <translation>Print selection</translation> - </message> - <message> - <source>Print</source> - <translation>Print</translation> - </message> - <message> - <source>Print To File ...</source> - <translation>Print To File ...</translation> - </message> - <message> - <source>File %1 is not writable. -Please choose a different file name.</source> - <translation>File %1 is not writable. -Please choose a different file name.</translation> - </message> - <message> - <source>%1 already exists. -Do you want to overwrite it?</source> - <translation>%1 already exists. -Do you want to overwrite it?</translation> - </message> - <message> - <source>File exists</source> - <translation>File exists</translation> - </message> - <message> - <source><qt>Do you want to overwrite it?</qt></source> - <translation><qt>Do you want to overwrite it?</qt></translation> - </message> - <message> - <source>%1 is a directory. -Please choose a different file name.</source> - <translation>%1 is a directory. -Please choose a different file name.</translation> - </message> - <message> - <source>The 'From' value cannot be greater than the 'To' value.</source> - <translation>The 'From' value cannot be greater than the 'To' value.</translation> - </message> - <message> - <source>A0</source> - <translation>A0</translation> - </message> - <message> - <source>A1</source> - <translation>A1</translation> - </message> - <message> - <source>A2</source> - <translation>A2</translation> - </message> - <message> - <source>A3</source> - <translation>A3</translation> - </message> - <message> - <source>A4</source> - <translation>A4</translation> - </message> - <message> - <source>A5</source> - <translation>A5</translation> - </message> - <message> - <source>A6</source> - <translation>A6</translation> - </message> - <message> - <source>A7</source> - <translation>A7</translation> - </message> - <message> - <source>A8</source> - <translation>A8</translation> - </message> - <message> - <source>A9</source> - <translation>A9</translation> - </message> - <message> - <source>B0</source> - <translation>B0</translation> - </message> - <message> - <source>B1</source> - <translation>B1</translation> - </message> - <message> - <source>B2</source> - <translation>B2</translation> - </message> - <message> - <source>B3</source> - <translation>B3</translation> - </message> - <message> - <source>B4</source> - <translation>B4</translation> - </message> - <message> - <source>B5</source> - <translation>B5</translation> - </message> - <message> - <source>B6</source> - <translation>B6</translation> - </message> - <message> - <source>B7</source> - <translation>B7</translation> - </message> - <message> - <source>B8</source> - <translation>B8</translation> - </message> - <message> - <source>B9</source> - <translation>B9</translation> - </message> - <message> - <source>B10</source> - <translation>B10</translation> - </message> - <message> - <source>C5E</source> - <translation>C5E</translation> - </message> - <message> - <source>DLE</source> - <translation>DLE</translation> - </message> - <message> - <source>Executive</source> - <translation>Executive</translation> - </message> - <message> - <source>Folio</source> - <translation>Folio</translation> - </message> - <message> - <source>Ledger</source> - <translation>Ledger</translation> - </message> - <message> - <source>Legal</source> - <translation>Legal</translation> - </message> - <message> - <source>Letter</source> - <translation>Letter</translation> - </message> - <message> - <source>Tabloid</source> - <translation>Tabloid</translation> - </message> - <message> - <source>US Common #10 Envelope</source> - <translation>US Common #10 Envelope</translation> - </message> - <message> - <source>Custom</source> - <translation>Custom</translation> - </message> - <message> - <source>&Options >></source> - <translation>&Options >></translation> - </message> - <message> - <source>&Options <<</source> - <translation>&Options <<</translation> - </message> - <message> - <source>Print to File (PDF)</source> - <translation>Print to File (PDF)</translation> - </message> - <message> - <source>Print to File (Postscript)</source> - <translation>Print to File (Postscript)</translation> - </message> - <message> - <source>Local file</source> - <translation>Local file</translation> - </message> - <message> - <source>Write %1 file</source> - <translation>Write %1 file</translation> - </message> - <message> - <source>&Print</source> - <translation>&Print</translation> - </message> - </context> - <context> - <name>QPrintPreviewDialog</name> - <message> - <source>%1%</source> - <translation>%1%</translation> - </message> - <message> - <source>Print Preview</source> - <translation>Print Preview</translation> - </message> - <message> - <source>Next page</source> - <translation>Next page</translation> - </message> - <message> - <source>Previous page</source> - <translation>Previous page</translation> - </message> - <message> - <source>First page</source> - <translation>First page</translation> - </message> - <message> - <source>Last page</source> - <translation>Last page</translation> - </message> - <message> - <source>Fit width</source> - <translation>Fit width</translation> - </message> - <message> - <source>Fit page</source> - <translation>Fit page</translation> - </message> - <message> - <source>Zoom in</source> - <translation>Zoom in</translation> - </message> - <message> - <source>Zoom out</source> - <translation>Zoom out</translation> - </message> - <message> - <source>Portrait</source> - <translation>Portrait</translation> - </message> - <message> - <source>Landscape</source> - <translation>Landscape</translation> - </message> - <message> - <source>Show single page</source> - <translation>Show single page</translation> - </message> - <message> - <source>Show facing pages</source> - <translation>Show facing pages</translation> - </message> - <message> - <source>Show overview of all pages</source> - <translation>Show overview of all pages</translation> - </message> - <message> - <source>Print</source> - <translation>Print</translation> - </message> - <message> - <source>Page setup</source> - <translation>Page setup</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Export to PDF</source> - <translation>Export to PDF</translation> - </message> - <message> - <source>Export to PostScript</source> - <translation>Export to PostScript</translation> - </message> - <message> - <source>Page Setup</source> - <translation>Page Setup</translation> - </message> - </context> - <context> - <name>QPrintPropertiesWidget</name> - <message> - <source>Form</source> - <translation>Form</translation> - </message> - <message> - <source>Page</source> - <translation>Page</translation> - </message> - <message> - <source>Advanced</source> - <translation>Advanced</translation> - </message> - </context> - <context> - <name>QPrintSettingsOutput</name> - <message> - <source>Form</source> - <translation>Form</translation> - </message> - <message> - <source>Copies</source> - <translation>Copies</translation> - </message> - <message> - <source>Print range</source> - <translation>Print range</translation> - </message> - <message> - <source>Print all</source> - <translation>Print all</translation> - </message> - <message> - <source>Pages from</source> - <translation>Pages from</translation> - </message> - <message> - <source>to</source> - <translation>to</translation> - </message> - <message> - <source>Selection</source> - <translation>Selection</translation> - </message> - <message> - <source>Output Settings</source> - <translation>Output Settings</translation> - </message> - <message> - <source>Copies:</source> - <translation>Copies:</translation> - </message> - <message> - <source>Collate</source> - <translation>Collate</translation> - </message> - <message> - <source>Reverse</source> - <translation>Reverse</translation> - </message> - <message> - <source>Options</source> - <translation>Options</translation> - </message> - <message> - <source>Color Mode</source> - <translation>Color Mode</translation> - </message> - <message> - <source>Color</source> - <translation>Color</translation> - </message> - <message> - <source>Grayscale</source> - <translation>Grayscale</translation> - </message> - <message> - <source>Duplex Printing</source> - <translation>Duplex Printing</translation> - </message> - <message> - <source>None</source> - <translation>None</translation> - </message> - <message> - <source>Long side</source> - <translation>Long side</translation> - </message> - <message> - <source>Short side</source> - <translation>Short side</translation> - </message> - </context> - <context> - <name>QPrintWidget</name> - <message> - <source>Form</source> - <translation>Form</translation> - </message> - <message> - <source>Printer</source> - <translation>Printer</translation> - </message> - <message> - <source>&Name:</source> - <translation>&Name:</translation> - </message> - <message> - <source>P&roperties</source> - <translation>P&roperties</translation> - </message> - <message> - <source>Location:</source> - <translation>Location:</translation> - </message> - <message> - <source>Preview</source> - <translation>Preview</translation> - </message> - <message> - <source>Type:</source> - <translation>Type:</translation> - </message> - <message> - <source>Output &file:</source> - <translation>Output &file:</translation> - </message> - <message> - <source>...</source> - <translation>...</translation> - </message> - </context> - <context> - <name>QProcess</name> - <message> - <source>Could not open input redirection for reading</source> - <translation>Could not open input redirection for reading</translation> - </message> - <message> - <source>Could not open output redirection for writing</source> - <translation>Could not open output redirection for writing</translation> - </message> - <message> - <source>Resource error (fork failure): %1</source> - <translation>Resource error (fork failure): %1</translation> - </message> - <message> - <source>Process operation timed out</source> - <translation>Process operation timed out</translation> - </message> - <message> - <source>Error reading from process</source> - <translation>Error reading from process</translation> - </message> - <message> - <source>Error writing to process</source> - <translation>Error writing to process</translation> - </message> - <message> - <source>Process crashed</source> - <translation>Process crashed</translation> - </message> - <message> - <source>No program defined</source> - <translation>No program defined</translation> - </message> - <message> - <source>Process failed to start: %1</source> - <translation>Process failed to start: %1</translation> - </message> - </context> - <context> - <name>QProgressDialog</name> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - </context> - <context> - <name>QPushButton</name> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - </context> - <context> - <name>QRadioButton</name> - <message> - <source>Check</source> - <translation>Check</translation> - </message> - </context> - <context> - <name>QRegExp</name> - <message> - <source>no error occurred</source> - <translation>no error occurred</translation> - </message> - <message> - <source>disabled feature used</source> - <translation>disabled feature used</translation> - </message> - <message> - <source>bad char class syntax</source> - <translation>bad char class syntax</translation> - </message> - <message> - <source>bad lookahead syntax</source> - <translation>bad lookahead syntax</translation> - </message> - <message> - <source>bad repetition syntax</source> - <translation>bad repetition syntax</translation> - </message> - <message> - <source>invalid octal value</source> - <translation>invalid octal value</translation> - </message> - <message> - <source>missing left delim</source> - <translation>missing left delim</translation> - </message> - <message> - <source>unexpected end</source> - <translation>unexpected end</translation> - </message> - <message> - <source>met internal limit</source> - <translation>met internal limit</translation> - </message> - <message> - <source>invalid interval</source> - <translation>invalid interval</translation> - </message> - <message> - <source>invalid category</source> - <translation>invalid category</translation> - </message> - </context> - <context> - <name>QSQLite2Driver</name> - <message> - <source>Error opening database</source> - <translation>Error opening database</translation> - </message> - <message> - <source>Unable to begin transaction</source> - <translation>Unable to begin transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QSQLite2Result</name> - <message> - <source>Unable to fetch results</source> - <translation>Unable to fetch results</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - </context> - <context> - <name>QSQLiteDriver</name> - <message> - <source>Error opening database</source> - <translation>Error opening database</translation> - </message> - <message> - <source>Error closing database</source> - <translation>Error closing database</translation> - </message> - <message> - <source>Unable to begin transaction</source> - <translation>Unable to begin transaction</translation> - </message> - <message> - <source>Unable to commit transaction</source> - <translation>Unable to commit transaction</translation> - </message> - <message> - <source>Unable to rollback transaction</source> - <translation>Unable to rollback transaction</translation> - </message> - </context> - <context> - <name>QSQLiteResult</name> - <message> - <source>Unable to fetch row</source> - <translation>Unable to fetch row</translation> - </message> - <message> - <source>Unable to execute statement</source> - <translation>Unable to execute statement</translation> - </message> - <message> - <source>Unable to reset statement</source> - <translation>Unable to reset statement</translation> - </message> - <message> - <source>Unable to bind parameters</source> - <translation>Unable to bind parameters</translation> - </message> - <message> - <source>Parameter count mismatch</source> - <translation>Parameter count mismatch</translation> - </message> - <message> - <source>No query</source> - <translation>No query</translation> - </message> - </context> - <context> - <name>QScriptBreakpointsModel</name> - <message> - <source>ID</source> - <translation>ID</translation> - </message> - <message> - <source>Location</source> - <translation>Location</translation> - </message> - <message> - <source>Condition</source> - <translation>Condition</translation> - </message> - <message> - <source>Ignore-count</source> - <translation>Ignore-count</translation> - </message> - <message> - <source>Single-shot</source> - <translation>Single-shot</translation> - </message> - <message> - <source>Hit-count</source> - <translation>Hit-count</translation> - </message> - </context> - <context> - <name>QScriptBreakpointsWidget</name> - <message> - <source>New</source> - <translation>New</translation> - </message> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - </context> - <context> - <name>QScriptDebugger</name> - <message> - <source>Go to Line</source> - <translation>Go to Line</translation> - </message> - <message> - <source>Line:</source> - <translation>Line:</translation> - </message> - <message> - <source>Interrupt</source> - <translation>Interrupt</translation> - </message> - <message> - <source>Shift+F5</source> - <translation>Shift+F5</translation> - </message> - <message> - <source>Continue</source> - <translation>Continue</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>Step Into</source> - <translation>Step Into</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>Step Over</source> - <translation>Step Over</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>Step Out</source> - <translation>Step Out</translation> - </message> - <message> - <source>Shift+F11</source> - <translation>Shift+F11</translation> - </message> - <message> - <source>Run to Cursor</source> - <translation>Run to Cursor</translation> - </message> - <message> - <source>Ctrl+F10</source> - <translation>Ctrl+F10</translation> - </message> - <message> - <source>Run to New Script</source> - <translation>Run to New Script</translation> - </message> - <message> - <source>Toggle Breakpoint</source> - <translation>Toggle Breakpoint</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>Clear Debug Output</source> - <translation>Clear Debug Output</translation> - </message> - <message> - <source>Clear Error Log</source> - <translation>Clear Error Log</translation> - </message> - <message> - <source>Clear Console</source> - <translation>Clear Console</translation> - </message> - <message> - <source>&Find in Script...</source> - <translation>&Find in Script...</translation> - </message> - <message> - <source>Ctrl+F</source> - <translation>Ctrl+F</translation> - </message> - <message> - <source>Find &Next</source> - <translation>Find &Next</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>Find &Previous</source> - <translation>Find &Previous</translation> - </message> - <message> - <source>Shift+F3</source> - <translation>Shift+F3</translation> - </message> - <message> - <source>Ctrl+G</source> - <translation>Ctrl+G</translation> - </message> - <message> - <source>Debug</source> - <translation>Debug</translation> - </message> - </context> - <context> - <name>QScriptDebuggerCodeFinderWidget</name> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Previous</source> - <translation>Previous</translation> - </message> - <message> - <source>Next</source> - <translation>Next</translation> - </message> - <message> - <source>Case Sensitive</source> - <translation>Case Sensitive</translation> - </message> - <message> - <source>Whole words</source> - <translation>Whole words</translation> - </message> - <message> - <source><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped</source> - <translation><img src=":/qt/scripttools/debugging/images/wrap.png">&nbsp;Search wrapped</translation> - </message> - </context> - <context> - <name>QScriptDebuggerLocalsModel</name> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Value</source> - <translation>Value</translation> - </message> - </context> - <context> - <name>QScriptDebuggerStackModel</name> - <message> - <source>Level</source> - <translation>Level</translation> - </message> - <message> - <source>Name</source> - <translation>Name</translation> - </message> - <message> - <source>Location</source> - <translation>Location</translation> - </message> - </context> - <context> - <name>QScriptEdit</name> - <message> - <source>Toggle Breakpoint</source> - <translation>Toggle Breakpoint</translation> - </message> - <message> - <source>Disable Breakpoint</source> - <translation>Disable Breakpoint</translation> - </message> - <message> - <source>Enable Breakpoint</source> - <translation>Enable Breakpoint</translation> - </message> - <message> - <source>Breakpoint Condition:</source> - <translation>Breakpoint Condition:</translation> - </message> - </context> - <context> - <name>QScriptEngineDebugger</name> - <message> - <source>Loaded Scripts</source> - <translation>Loaded Scripts</translation> - </message> - <message> - <source>Breakpoints</source> - <translation>Breakpoints</translation> - </message> - <message> - <source>Stack</source> - <translation>Stack</translation> - </message> - <message> - <source>Locals</source> - <translation>Locals</translation> - </message> - <message> - <source>Console</source> - <translation>Console</translation> - </message> - <message> - <source>Debug Output</source> - <translation>Debug Output</translation> - </message> - <message> - <source>Error Log</source> - <translation>Error Log</translation> - </message> - <message> - <source>Search</source> - <translation>Search</translation> - </message> - <message> - <source>View</source> - <translation>View</translation> - </message> - <message> - <source>Qt Script Debugger</source> - <translation>Qt Script Debugger</translation> - </message> - </context> - <context> - <name>QScriptNewBreakpointWidget</name> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - </context> - <context> - <name>QScrollBar</name> - <message> - <source>Scroll here</source> - <translation>Scroll here</translation> - </message> - <message> - <source>Left edge</source> - <translation>Left edge</translation> - </message> - <message> - <source>Top</source> - <translation>Top</translation> - </message> - <message> - <source>Right edge</source> - <translation>Right edge</translation> - </message> - <message> - <source>Bottom</source> - <translation>Bottom</translation> - </message> - <message> - <source>Page left</source> - <translation>Page left</translation> - </message> - <message> - <source>Page up</source> - <translation>Page up</translation> - </message> - <message> - <source>Page right</source> - <translation>Page right</translation> - </message> - <message> - <source>Page down</source> - <translation>Page down</translation> - </message> - <message> - <source>Scroll left</source> - <translation>Scroll left</translation> - </message> - <message> - <source>Scroll up</source> - <translation>Scroll up</translation> - </message> - <message> - <source>Scroll right</source> - <translation>Scroll right</translation> - </message> - <message> - <source>Scroll down</source> - <translation>Scroll down</translation> - </message> - <message> - <source>Line up</source> - <translation>Line up</translation> - </message> - <message> - <source>Position</source> - <translation>Position</translation> - </message> - <message> - <source>Line down</source> - <translation>Line down</translation> - </message> - </context> - <context> - <name>QSharedMemory</name> - <message> - <source>%1: create size is less then 0</source> - <translation>%1: create size is less then 0</translation> - </message> - <message> - <source>%1: unable to lock</source> - <translation>%1: unable to lock</translation> - </message> - <message> - <source>%1: unable to unlock</source> - <translation>%1: unable to unlock</translation> - </message> - <message> - <source>%1: permission denied</source> - <translation>%1: permission denied</translation> - </message> - <message> - <source>%1: already exists</source> - <translation>%1: already exists</translation> - </message> - <message> - <source>%1: doesn't exists</source> - <translation>%1: doesn't exists</translation> - </message> - <message> - <source>%1: out of resources</source> - <translation>%1: out of resources</translation> - </message> - <message> - <source>%1: unknown error %2</source> - <translation>%1: unknown error %2</translation> - </message> - <message> - <source>%1: key is empty</source> - <translation>%1: key is empty</translation> - </message> - <message> - <source>%1: ftok failed</source> - <translation>%1: ftok failed</translation> - </message> - <message> - <source>%1: unable to make key</source> - <translation>%1: unable to make key</translation> - </message> - <message> - <source>%1: doesn't exist</source> - <translation>%1: doesn't exist</translation> - </message> - <message> - <source>%1: UNIX key file doesn't exist</source> - <translation>%1: UNIX key file doesn't exist</translation> - </message> - <message> - <source>%1: system-imposed size restrictions</source> - <translation>%1: system-imposed size restrictions</translation> - </message> - <message> - <source>%1: not attached</source> - <translation>%1: not attached</translation> - </message> - <message> - <source>%1: invalid size</source> - <translation>%1: invalid size</translation> - </message> - <message> - <source>%1: key error</source> - <translation>%1: key error</translation> - </message> - <message> - <source>%1: size query failed</source> - <translation>%1: size query failed</translation> - </message> - <message> - <source>%1: unable to set key on lock</source> - <translation>%1: unable to set key on lock</translation> - </message> - </context> - <context> - <name>QShortcut</name> - <message> - <source>Space</source> - <translation>Space</translation> - </message> - <message> - <source>Esc</source> - <translation>Esc</translation> - </message> - <message> - <source>Tab</source> - <translation>Tab</translation> - </message> - <message> - <source>Backtab</source> - <translation>Backtab</translation> - </message> - <message> - <source>Backspace</source> - <translation>Backspace</translation> - </message> - <message> - <source>Return</source> - <translation>Return</translation> - </message> - <message> - <source>Enter</source> - <translation>Enter</translation> - </message> - <message> - <source>Ins</source> - <translation>Ins</translation> - </message> - <message> - <source>Del</source> - <translation>Del</translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print</source> - <translation>Print</translation> - </message> - <message> - <source>SysReq</source> - <translation>SysReq</translation> - </message> - <message> - <source>Home</source> - <translation>Home</translation> - </message> - <message> - <source>End</source> - <translation>End</translation> - </message> - <message> - <source>Left</source> - <translation>Left</translation> - </message> - <message> - <source>Up</source> - <translation>Up</translation> - </message> - <message> - <source>Right</source> - <translation>Right</translation> - </message> - <message> - <source>Down</source> - <translation>Down</translation> - </message> - <message> - <source>PgUp</source> - <translation>PgUp</translation> - </message> - <message> - <source>PgDown</source> - <translation>PgDown</translation> - </message> - <message> - <source>CapsLock</source> - <translation>CapsLock</translation> - </message> - <message> - <source>NumLock</source> - <translation>NumLock</translation> - </message> - <message> - <source>ScrollLock</source> - <translation>ScrollLock</translation> - </message> - <message> - <source>Menu</source> - <translation>Menu</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>Back</source> - <translation>Back</translation> - </message> - <message> - <source>Forward</source> - <translation>Forward</translation> - </message> - <message> - <source>Stop</source> - <translation>Stop</translation> - </message> - <message> - <source>Refresh</source> - <translation>Refresh</translation> - </message> - <message> - <source>Volume Down</source> - <translation>Volume Down</translation> - </message> - <message> - <source>Volume Mute</source> - <translation>Volume Mute</translation> - </message> - <message> - <source>Volume Up</source> - <translation>Volume Up</translation> - </message> - <message> - <source>Bass Boost</source> - <translation>Bass Boost</translation> - </message> - <message> - <source>Bass Up</source> - <translation>Bass Up</translation> - </message> - <message> - <source>Bass Down</source> - <translation>Bass Down</translation> - </message> - <message> - <source>Treble Up</source> - <translation>Treble Up</translation> - </message> - <message> - <source>Treble Down</source> - <translation>Treble Down</translation> - </message> - <message> - <source>Media Play</source> - <translation>Media Play</translation> - </message> - <message> - <source>Media Stop</source> - <translation>Media Stop</translation> - </message> - <message> - <source>Media Previous</source> - <translation>Media Previous</translation> - </message> - <message> - <source>Media Next</source> - <translation>Media Next</translation> - </message> - <message> - <source>Media Record</source> - <translation>Media Record</translation> - </message> - <message> - <source>Favorites</source> - <translation>Favorites</translation> - </message> - <message> - <source>Search</source> - <translation>Search</translation> - </message> - <message> - <source>Standby</source> - <translation>Standby</translation> - </message> - <message> - <source>Open URL</source> - <translation>Open URL</translation> - </message> - <message> - <source>Launch Mail</source> - <translation>Launch Mail</translation> - </message> - <message> - <source>Launch Media</source> - <translation>Launch Media</translation> - </message> - <message> - <source>Launch (0)</source> - <translation>Launch (0)</translation> - </message> - <message> - <source>Launch (1)</source> - <translation>Launch (1)</translation> - </message> - <message> - <source>Launch (2)</source> - <translation>Launch (2)</translation> - </message> - <message> - <source>Launch (3)</source> - <translation>Launch (3)</translation> - </message> - <message> - <source>Launch (4)</source> - <translation>Launch (4)</translation> - </message> - <message> - <source>Launch (5)</source> - <translation>Launch (5)</translation> - </message> - <message> - <source>Launch (6)</source> - <translation>Launch (6)</translation> - </message> - <message> - <source>Launch (7)</source> - <translation>Launch (7)</translation> - </message> - <message> - <source>Launch (8)</source> - <translation>Launch (8)</translation> - </message> - <message> - <source>Launch (9)</source> - <translation>Launch (9)</translation> - </message> - <message> - <source>Launch (A)</source> - <translation>Launch (A)</translation> - </message> - <message> - <source>Launch (B)</source> - <translation>Launch (B)</translation> - </message> - <message> - <source>Launch (C)</source> - <translation>Launch (C)</translation> - </message> - <message> - <source>Launch (D)</source> - <translation>Launch (D)</translation> - </message> - <message> - <source>Launch (E)</source> - <translation>Launch (E)</translation> - </message> - <message> - <source>Launch (F)</source> - <translation>Launch (F)</translation> - </message> - <message> - <source>Monitor Brightness Up</source> - <translation>Monitor Brightness Up</translation> - </message> - <message> - <source>Monitor Brightness Down</source> - <translation>Monitor Brightness Down</translation> - </message> - <message> - <source>Keyboard Light On/Off</source> - <translation>Keyboard Light On/Off</translation> - </message> - <message> - <source>Keyboard Brightness Up</source> - <translation>Keyboard Brightness Up</translation> - </message> - <message> - <source>Keyboard Brightness Down</source> - <translation>Keyboard Brightness Down</translation> - </message> - <message> - <source>Power Off</source> - <translation>Power Off</translation> - </message> - <message> - <source>Wake Up</source> - <translation>Wake Up</translation> - </message> - <message> - <source>Eject</source> - <translation>Eject</translation> - </message> - <message> - <source>Screensaver</source> - <translation>Screensaver</translation> - </message> - <message> - <source>WWW</source> - <translation>WWW</translation> - </message> - <message> - <source>Sleep</source> - <translation>Sleep</translation> - </message> - <message> - <source>LightBulb</source> - <translation>LightBulb</translation> - </message> - <message> - <source>Shop</source> - <translation>Shop</translation> - </message> - <message> - <source>History</source> - <translation>History</translation> - </message> - <message> - <source>Add Favorite</source> - <translation>Add Favorite</translation> - </message> - <message> - <source>Hot Links</source> - <translation>Hot Links</translation> - </message> - <message> - <source>Adjust Brightness</source> - <translation>Adjust Brightness</translation> - </message> - <message> - <source>Finance</source> - <translation>Finance</translation> - </message> - <message> - <source>Community</source> - <translation>Community</translation> - </message> - <message> - <source>Audio Rewind</source> - <translation>Audio Rewind</translation> - </message> - <message> - <source>Back Forward</source> - <translation>Back Forward</translation> - </message> - <message> - <source>Application Left</source> - <translation>Application Left</translation> - </message> - <message> - <source>Application Right</source> - <translation>Application Right</translation> - </message> - <message> - <source>Book</source> - <translation>Book</translation> - </message> - <message> - <source>CD</source> - <translation>CD</translation> - </message> - <message> - <source>Calculator</source> - <translation>Calculator</translation> - </message> - <message> - <source>Clear</source> - <translation>Clear</translation> - </message> - <message> - <source>Clear Grab</source> - <translation>Clear Grab</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Copy</source> - <translation>Copy</translation> - </message> - <message> - <source>Cut</source> - <translation>Cut</translation> - </message> - <message> - <source>Display</source> - <translation>Display</translation> - </message> - <message> - <source>DOS</source> - <translation>DOS</translation> - </message> - <message> - <source>Documents</source> - <translation>Documents</translation> - </message> - <message> - <source>Spreadsheet</source> - <translation>Spreadsheet</translation> - </message> - <message> - <source>Browser</source> - <translation>Browser</translation> - </message> - <message> - <source>Game</source> - <translation>Game</translation> - </message> - <message> - <source>Go</source> - <translation>Go</translation> - </message> - <message> - <source>iTouch</source> - <translation>iTouch</translation> - </message> - <message> - <source>Logoff</source> - <translation>Logoff</translation> - </message> - <message> - <source>Market</source> - <translation>Market</translation> - </message> - <message> - <source>Meeting</source> - <translation>Meeting</translation> - </message> - <message> - <source>Keyboard Menu</source> - <translation>Keyboard Menu</translation> - </message> - <message> - <source>Menu PB</source> - <translation>Menu PB</translation> - </message> - <message> - <source>My Sites</source> - <translation>My Sites</translation> - </message> - <message> - <source>News</source> - <translation>News</translation> - </message> - <message> - <source>Home Office</source> - <translation>Home Office</translation> - </message> - <message> - <source>Option</source> - <translation>Option</translation> - </message> - <message> - <source>Paste</source> - <translation>Paste</translation> - </message> - <message> - <source>Phone</source> - <translation>Phone</translation> - </message> - <message> - <source>Reply</source> - <translation>Reply</translation> - </message> - <message> - <source>Reload</source> - <translation>Reload</translation> - </message> - <message> - <source>Rotate Windows</source> - <translation>Rotate Windows</translation> - </message> - <message> - <source>Rotation PB</source> - <translation>Rotation PB</translation> - </message> - <message> - <source>Rotation KB</source> - <translation>Rotation KB</translation> - </message> - <message> - <source>Save</source> - <translation>Save</translation> - </message> - <message> - <source>Send</source> - <translation>Send</translation> - </message> - <message> - <source>Spellchecker</source> - <translation>Spellchecker</translation> - </message> - <message> - <source>Split Screen</source> - <translation>Split Screen</translation> - </message> - <message> - <source>Support</source> - <translation>Support</translation> - </message> - <message> - <source>Task Panel</source> - <translation>Task Panel</translation> - </message> - <message> - <source>Terminal</source> - <translation>Terminal</translation> - </message> - <message> - <source>Tools</source> - <translation>Tools</translation> - </message> - <message> - <source>Travel</source> - <translation>Travel</translation> - </message> - <message> - <source>Video</source> - <translation>Video</translation> - </message> - <message> - <source>Word Processor</source> - <translation>Word Processor</translation> - </message> - <message> - <source>XFer</source> - <translation>XFer</translation> - </message> - <message> - <source>Zoom In</source> - <translation>Zoom In</translation> - </message> - <message> - <source>Zoom Out</source> - <translation>Zoom Out</translation> - </message> - <message> - <source>Away</source> - <translation>Away</translation> - </message> - <message> - <source>Messenger</source> - <translation>Messenger</translation> - </message> - <message> - <source>WebCam</source> - <translation>WebCam</translation> - </message> - <message> - <source>Mail Forward</source> - <translation>Mail Forward</translation> - </message> - <message> - <source>Pictures</source> - <translation>Pictures</translation> - </message> - <message> - <source>Music</source> - <translation>Music</translation> - </message> - <message> - <source>Battery</source> - <translation>Battery</translation> - </message> - <message> - <source>Bluetooth</source> - <translation>Bluetooth</translation> - </message> - <message> - <source>Wireless</source> - <translation>Wireless</translation> - </message> - <message> - <source>Ultra Wide Band</source> - <translation>Ultra Wide Band</translation> - </message> - <message> - <source>Audio Forward</source> - <translation>Audio Forward</translation> - </message> - <message> - <source>Audio Repeat</source> - <translation>Audio Repeat</translation> - </message> - <message> - <source>Audio Random Play</source> - <translation>Audio Random Play</translation> - </message> - <message> - <source>Subtitle</source> - <translation>Subtitle</translation> - </message> - <message> - <source>Audio Cycle Track</source> - <translation>Audio Cycle Track</translation> - </message> - <message> - <source>Time</source> - <translation>Time</translation> - </message> - <message> - <source>View</source> - <translation>View</translation> - </message> - <message> - <source>Top Menu</source> - <translation>Top Menu</translation> - </message> - <message> - <source>Suspend</source> - <translation>Suspend</translation> - </message> - <message> - <source>Hibernate</source> - <translation>Hibernate</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>Page Up</source> - <translation>Page Up</translation> - </message> - <message> - <source>Page Down</source> - <translation>Page Down</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Number Lock</source> - <translation>Number Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source>Insert</source> - <translation>Insert</translation> - </message> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - <message> - <source>Escape</source> - <translation>Escape</translation> - </message> - <message> - <source>System Request</source> - <translation>System Request</translation> - </message> - <message> - <source>Select</source> - <translation>Select</translation> - </message> - <message> - <source>Yes</source> - <translation>Yes</translation> - </message> - <message> - <source>No</source> - <translation>No</translation> - </message> - <message> - <source>Context1</source> - <translation>Context1</translation> - </message> - <message> - <source>Context2</source> - <translation>Context2</translation> - </message> - <message> - <source>Context3</source> - <translation>Context3</translation> - </message> - <message> - <source>Context4</source> - <translation>Context4</translation> - </message> - <message> - <source>Call</source> - <translation>Call</translation> - </message> - <message> - <source>Hangup</source> - <translation>Hangup</translation> - </message> - <message> - <source>Flip</source> - <translation>Flip</translation> - </message> - <message> - <source>Ctrl</source> - <translation>Ctrl</translation> - </message> - <message> - <source>Shift</source> - <translation>Shift</translation> - </message> - <message> - <source>Alt</source> - <translation>Alt</translation> - </message> - <message> - <source>Meta</source> - <translation>Meta</translation> - </message> - <message> - <source>+</source> - <translation>+</translation> - </message> - <message> - <source>F%1</source> - <translation>F%1</translation> - </message> - <message> - <source>Home Page</source> - <translation>Home Page</translation> - </message> - </context> - <context> - <name>QSlider</name> - <message> - <source>Page left</source> - <translation>Page left</translation> - </message> - <message> - <source>Page up</source> - <translation>Page up</translation> - </message> - <message> - <source>Position</source> - <translation>Position</translation> - </message> - <message> - <source>Page right</source> - <translation>Page right</translation> - </message> - <message> - <source>Page down</source> - <translation>Page down</translation> - </message> - </context> - <context> - <name>QSocks5SocketEngine</name> - <message> - <source>Connection to proxy refused</source> - <translation>Connection to proxy refused</translation> - </message> - <message> - <source>Connection to proxy closed prematurely</source> - <translation>Connection to proxy closed prematurely</translation> - </message> - <message> - <source>Proxy host not found</source> - <translation>Proxy host not found</translation> - </message> - <message> - <source>Connection to proxy timed out</source> - <translation>Connection to proxy timed out</translation> - </message> - <message> - <source>Proxy authentication failed</source> - <translation>Proxy authentication failed</translation> - </message> - <message> - <source>Proxy authentication failed: %1</source> - <translation>Proxy authentication failed: %1</translation> - </message> - <message> - <source>SOCKS version 5 protocol error</source> - <translation>SOCKS version 5 protocol error</translation> - </message> - <message> - <source>General SOCKSv5 server failure</source> - <translation>General SOCKSv5 server failure</translation> - </message> - <message> - <source>Connection not allowed by SOCKSv5 server</source> - <translation>Connection not allowed by SOCKSv5 server</translation> - </message> - <message> - <source>TTL expired</source> - <translation>TTL expired</translation> - </message> - <message> - <source>SOCKSv5 command not supported</source> - <translation>SOCKSv5 command not supported</translation> - </message> - <message> - <source>Address type not supported</source> - <translation>Address type not supported</translation> - </message> - <message> - <source>Unknown SOCKSv5 proxy error code 0x%1</source> - <translation>Unknown SOCKSv5 proxy error code 0x%1</translation> - </message> - <message> - <source>Network operation timed out</source> - <translation>Network operation timed out</translation> - </message> - </context> - <context> - <name>QSoftKeyManager</name> - <message> - <source>Ok</source> - <translation>Ok</translation> - </message> - <message> - <source>Select</source> - <translation>Select</translation> - </message> - <message> - <source>Done</source> - <translation>Done</translation> - </message> - <message> - <source>Options</source> - <translation>Options</translation> - </message> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - <message> - <source>Exit</source> - <translation>Exit</translation> - </message> - </context> - <context> - <name>QSpinBox</name> - <message> - <source>More</source> - <translation>More</translation> - </message> - <message> - <source>Less</source> - <translation>Less</translation> - </message> - </context> - <context> - <name>QSql</name> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - <message> - <source>Delete this record?</source> - <translation>Delete this record?</translation> - </message> - <message> - <source>Yes</source> - <translation>Yes</translation> - </message> - <message> - <source>No</source> - <translation>No</translation> - </message> - <message> - <source>Insert</source> - <translation>Insert</translation> - </message> - <message> - <source>Update</source> - <translation>Update</translation> - </message> - <message> - <source>Save edits?</source> - <translation>Save edits?</translation> - </message> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - <message> - <source>Confirm</source> - <translation>Confirm</translation> - </message> - <message> - <source>Cancel your edits?</source> - <translation>Cancel your edits?</translation> - </message> - </context> - <context> - <name>QSslSocket</name> - <message> - <source>Unable to write data: %1</source> - <translation>Unable to write data: %1</translation> - </message> - <message> - <source>Unable to decrypt data: %1</source> - <translation>Unable to decrypt data: %1</translation> - </message> - <message> - <source>Error while reading: %1</source> - <translation>Error while reading: %1</translation> - </message> - <message> - <source>Error during SSL handshake: %1</source> - <translation>Error during SSL handshake: %1</translation> - </message> - <message> - <source>Error creating SSL context (%1)</source> - <translation>Error creating SSL context (%1)</translation> - </message> - <message> - <source>Invalid or empty cipher list (%1)</source> - <translation>Invalid or empty cipher list (%1)</translation> - </message> - <message> - <source>Private key does not certify public key, %1</source> - <translation>Private key does not certify public key, %1</translation> - </message> - <message> - <source>Error creating SSL session, %1</source> - <translation>Error creating SSL session, %1</translation> - </message> - <message> - <source>Error creating SSL session: %1</source> - <translation>Error creating SSL session: %1</translation> - </message> - <message> - <source>Cannot provide a certificate with no key, %1</source> - <translation>Cannot provide a certificate with no key, %1</translation> - </message> - <message> - <source>Error loading local certificate, %1</source> - <translation>Error loading local certificate, %1</translation> - </message> - <message> - <source>Error loading private key, %1</source> - <translation>Error loading private key, %1</translation> - </message> - <message> - <source>No error</source> - <translation>No error</translation> - </message> - <message> - <source>The issuer certificate could not be found</source> - <translation>The issuer certificate could not be found</translation> - </message> - <message> - <source>The certificate signature could not be decrypted</source> - <translation>The certificate signature could not be decrypted</translation> - </message> - <message> - <source>The public key in the certificate could not be read</source> - <translation>The public key in the certificate could not be read</translation> - </message> - <message> - <source>The signature of the certificate is invalid</source> - <translation>The signature of the certificate is invalid</translation> - </message> - <message> - <source>The certificate is not yet valid</source> - <translation>The certificate is not yet valid</translation> - </message> - <message> - <source>The certificate has expired</source> - <translation>The certificate has expired</translation> - </message> - <message> - <source>The certificate's notBefore field contains an invalid time</source> - <translation>The certificate's notBefore field contains an invalid time</translation> - </message> - <message> - <source>The certificate's notAfter field contains an invalid time</source> - <translation>The certificate's notAfter field contains an invalid time</translation> - </message> - <message> - <source>The certificate is self-signed, and untrusted</source> - <translation>The certificate is self-signed, and untrusted</translation> - </message> - <message> - <source>The root certificate of the certificate chain is self-signed, and untrusted</source> - <translation>The root certificate of the certificate chain is self-signed, and untrusted</translation> - </message> - <message> - <source>The issuer certificate of a locally looked up certificate could not be found</source> - <translation>The issuer certificate of a locally looked up certificate could not be found</translation> - </message> - <message> - <source>No certificates could be verified</source> - <translation>No certificates could be verified</translation> - </message> - <message> - <source>One of the CA certificates is invalid</source> - <translation>One of the CA certificates is invalid</translation> - </message> - <message> - <source>The basicConstraints path length parameter has been exceeded</source> - <translation>The basicConstraints path length parameter has been exceeded</translation> - </message> - <message> - <source>The supplied certificate is unsuitable for this purpose</source> - <translation>The supplied certificate is unsuitable for this purpose</translation> - </message> - <message> - <source>The root CA certificate is not trusted for this purpose</source> - <translation>The root CA certificate is not trusted for this purpose</translation> - </message> - <message> - <source>The root CA certificate is marked to reject the specified purpose</source> - <translation>The root CA certificate is marked to reject the specified purpose</translation> - </message> - <message> - <source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source> - <translation>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</translation> - </message> - <message> - <source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source> - <translation>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</translation> - </message> - <message> - <source>The peer did not present any certificate</source> - <translation>The peer did not present any certificate</translation> - </message> - <message> - <source>The host name did not match any of the valid hosts for this certificate</source> - <translation>The host name did not match any of the valid hosts for this certificate</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - </context> - <context> - <name>QStateMachine</name> - <message> - <source>Missing initial state in compound state '%1'</source> - <translation>Missing initial state in compound state '%1'</translation> - </message> - <message> - <source>Missing default state in history state '%1'</source> - <translation>Missing default state in history state '%1'</translation> - </message> - <message> - <source>No common ancestor for targets and source of transition from state '%1'</source> - <translation>No common ancestor for targets and source of transition from state '%1'</translation> - </message> - <message> - <source>Unknown error</source> - <translation>Unknown error</translation> - </message> - </context> - <context> - <name>QSystemSemaphore</name> - <message> - <source>%1: does not exist</source> - <translation>%1: does not exist</translation> - </message> - <message> - <source>%1: out of resources</source> - <translation>%1: out of resources</translation> - </message> - <message> - <source>%1: permission denied</source> - <translation>%1: permission denied</translation> - </message> - <message> - <source>%1: already exists</source> - <translation>%1: already exists</translation> - </message> - <message> - <source>%1: unknown error %2</source> - <translation>%1: unknown error %2</translation> - </message> - </context> - <context> - <name>QTDSDriver</name> - <message> - <source>Unable to open connection</source> - <translation>Unable to open connection</translation> - </message> - <message> - <source>Unable to use database</source> - <translation>Unable to use database</translation> - </message> - </context> - <context> - <name>QTabBar</name> - <message> - <source>Scroll Left</source> - <translation>Scroll Left</translation> - </message> - <message> - <source>Scroll Right</source> - <translation>Scroll Right</translation> - </message> - </context> - <context> - <name>QTcpServer</name> - <message> - <source>Operation on socket is not supported</source> - <translation>Operation on socket is not supported</translation> - </message> - </context> - <context> - <name>QTextControl</name> - <message> - <source>&Undo</source> - <translation>&Undo</translation> - </message> - <message> - <source>&Redo</source> - <translation>&Redo</translation> - </message> - <message> - <source>Cu&t</source> - <translation>Cu&t</translation> - </message> - <message> - <source>&Copy</source> - <translation>&Copy</translation> - </message> - <message> - <source>Copy &Link Location</source> - <translation>Copy &Link Location</translation> - </message> - <message> - <source>&Paste</source> - <translation>&Paste</translation> - </message> - <message> - <source>Delete</source> - <translation>Delete</translation> - </message> - <message> - <source>Select All</source> - <translation>Select All</translation> - </message> - </context> - <context> - <name>QToolButton</name> - <message> - <source>Press</source> - <translation>Press</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> - </context> - <context> - <name>QUdpSocket</name> - <message> - <source>This platform does not support IPv6</source> - <translation>This platform does not support IPv6</translation> - </message> - </context> - <context> - <name>QUndoGroup</name> - <message> - <source>Undo</source> - <translation>Undo</translation> - </message> - <message> - <source>Redo</source> - <translation>Redo</translation> - </message> - </context> - <context> - <name>QUndoModel</name> - <message> - <source><empty></source> - <translation><empty></translation> - </message> - </context> - <context> - <name>QUndoStack</name> - <message> - <source>Undo</source> - <translation>Undo</translation> - </message> - <message> - <source>Redo</source> - <translation>Redo</translation> - </message> - </context> - <context> - <name>QUnicodeControlCharacterMenu</name> - <message> - <source>LRM Left-to-right mark</source> - <translation>LRM Left-to-right mark</translation> - </message> - <message> - <source>RLM Right-to-left mark</source> - <translation>RLM Right-to-left mark</translation> - </message> - <message> - <source>ZWJ Zero width joiner</source> - <translation>ZWJ Zero width joiner</translation> - </message> - <message> - <source>ZWNJ Zero width non-joiner</source> - <translation>ZWNJ Zero width non-joiner</translation> - </message> - <message> - <source>ZWSP Zero width space</source> - <translation>ZWSP Zero width space</translation> - </message> - <message> - <source>LRE Start of left-to-right embedding</source> - <translation>LRE Start of left-to-right embedding</translation> - </message> - <message> - <source>RLE Start of right-to-left embedding</source> - <translation>RLE Start of right-to-left embedding</translation> - </message> - <message> - <source>LRO Start of left-to-right override</source> - <translation>LRO Start of left-to-right override</translation> - </message> - <message> - <source>RLO Start of right-to-left override</source> - <translation>RLO Start of right-to-left override</translation> - </message> - <message> - <source>PDF Pop directional formatting</source> - <translation>PDF Pop directional formatting</translation> - </message> - <message> - <source>Insert Unicode control character</source> - <translation>Insert Unicode control character</translation> - </message> - </context> - <context> - <name>QWebFrame</name> - <message> - <source>Request cancelled</source> - <translation>Request cancelled</translation> - </message> - <message> - <source>Request blocked</source> - <translation>Request blocked</translation> - </message> - <message> - <source>Cannot show URL</source> - <translation>Cannot show URL</translation> - </message> - <message> - <source>Frame load interrupted by policy change</source> - <translation>Frame load interrupted by policy change</translation> - </message> - <message> - <source>Cannot show mimetype</source> - <translation>Cannot show mimetype</translation> - </message> - <message> - <source>File does not exist</source> - <translation>File does not exist</translation> - </message> - </context> - <context> - <name>QWebPage</name> - <message> - <source>Submit</source> - <comment>default label for Submit buttons in forms on web pages</comment> - <translation>Submit</translation> - </message> - <message> - <source>Submit</source> - <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment> - <translation>Submit</translation> - </message> - <message> - <source>Reset</source> - <comment>default label for Reset buttons in forms on web pages</comment> - <translation>Reset</translation> - </message> - <message> - <source>Choose File</source> - <comment>title for file button used in HTML forms</comment> - <translation>Choose File</translation> - </message> - <message> - <source>No file selected</source> - <comment>text to display in file button used in HTML forms when no file is selected</comment> - <translation>No file selected</translation> - </message> - <message> - <source>Open in New Window</source> - <comment>Open in New Window context menu item</comment> - <translation>Open in New Window</translation> - </message> - <message> - <source>Save Link...</source> - <comment>Download Linked File context menu item</comment> - <translation>Save Link...</translation> - </message> - <message> - <source>Copy Link</source> - <comment>Copy Link context menu item</comment> - <translation>Copy Link</translation> - </message> - <message> - <source>Open Image</source> - <comment>Open Image in New Window context menu item</comment> - <translation>Open Image</translation> - </message> - <message> - <source>Save Image</source> - <comment>Download Image context menu item</comment> - <translation>Save Image</translation> - </message> - <message> - <source>Copy Image</source> - <comment>Copy Link context menu item</comment> - <translation>Copy Image</translation> - </message> - <message> - <source>Open Frame</source> - <comment>Open Frame in New Window context menu item</comment> - <translation>Open Frame</translation> - </message> - <message> - <source>Copy</source> - <comment>Copy context menu item</comment> - <translation>Copy</translation> - </message> - <message> - <source>Go Back</source> - <comment>Back context menu item</comment> - <translation>Go Back</translation> - </message> - <message> - <source>Go Forward</source> - <comment>Forward context menu item</comment> - <translation>Go Forward</translation> - </message> - <message> - <source>Stop</source> - <comment>Stop context menu item</comment> - <translation>Stop</translation> - </message> - <message> - <source>Reload</source> - <comment>Reload context menu item</comment> - <translation>Reload</translation> - </message> - <message> - <source>Cut</source> - <comment>Cut context menu item</comment> - <translation>Cut</translation> - </message> - <message> - <source>Paste</source> - <comment>Paste context menu item</comment> - <translation>Paste</translation> - </message> - <message> - <source>No Guesses Found</source> - <comment>No Guesses Found context menu item</comment> - <translation>No Guesses Found</translation> - </message> - <message> - <source>Ignore</source> - <comment>Ignore Spelling context menu item</comment> - <translation>Ignore</translation> - </message> - <message> - <source>Add To Dictionary</source> - <comment>Learn Spelling context menu item</comment> - <translation>Add To Dictionary</translation> - </message> - <message> - <source>Search The Web</source> - <comment>Search The Web context menu item</comment> - <translation>Search The Web</translation> - </message> - <message> - <source>Look Up In Dictionary</source> - <comment>Look Up in Dictionary context menu item</comment> - <translation>Look Up In Dictionary</translation> - </message> - <message> - <source>Open Link</source> - <comment>Open Link context menu item</comment> - <translation>Open Link</translation> - </message> - <message> - <source>Ignore</source> - <comment>Ignore Grammar context menu item</comment> - <translation>Ignore</translation> - </message> - <message> - <source>Spelling</source> - <comment>Spelling and Grammar context sub-menu item</comment> - <translation>Spelling</translation> - </message> - <message> - <source>Show Spelling and Grammar</source> - <comment>menu item title</comment> - <translation>Show Spelling and Grammar</translation> - </message> - <message> - <source>Hide Spelling and Grammar</source> - <comment>menu item title</comment> - <translation>Hide Spelling and Grammar</translation> - </message> - <message> - <source>Check Spelling</source> - <comment>Check spelling context menu item</comment> - <translation>Check Spelling</translation> - </message> - <message> - <source>Check Spelling While Typing</source> - <comment>Check spelling while typing context menu item</comment> - <translation>Check Spelling While Typing</translation> - </message> - <message> - <source>Check Grammar With Spelling</source> - <comment>Check grammar with spelling context menu item</comment> - <translation>Check Grammar With Spelling</translation> - </message> - <message> - <source>Fonts</source> - <comment>Font context sub-menu item</comment> - <translation>Fonts</translation> - </message> - <message> - <source>Bold</source> - <comment>Bold context menu item</comment> - <translation>Bold</translation> - </message> - <message> - <source>Italic</source> - <comment>Italic context menu item</comment> - <translation>Italic</translation> - </message> - <message> - <source>Underline</source> - <comment>Underline context menu item</comment> - <translation>Underline</translation> - </message> - <message> - <source>Outline</source> - <comment>Outline context menu item</comment> - <translation>Outline</translation> - </message> - <message> - <source>Direction</source> - <comment>Writing direction context sub-menu item</comment> - <translation>Direction</translation> - </message> - <message> - <source>Text Direction</source> - <comment>Text direction context sub-menu item</comment> - <translation>Text Direction</translation> - </message> - <message> - <source>Default</source> - <comment>Default writing direction context menu item</comment> - <translation>Default</translation> - </message> - <message> - <source>Left to Right</source> - <comment>Left to Right context menu item</comment> - <translation>Left to Right</translation> - </message> - <message> - <source>Right to Left</source> - <comment>Right to Left context menu item</comment> - <translation>Right to Left</translation> - </message> - <message> - <source>Loading...</source> - <comment>Media controller status message when the media is loading</comment> - <translation>Loading...</translation> - </message> - <message> - <source>Live Broadcast</source> - <comment>Media controller status message when watching a live broadcast</comment> - <translation>Live Broadcast</translation> - </message> - <message> - <source>Audio Element</source> - <comment>Media controller element</comment> - <translation>Audio Element</translation> - </message> - <message> - <source>Video Element</source> - <comment>Media controller element</comment> - <translation>Video Element</translation> - </message> - <message> - <source>Mute Button</source> - <comment>Media controller element</comment> - <translation>Mute Button</translation> - </message> - <message> - <source>Unmute Button</source> - <comment>Media controller element</comment> - <translation>Unmute Button</translation> - </message> - <message> - <source>Play Button</source> - <comment>Media controller element</comment> - <translation>Play Button</translation> - </message> - <message> - <source>Pause Button</source> - <comment>Media controller element</comment> - <translation>Pause Button</translation> - </message> - <message> - <source>Slider</source> - <comment>Media controller element</comment> - <translation>Slider</translation> - </message> - <message> - <source>Slider Thumb</source> - <comment>Media controller element</comment> - <translation>Slider Thumb</translation> - </message> - <message> - <source>Rewind Button</source> - <comment>Media controller element</comment> - <translation>Rewind Button</translation> - </message> - <message> - <source>Return to Real-time Button</source> - <comment>Media controller element</comment> - <translation>Return to Real-time Button</translation> - </message> - <message> - <source>Elapsed Time</source> - <comment>Media controller element</comment> - <translation>Elapsed Time</translation> - </message> - <message> - <source>Remaining Time</source> - <comment>Media controller element</comment> - <translation>Remaining Time</translation> - </message> - <message> - <source>Status Display</source> - <comment>Media controller element</comment> - <translation>Status Display</translation> - </message> - <message> - <source>Fullscreen Button</source> - <comment>Media controller element</comment> - <translation>Fullscreen Button</translation> - </message> - <message> - <source>Seek Forward Button</source> - <comment>Media controller element</comment> - <translation>Seek Forward Button</translation> - </message> - <message> - <source>Seek Back Button</source> - <comment>Media controller element</comment> - <translation>Seek Back Button</translation> - </message> - <message> - <source>Audio element playback controls and status display</source> - <comment>Media controller element</comment> - <translation>Audio element playback controls and status display</translation> - </message> - <message> - <source>Video element playback controls and status display</source> - <comment>Media controller element</comment> - <translation>Video element playback controls and status display</translation> - </message> - <message> - <source>Mute audio tracks</source> - <comment>Media controller element</comment> - <translation>Mute audio tracks</translation> - </message> - <message> - <source>Unmute audio tracks</source> - <comment>Media controller element</comment> - <translation>Unmute audio tracks</translation> - </message> - <message> - <source>Begin playback</source> - <comment>Media controller element</comment> - <translation>Begin playback</translation> - </message> - <message> - <source>Pause playback</source> - <comment>Media controller element</comment> - <translation>Pause playback</translation> - </message> - <message> - <source>Movie time scrubber</source> - <comment>Media controller element</comment> - <translation>Movie time scrubber</translation> - </message> - <message> - <source>Movie time scrubber thumb</source> - <comment>Media controller element</comment> - <translation>Movie time scrubber thumb</translation> - </message> - <message> - <source>Rewind movie</source> - <comment>Media controller element</comment> - <translation>Rewind movie</translation> - </message> - <message> - <source>Return streaming movie to real-time</source> - <comment>Media controller element</comment> - <translation>Return streaming movie to real-time</translation> - </message> - <message> - <source>Current movie time</source> - <comment>Media controller element</comment> - <translation>Current movie time</translation> - </message> - <message> - <source>Remaining movie time</source> - <comment>Media controller element</comment> - <translation>Remaining movie time</translation> - </message> - <message> - <source>Current movie status</source> - <comment>Media controller element</comment> - <translation>Current movie status</translation> - </message> - <message> - <source>Play movie in full-screen mode</source> - <comment>Media controller element</comment> - <translation>Play movie in full-screen mode</translation> - </message> - <message> - <source>Seek quickly back</source> - <comment>Media controller element</comment> - <translation>Seek quickly back</translation> - </message> - <message> - <source>Seek quickly forward</source> - <comment>Media controller element</comment> - <translation>Seek quickly forward</translation> - </message> - <message> - <source>Indefinite time</source> - <comment>Media time description</comment> - <translation>Indefinite time</translation> - </message> - <message> - <source>%1 days %2 hours %3 minutes %4 seconds</source> - <comment>Media time description</comment> - <translation>%1 days %2 hours %3 minutes %4 seconds</translation> - </message> - <message> - <source>%1 hours %2 minutes %3 seconds</source> - <comment>Media time description</comment> - <translation>%1 hours %2 minutes %3 seconds</translation> - </message> - <message> - <source>%1 minutes %2 seconds</source> - <comment>Media time description</comment> - <translation>%1 minutes %2 seconds</translation> - </message> - <message> - <source>%1 seconds</source> - <comment>Media time description</comment> - <translation>%1 seconds</translation> - </message> - <message> - <source>Inspect</source> - <comment>Inspect Element context menu item</comment> - <translation>Inspect</translation> - </message> - <message> - <source>No recent searches</source> - <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> - <translation>No recent searches</translation> - </message> - <message> - <source>Recent searches</source> - <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> - <translation>Recent searches</translation> - </message> - <message> - <source>Clear recent searches</source> - <comment>menu item in Recent Searches menu that empties menu's contents</comment> - <translation>Clear recent searches</translation> - </message> - <message> - <source>Unknown</source> - <comment>Unknown filesize FTP directory listing item</comment> - <translation>Unknown</translation> - </message> - <message> - <source>Web Inspector - %2</source> - <translation>Web Inspector - %2</translation> - </message> - <message> - <source>%1 (%2x%3 pixels)</source> - <comment>Title string for images</comment> - <translation>%1 (%2x%3 pixels)</translation> - </message> - <message> - <source>Bad HTTP request</source> - <translation>Bad HTTP request</translation> - </message> - <message> - <source>This is a searchable index. Enter search keywords: </source> - <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> - <translation>This is a searchable index. Enter search keywords: </translation> - </message> - <message> - <source>Scroll here</source> - <translation>Scroll here</translation> - </message> - <message> - <source>Left edge</source> - <translation>Left edge</translation> - </message> - <message> - <source>Top</source> - <translation>Top</translation> - </message> - <message> - <source>Right edge</source> - <translation>Right edge</translation> - </message> - <message> - <source>Bottom</source> - <translation>Bottom</translation> - </message> - <message> - <source>Page left</source> - <translation>Page left</translation> - </message> - <message> - <source>Page up</source> - <translation>Page up</translation> - </message> - <message> - <source>Page right</source> - <translation>Page right</translation> - </message> - <message> - <source>Page down</source> - <translation>Page down</translation> - </message> - <message> - <source>Scroll left</source> - <translation>Scroll left</translation> - </message> - <message> - <source>Scroll up</source> - <translation>Scroll up</translation> - </message> - <message> - <source>Scroll right</source> - <translation>Scroll right</translation> - </message> - <message> - <source>Scroll down</source> - <translation>Scroll down</translation> - </message> - <message numerus="yes"> - <source>%n file(s)</source> - <comment>number of chosen file</comment> - <translation> - <numerusform>%n file(s)</numerusform> - <numerusform>%n file(s)</numerusform> - </translation> - </message> - <message> - <source>JavaScript Alert - %1</source> - <translation>JavaScript Alert - %1</translation> - </message> - <message> - <source>JavaScript Confirm - %1</source> - <translation>JavaScript Confirm - %1</translation> - </message> - <message> - <source>JavaScript Prompt - %1</source> - <translation>JavaScript Prompt - %1</translation> - </message> - <message> - <source>JavaScript Problem - %1</source> - <translation>JavaScript Problem - %1</translation> - </message> - <message> - <source>The script on this page appears to have a problem. Do you want to stop the script?</source> - <translation>The script on this page appears to have a problem. Do you want to stop the script?</translation> - </message> - <message> - <source>Move the cursor to the next character</source> - <translation>Move the cursor to the next character</translation> - </message> - <message> - <source>Move the cursor to the previous character</source> - <translation>Move the cursor to the previous character</translation> - </message> - <message> - <source>Move the cursor to the next word</source> - <translation>Move the cursor to the next word</translation> - </message> - <message> - <source>Move the cursor to the previous word</source> - <translation>Move the cursor to the previous word</translation> - </message> - <message> - <source>Move the cursor to the next line</source> - <translation>Move the cursor to the next line</translation> - </message> - <message> - <source>Move the cursor to the previous line</source> - <translation>Move the cursor to the previous line</translation> - </message> - <message> - <source>Move the cursor to the start of the line</source> - <translation>Move the cursor to the start of the line</translation> - </message> - <message> - <source>Move the cursor to the end of the line</source> - <translation>Move the cursor to the end of the line</translation> - </message> - <message> - <source>Move the cursor to the start of the block</source> - <translation>Move the cursor to the start of the block</translation> - </message> - <message> - <source>Move the cursor to the end of the block</source> - <translation>Move the cursor to the end of the block</translation> - </message> - <message> - <source>Move the cursor to the start of the document</source> - <translation>Move the cursor to the start of the document</translation> - </message> - <message> - <source>Move the cursor to the end of the document</source> - <translation>Move the cursor to the end of the document</translation> - </message> - <message> - <source>Select all</source> - <translation>Select all</translation> - </message> - <message> - <source>Select to the next character</source> - <translation>Select to the next character</translation> - </message> - <message> - <source>Select to the previous character</source> - <translation>Select to the previous character</translation> - </message> - <message> - <source>Select to the next word</source> - <translation>Select to the next word</translation> - </message> - <message> - <source>Select to the previous word</source> - <translation>Select to the previous word</translation> - </message> - <message> - <source>Select to the next line</source> - <translation>Select to the next line</translation> - </message> - <message> - <source>Select to the previous line</source> - <translation>Select to the previous line</translation> - </message> - <message> - <source>Select to the start of the line</source> - <translation>Select to the start of the line</translation> - </message> - <message> - <source>Select to the end of the line</source> - <translation>Select to the end of the line</translation> - </message> - <message> - <source>Select to the start of the block</source> - <translation>Select to the start of the block</translation> - </message> - <message> - <source>Select to the end of the block</source> - <translation>Select to the end of the block</translation> - </message> - <message> - <source>Select to the start of the document</source> - <translation>Select to the start of the document</translation> - </message> - <message> - <source>Select to the end of the document</source> - <translation>Select to the end of the document</translation> - </message> - <message> - <source>Delete to the start of the word</source> - <translation>Delete to the start of the word</translation> - </message> - <message> - <source>Delete to the end of the word</source> - <translation>Delete to the end of the word</translation> - </message> - <message> - <source>Insert a new paragraph</source> - <translation>Insert a new paragraph</translation> - </message> - <message> - <source>Insert a new line</source> - <translation>Insert a new line</translation> - </message> - <message> - <source>Paste and Match Style</source> - <translation>Paste and Match Style</translation> - </message> - <message> - <source>Remove formatting</source> - <translation>Remove formatting</translation> - </message> - <message> - <source>Strikethrough</source> - <translation>Strikethrough</translation> - </message> - <message> - <source>Subscript</source> - <translation>Subscript</translation> - </message> - <message> - <source>Superscript</source> - <translation>Superscript</translation> - </message> - <message> - <source>Insert Bulleted List</source> - <translation>Insert Bulleted List</translation> - </message> - <message> - <source>Insert Numbered List</source> - <translation>Insert Numbered List</translation> - </message> - <message> - <source>Indent</source> - <translation>Indent</translation> - </message> - <message> - <source>Outdent</source> - <translation>Outdent</translation> - </message> - <message> - <source>Center</source> - <translation>Center</translation> - </message> - <message> - <source>Justify</source> - <translation>Justify</translation> - </message> - <message> - <source>Align Left</source> - <translation>Align Left</translation> - </message> - <message> - <source>Align Right</source> - <translation>Align Right</translation> - </message> - </context> - <context> - <name>QWhatsThisAction</name> - <message> - <source>What's This?</source> - <translation>What's This?</translation> - </message> - </context> - <context> - <name>QWidget</name> - <message> - <source>*</source> - <translation>*</translation> - </message> - </context> - <context> - <name>QWizard</name> - <message> - <source>Cancel</source> - <translation>Cancel</translation> - </message> - <message> - <source>Help</source> - <translation>Help</translation> - </message> - <message> - <source>< &Back</source> - <translation>< &Back</translation> - </message> - <message> - <source>&Finish</source> - <translation>&Finish</translation> - </message> - <message> - <source>&Help</source> - <translation>&Help</translation> - </message> - <message> - <source>Go Back</source> - <translation>Go Back</translation> - </message> - <message> - <source>Continue</source> - <translation>Continue</translation> - </message> - <message> - <source>Commit</source> - <translation>Commit</translation> - </message> - <message> - <source>Done</source> - <translation>Done</translation> - </message> - <message> - <source>&Next</source> - <translation>&Next</translation> - </message> - <message> - <source>&Next ></source> - <translation>&Next ></translation> - </message> - </context> - <context> - <name>QWorkspace</name> - <message> - <source>&Restore</source> - <translation>&Restore</translation> - </message> - <message> - <source>&Move</source> - <translation>&Move</translation> - </message> - <message> - <source>&Size</source> - <translation>&Size</translation> - </message> - <message> - <source>Mi&nimize</source> - <translation>Mi&nimize</translation> - </message> - <message> - <source>Ma&ximize</source> - <translation>Ma&ximize</translation> - </message> - <message> - <source>&Close</source> - <translation>&Close</translation> - </message> - <message> - <source>Stay on &Top</source> - <translation>Stay on &Top</translation> - </message> - <message> - <source>Minimize</source> - <translation>Minimize</translation> - </message> - <message> - <source>Restore Down</source> - <translation>Restore Down</translation> - </message> - <message> - <source>Close</source> - <translation>Close</translation> - </message> - <message> - <source>Sh&ade</source> - <translation>Sh&ade</translation> - </message> - <message> - <source>%1 - [%2]</source> - <translation>%1 - [%2]</translation> - </message> - <message> - <source>&Unshade</source> - <translation>&Unshade</translation> - </message> - </context> - <context> - <name>QXml</name> - <message> - <source>no error occurred</source> - <translation>no error occurred</translation> - </message> - <message> - <source>error triggered by consumer</source> - <translation>error triggered by consumer</translation> - </message> - <message> - <source>unexpected end of file</source> - <translation>unexpected end of file</translation> - </message> - <message> - <source>more than one document type definition</source> - <translation>more than one document type definition</translation> - </message> - <message> - <source>error occurred while parsing element</source> - <translation>error occurred while parsing element</translation> - </message> - <message> - <source>tag mismatch</source> - <translation>tag mismatch</translation> - </message> - <message> - <source>error occurred while parsing content</source> - <translation>error occurred while parsing content</translation> - </message> - <message> - <source>unexpected character</source> - <translation>unexpected character</translation> - </message> - <message> - <source>invalid name for processing instruction</source> - <translation>invalid name for processing instruction</translation> - </message> - <message> - <source>version expected while reading the XML declaration</source> - <translation>version expected while reading the XML declaration</translation> - </message> - <message> - <source>wrong value for standalone declaration</source> - <translation>wrong value for standalone declaration</translation> - </message> - <message> - <source>error occurred while parsing document type definition</source> - <translation>error occurred while parsing document type definition</translation> - </message> - <message> - <source>letter is expected</source> - <translation>letter is expected</translation> - </message> - <message> - <source>error occurred while parsing comment</source> - <translation>error occurred while parsing comment</translation> - </message> - <message> - <source>error occurred while parsing reference</source> - <translation>error occurred while parsing reference</translation> - </message> - <message> - <source>internal general entity reference not allowed in DTD</source> - <translation>internal general entity reference not allowed in DTD</translation> - </message> - <message> - <source>external parsed general entity reference not allowed in attribute value</source> - <translation>external parsed general entity reference not allowed in attribute value</translation> - </message> - <message> - <source>external parsed general entity reference not allowed in DTD</source> - <translation>external parsed general entity reference not allowed in DTD</translation> - </message> - <message> - <source>unparsed entity reference in wrong context</source> - <translation>unparsed entity reference in wrong context</translation> - </message> - <message> - <source>recursive entities</source> - <translation>recursive entities</translation> - </message> - <message> - <source>error in the text declaration of an external entity</source> - <translation>error in the text declaration of an external entity</translation> - </message> - <message> - <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> - <translation>encoding declaration or standalone declaration expected while reading the XML declaration</translation> - </message> - <message> - <source>standalone declaration expected while reading the XML declaration</source> - <translation>standalone declaration expected while reading the XML declaration</translation> - </message> - </context> - <context> - <name>QXmlPatternistCLI</name> - <message> - <source>Warning in %1, at line %2, column %3: %4</source> - <translation>Warning in %1, at line %2, column %3: %4</translation> - </message> - <message> - <source>Warning in %1: %2</source> - <translation>Warning in %1: %2</translation> - </message> - <message> - <source>Unknown location</source> - <translation>Unknown location</translation> - </message> - <message> - <source>Error %1 in %2, at line %3, column %4: %5</source> - <translation>Error %1 in %2, at line %3, column %4: %5</translation> - </message> - <message> - <source>Error %1 in %2: %3</source> - <translation>Error %1 in %2: %3</translation> - </message> - </context> - <context> - <name>QXmlStream</name> - <message> - <source>Extra content at end of document.</source> - <translation>Extra content at end of document.</translation> - </message> - <message> - <source>Invalid entity value.</source> - <translation>Invalid entity value.</translation> - </message> - <message> - <source>Invalid XML character.</source> - <translation>Invalid XML character.</translation> - </message> - <message> - <source>Sequence ']]>' not allowed in content.</source> - <translation>Sequence ']]>' not allowed in content.</translation> - </message> - <message> - <source>Namespace prefix '%1' not declared</source> - <translation>Namespace prefix '%1' not declared</translation> - </message> - <message> - <source>Attribute redefined.</source> - <translation>Attribute redefined.</translation> - </message> - <message> - <source>Unexpected character '%1' in public id literal.</source> - <translation>Unexpected character '%1' in public id literal.</translation> - </message> - <message> - <source>Invalid XML version string.</source> - <translation>Invalid XML version string.</translation> - </message> - <message> - <source>Unsupported XML version.</source> - <translation>Unsupported XML version.</translation> - </message> - <message> - <source>%1 is an invalid encoding name.</source> - <translation>%1 is an invalid encoding name.</translation> - </message> - <message> - <source>Encoding %1 is unsupported</source> - <translation>Encoding %1 is unsupported</translation> - </message> - <message> - <source>Standalone accepts only yes or no.</source> - <translation>Standalone accepts only yes or no.</translation> - </message> - <message> - <source>Invalid attribute in XML declaration.</source> - <translation>Invalid attribute in XML declaration.</translation> - </message> - <message> - <source>Premature end of document.</source> - <translation>Premature end of document.</translation> - </message> - <message> - <source>Invalid document.</source> - <translation>Invalid document.</translation> - </message> - <message> - <source>Expected </source> - <translation>Expected </translation> - </message> - <message> - <source>, but got '</source> - <translation>, but got '</translation> - </message> - <message> - <source>Unexpected '</source> - <translation>Unexpected '</translation> - </message> - <message> - <source>Expected character data.</source> - <translation>Expected character data.</translation> - </message> - <message> - <source>Recursive entity detected.</source> - <translation>Recursive entity detected.</translation> - </message> - <message> - <source>Start tag expected.</source> - <translation>Start tag expected.</translation> - </message> - <message> - <source>XML declaration not at start of document.</source> - <translation>XML declaration not at start of document.</translation> - </message> - <message> - <source>NDATA in parameter entity declaration.</source> - <translation>NDATA in parameter entity declaration.</translation> - </message> - <message> - <source>%1 is an invalid processing instruction name.</source> - <translation>%1 is an invalid processing instruction name.</translation> - </message> - <message> - <source>Invalid processing instruction name.</source> - <translation>Invalid processing instruction name.</translation> - </message> - <message> - <source>Illegal namespace declaration.</source> - <translation>Illegal namespace declaration.</translation> - </message> - <message> - <source>Invalid XML name.</source> - <translation>Invalid XML name.</translation> - </message> - <message> - <source>Opening and ending tag mismatch.</source> - <translation>Opening and ending tag mismatch.</translation> - </message> - <message> - <source>Reference to unparsed entity '%1'.</source> - <translation>Reference to unparsed entity '%1'.</translation> - </message> - <message> - <source>Entity '%1' not declared.</source> - <translation>Entity '%1' not declared.</translation> - </message> - <message> - <source>Reference to external entity '%1' in attribute value.</source> - <translation>Reference to external entity '%1' in attribute value.</translation> - </message> - <message> - <source>Invalid character reference.</source> - <translation>Invalid character reference.</translation> - </message> - <message> - <source>Encountered incorrectly encoded content.</source> - <translation>Encountered incorrectly encoded content.</translation> - </message> - <message> - <source>The standalone pseudo attribute must appear after the encoding.</source> - <translation>The standalone pseudo attribute must appear after the encoding.</translation> - </message> - <message> - <source>%1 is an invalid PUBLIC identifier.</source> - <translation>%1 is an invalid PUBLIC identifier.</translation> - </message> - </context> - <context> - <name>QtXmlPatterns</name> - <message> - <source>At least one component must be present.</source> - <translation>At least one component must be present.</translation> - </message> - <message> - <source>%1 is not a valid value of type %2.</source> - <translation>%1 is not a valid value of type %2.</translation> - </message> - <message> - <source>When casting to %1 from %2, the source value cannot be %3.</source> - <translation>When casting to %1 from %2, the source value cannot be %3.</translation> - </message> - <message> - <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> - <translation>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</translation> - </message> - <message> - <source>The data of a processing instruction cannot contain the string %1</source> - <translation>The data of a processing instruction cannot contain the string %1</translation> - </message> - <message> - <source>%1 is an invalid %2</source> - <translation>%1 is an invalid %2</translation> - </message> - <message> - <source>%1 is not a valid XML 1.0 character.</source> - <translation>%1 is not a valid XML 1.0 character.</translation> - </message> - <message> - <source>%1 was called.</source> - <translation>%1 was called.</translation> - </message> - <message> - <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> - <translation>In the replacement string, %1 must be followed by at least one digit when not escaped.</translation> - </message> - <message> - <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> - <translation>In the replacement string, %1 can only be used to escape itself or %2, not %3</translation> - </message> - <message> - <source>%1 matches newline characters</source> - <translation>%1 matches newline characters</translation> - </message> - <message> - <source>Matches are case insensitive</source> - <translation>Matches are case insensitive</translation> - </message> - <message> - <source>%1 is an invalid regular expression pattern: %2</source> - <translation>%1 is an invalid regular expression pattern: %2</translation> - </message> - <message> - <source>It will not be possible to retrieve %1.</source> - <translation>It will not be possible to retrieve %1.</translation> - </message> - <message> - <source>The default collection is undefined</source> - <translation>The default collection is undefined</translation> - </message> - <message> - <source>%1 cannot be retrieved</source> - <translation>%1 cannot be retrieved</translation> - </message> - <message> - <source>The item %1 did not match the required type %2.</source> - <translation>The item %1 did not match the required type %2.</translation> - </message> - <message> - <source>%1 is an unknown schema type.</source> - <translation>%1 is an unknown schema type.</translation> - </message> - <message> - <source>A template with name %1 has already been declared.</source> - <translation>A template with name %1 has already been declared.</translation> - </message> - <message> - <source>Only one %1 declaration can occur in the query prolog.</source> - <translation>Only one %1 declaration can occur in the query prolog.</translation> - </message> - <message> - <source>The initialization of variable %1 depends on itself</source> - <translation>The initialization of variable %1 depends on itself</translation> - </message> - <message> - <source>The variable %1 is unused</source> - <translation>The variable %1 is unused</translation> - </message> - <message> - <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> - <translation>Version %1 is not supported. The supported XQuery version is 1.0.</translation> - </message> - <message> - <source>No function with signature %1 is available</source> - <translation>No function with signature %1 is available</translation> - </message> - <message> - <source>It is not possible to redeclare prefix %1.</source> - <translation>It is not possible to redeclare prefix %1.</translation> - </message> - <message> - <source>Prefix %1 is already declared in the prolog.</source> - <translation>Prefix %1 is already declared in the prolog.</translation> - </message> - <message> - <source>The name of an option must have a prefix. There is no default namespace for options.</source> - <translation>The name of an option must have a prefix. There is no default namespace for options.</translation> - </message> - <message> - <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> - <translation>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</translation> - </message> - <message> - <source>The target namespace of a %1 cannot be empty.</source> - <translation>The target namespace of a %1 cannot be empty.</translation> - </message> - <message> - <source>The module import feature is not supported</source> - <translation>The module import feature is not supported</translation> - </message> - <message> - <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> - <translation>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</translation> - </message> - <message> - <source>A function already exists with the signature %1.</source> - <translation>A function already exists with the signature %1.</translation> - </message> - <message> - <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> - <translation>No external functions are supported. All supported functions can be used directly, without first declaring them as external</translation> - </message> - <message> - <source>The %1-axis is unsupported in XQuery</source> - <translation>The %1-axis is unsupported in XQuery</translation> - </message> - <message> - <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> - <translation>The namespace URI cannot be the empty string when binding to a prefix, %1.</translation> - </message> - <message> - <source>%1 is an invalid namespace URI.</source> - <translation>%1 is an invalid namespace URI.</translation> - </message> - <message> - <source>It is not possible to bind to the prefix %1</source> - <translation>It is not possible to bind to the prefix %1</translation> - </message> - <message> - <source>Two namespace declaration attributes have the same name: %1.</source> - <translation>Two namespace declaration attributes have the same name: %1.</translation> - </message> - <message> - <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> - <translation>The namespace URI must be a constant and cannot use enclosed expressions.</translation> - </message> - <message> - <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> - <translation>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</translation> - </message> - <message> - <source>empty</source> - <translation>empty</translation> - </message> - <message> - <source>zero or one</source> - <translation>zero or one</translation> - </message> - <message> - <source>exactly one</source> - <translation>exactly one</translation> - </message> - <message> - <source>one or more</source> - <translation>one or more</translation> - </message> - <message> - <source>zero or more</source> - <translation>zero or more</translation> - </message> - <message> - <source>The focus is undefined.</source> - <translation>The focus is undefined.</translation> - </message> - <message> - <source>An attribute by name %1 has already been created.</source> - <translation>An attribute by name %1 has already been created.</translation> - </message> - <message> - <source>Network timeout.</source> - <translation>Network timeout.</translation> - </message> - <message> - <source>Element %1 can't be serialized because it appears outside the document element.</source> - <translation>Element %1 can't be serialized because it appears outside the document element.</translation> - </message> - <message> - <source>Year %1 is invalid because it begins with %2.</source> - <translation>Year %1 is invalid because it begins with %2.</translation> - </message> - <message> - <source>Day %1 is outside the range %2..%3.</source> - <translation>Day %1 is outside the range %2..%3.</translation> - </message> - <message> - <source>Month %1 is outside the range %2..%3.</source> - <translation>Month %1 is outside the range %2..%3.</translation> - </message> - <message> - <source>Overflow: Can't represent date %1.</source> - <translation>Overflow: Can't represent date %1.</translation> - </message> - <message> - <source>Day %1 is invalid for month %2.</source> - <translation>Day %1 is invalid for month %2.</translation> - </message> - <message> - <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source> - <translation>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </translation> - </message> - <message> - <source>Time %1:%2:%3.%4 is invalid.</source> - <translation>Time %1:%2:%3.%4 is invalid.</translation> - </message> - <message> - <source>Overflow: Date can't be represented.</source> - <translation>Overflow: Date can't be represented.</translation> - </message> - <message> - <source>At least one time component must appear after the %1-delimiter.</source> - <translation>At least one time component must appear after the %1-delimiter.</translation> - </message> - <message> - <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> - <translation>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</translation> - </message> - <message> - <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source> - <translation>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</translation> - </message> - <message> - <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source> - <translation>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</translation> - </message> - <message> - <source>A value of type %1 cannot have an Effective Boolean Value.</source> - <translation>A value of type %1 cannot have an Effective Boolean Value.</translation> - </message> - <message> - <source>Value %1 of type %2 exceeds maximum (%3).</source> - <translation>Value %1 of type %2 exceeds maximum (%3).</translation> - </message> - <message> - <source>Value %1 of type %2 is below minimum (%3).</source> - <translation>Value %1 of type %2 is below minimum (%3).</translation> - </message> - <message> - <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source> - <translation>A value of type %1 must contain an even number of digits. The value %2 does not.</translation> - </message> - <message> - <source>%1 is not valid as a value of type %2.</source> - <translation>%1 is not valid as a value of type %2.</translation> - </message> - <message> - <source>Operator %1 cannot be used on type %2.</source> - <translation>Operator %1 cannot be used on type %2.</translation> - </message> - <message> - <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source> - <translation>Operator %1 cannot be used on atomic values of type %2 and %3.</translation> - </message> - <message> - <source>The namespace URI in the name for a computed attribute cannot be %1.</source> - <translation>The namespace URI in the name for a computed attribute cannot be %1.</translation> - </message> - <message> - <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source> - <translation>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</translation> - </message> - <message> - <source>Type error in cast, expected %1, received %2.</source> - <translation>Type error in cast, expected %1, received %2.</translation> - </message> - <message> - <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source> - <translation>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</translation> - </message> - <message> - <source>A comment cannot contain %1</source> - <translation>A comment cannot contain %1</translation> - </message> - <message> - <source>A comment cannot end with a %1.</source> - <translation>A comment cannot end with a %1.</translation> - </message> - <message> - <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source> - <translation>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</translation> - </message> - <message> - <source>A library module cannot be evaluated directly. It must be imported from a main module.</source> - <translation>A library module cannot be evaluated directly. It must be imported from a main module.</translation> - </message> - <message> - <source>No template by name %1 exists.</source> - <translation>No template by name %1 exists.</translation> - </message> - <message> - <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> - <translation>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</translation> - </message> - <message> - <source>A positional predicate must evaluate to a single numeric value.</source> - <translation>A positional predicate must evaluate to a single numeric value.</translation> - </message> - <message> - <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</source> - <translation>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid.</translation> - </message> - <message> - <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> - <translation>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</translation> - </message> - <message> - <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> - <translation>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</translation> - </message> - <message> - <source>No namespace binding exists for the prefix %1</source> - <translation>No namespace binding exists for the prefix %1</translation> - </message> - <message> - <source>No namespace binding exists for the prefix %1 in %2</source> - <translation>No namespace binding exists for the prefix %1 in %2</translation> - </message> - <message> - <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source> - <translation>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</translation> - </message> - <message> - <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> - <translation>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</translation> - </message> - <message> - <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> - <translation>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</translation> - </message> - <message> - <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source> - <translation>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</translation> - </message> - <message> - <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> - <translation>%1 must be followed by %2 or %3, not at the end of the replacement string.</translation> - </message> - <message> - <source>%1 and %2 match the start and end of a line.</source> - <translation>%1 and %2 match the start and end of a line.</translation> - </message> - <message> - <source>Whitespace characters are removed, except when they appear in character classes</source> - <translation>Whitespace characters are removed, except when they appear in character classes</translation> - </message> - <message> - <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> - <translation>%1 is an invalid flag for regular expressions. Valid flags are:</translation> - </message> - <message> - <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> - <translation>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</translation> - </message> - <message> - <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> - <translation>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</translation> - </message> - <message> - <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> - <translation>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</translation> - </message> - <message> - <source>Required cardinality is %1; got cardinality %2.</source> - <translation>Required cardinality is %1; got cardinality %2.</translation> - </message> - <message> - <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> - <translation>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</translation> - </message> - <message> - <source>The keyword %1 cannot occur with any other mode name.</source> - <translation>The keyword %1 cannot occur with any other mode name.</translation> - </message> - <message> - <source>No variable with name %1 exists</source> - <translation>No variable with name %1 exists</translation> - </message> - <message> - <source>The value of attribute %1 must be of type %2, which %3 isn't.</source> - <translation>The value of attribute %1 must be of type %2, which %3 isn't.</translation> - </message> - <message> - <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source> - <translation>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</translation> - </message> - <message> - <source>A variable with name %1 has already been declared.</source> - <translation>A variable with name %1 has already been declared.</translation> - </message> - <message> - <source>No value is available for the external variable with name %1.</source> - <translation>No value is available for the external variable with name %1.</translation> - </message> - <message> - <source>A stylesheet function must have a prefixed name.</source> - <translation>A stylesheet function must have a prefixed name.</translation> - </message> - <message> - <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> - <translation>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</translation> - </message> - <message> - <source>An argument with name %1 has already been declared. Every argument name must be unique.</source> - <translation>An argument with name %1 has already been declared. Every argument name must be unique.</translation> - </message> - <message> - <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> - <translation>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</translation> - </message> - <message> - <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> - <translation>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</translation> - </message> - <message> - <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> - <translation>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</translation> - </message> - <message> - <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> - <translation>In an XSL-T pattern, function %1 cannot have a third argument.</translation> - </message> - <message> - <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> - <translation>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</translation> - </message> - <message> - <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> - <translation>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</translation> - </message> - <message> - <source>%1 is an invalid template mode name.</source> - <translation>%1 is an invalid template mode name.</translation> - </message> - <message> - <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> - <translation>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</translation> - </message> - <message> - <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> - <translation>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</translation> - </message> - <message> - <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> - <translation>None of the pragma expressions are supported. Therefore, a fallback expression must be present</translation> - </message> - <message> - <source>Each name of a template parameter must be unique; %1 is duplicated.</source> - <translation>Each name of a template parameter must be unique; %1 is duplicated.</translation> - </message> - <message> - <source>No function with name %1 is available.</source> - <translation>No function with name %1 is available.</translation> - </message> - <message> - <source>%1 is not a valid numeric literal.</source> - <translation>%1 is not a valid numeric literal.</translation> - </message> - <message> - <source>W3C XML Schema identity constraint selector</source> - <translation>W3C XML Schema identity constraint selector</translation> - </message> - <message> - <source>W3C XML Schema identity constraint field</source> - <translation>W3C XML Schema identity constraint field</translation> - </message> - <message> - <source>A construct was encountered which is disallowed in the current language(%1).</source> - <translation>A construct was encountered which is disallowed in the current language(%1).</translation> - </message> - <message> - <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</translation> - </message> - <message> - <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> - <translation>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</translation> - </message> - <message> - <source>An attribute with name %1 has already appeared on this element.</source> - <translation>An attribute with name %1 has already appeared on this element.</translation> - </message> - <message> - <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> - <translation>A direct element constructor is not well-formed. %1 is ended with %2.</translation> - </message> - <message> - <source>The name %1 does not refer to any schema type.</source> - <translation>The name %1 does not refer to any schema type.</translation> - </message> - <message> - <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> - <translation>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</translation> - </message> - <message> - <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> - <translation>%1 is not an atomic type. Casting is only possible to atomic types.</translation> - </message> - <message> - <source>%1 is not a valid name for a processing-instruction.</source> - <translation>%1 is not a valid name for a processing-instruction.</translation> - </message> - <message> - <source>The name of an extension expression must be in a namespace.</source> - <translation>The name of an extension expression must be in a namespace.</translation> - </message> - <message> - <source>Required type is %1, but %2 was found.</source> - <translation>Required type is %1, but %2 was found.</translation> - </message> - <message> - <source>Promoting %1 to %2 may cause loss of precision.</source> - <translation>Promoting %1 to %2 may cause loss of precision.</translation> - </message> - <message> - <source>It's not possible to add attributes after any other kind of node.</source> - <translation>It's not possible to add attributes after any other kind of node.</translation> - </message> - <message> - <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> - <translation>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</translation> - </message> - <message> - <source>Integer division (%1) by zero (%2) is undefined.</source> - <translation>Integer division (%1) by zero (%2) is undefined.</translation> - </message> - <message> - <source>Division (%1) by zero (%2) is undefined.</source> - <translation>Division (%1) by zero (%2) is undefined.</translation> - </message> - <message> - <source>Modulus division (%1) by zero (%2) is undefined.</source> - <translation>Modulus division (%1) by zero (%2) is undefined.</translation> - </message> - <message numerus="yes"> - <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source> - <translation> - <numerusform>%1 takes at most %n argument(s). %2 is therefore invalid.</numerusform> - <numerusform>%1 takes at most %n argument(s). %2 is therefore invalid.</numerusform> - </translation> - </message> - <message numerus="yes"> - <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source> - <translation> - <numerusform>%1 requires at least %n argument(s). %2 is therefore invalid.</numerusform> - <numerusform>%1 requires at least %n argument(s). %2 is therefore invalid.</numerusform> - </translation> - </message> - <message> - <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> - <translation>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</translation> - </message> - <message> - <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> - <translation>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</translation> - </message> - <message> - <source>A default namespace declaration must occur before function, variable, and option declarations.</source> - <translation>A default namespace declaration must occur before function, variable, and option declarations.</translation> - </message> - <message> - <source>Namespace declarations must occur before function, variable, and option declarations.</source> - <translation>Namespace declarations must occur before function, variable, and option declarations.</translation> - </message> - <message> - <source>Module imports must occur before function, variable, and option declarations.</source> - <translation>Module imports must occur before function, variable, and option declarations.</translation> - </message> - <message> - <source>%1 is not a whole number of minutes.</source> - <translation>%1 is not a whole number of minutes.</translation> - </message> - <message> - <source>Attribute %1 can't be serialized because it appears at the top level.</source> - <translation>Attribute %1 can't be serialized because it appears at the top level.</translation> - </message> - <message> - <source>%1 is an unsupported encoding.</source> - <translation>%1 is an unsupported encoding.</translation> - </message> - <message> - <source>%1 contains octets which are disallowed in the requested encoding %2.</source> - <translation>%1 contains octets which are disallowed in the requested encoding %2.</translation> - </message> - <message> - <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> - <translation>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</translation> - </message> - <message> - <source>Ambiguous rule match.</source> - <translation>Ambiguous rule match.</translation> - </message> - <message> - <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> - <translation>In a namespace constructor, the value for a namespace cannot be an empty string.</translation> - </message> - <message> - <source>The prefix must be a valid %1, which %2 is not.</source> - <translation>The prefix must be a valid %1, which %2 is not.</translation> - </message> - <message> - <source>The prefix %1 cannot be bound.</source> - <translation>The prefix %1 cannot be bound.</translation> - </message> - <message> - <source>Only the prefix %1 can be bound to %2 and vice versa.</source> - <translation>Only the prefix %1 can be bound to %2 and vice versa.</translation> - </message> - <message> - <source>The parameter %1 is required, but no corresponding %2 is supplied.</source> - <translation>The parameter %1 is required, but no corresponding %2 is supplied.</translation> - </message> - <message> - <source>The parameter %1 is passed, but no corresponding %2 exists.</source> - <translation>The parameter %1 is passed, but no corresponding %2 exists.</translation> - </message> - <message> - <source>The URI cannot have a fragment</source> - <translation>The URI cannot have a fragment</translation> - </message> - <message> - <source>Element %1 is not allowed at this location.</source> - <translation>Element %1 is not allowed at this location.</translation> - </message> - <message> - <source>Text nodes are not allowed at this location.</source> - <translation>Text nodes are not allowed at this location.</translation> - </message> - <message> - <source>Parse error: %1</source> - <translation>Parse error: %1</translation> - </message> - <message> - <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> - <translation>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</translation> - </message> - <message> - <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> - <translation>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</translation> - </message> - <message> - <source>Unknown XSL-T attribute %1.</source> - <translation>Unknown XSL-T attribute %1.</translation> - </message> - <message> - <source>Attribute %1 and %2 are mutually exclusive.</source> - <translation>Attribute %1 and %2 are mutually exclusive.</translation> - </message> - <message> - <source>In a simplified stylesheet module, attribute %1 must be present.</source> - <translation>In a simplified stylesheet module, attribute %1 must be present.</translation> - </message> - <message> - <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> - <translation>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</translation> - </message> - <message> - <source>Element %1 must have at least one of the attributes %2 or %3.</source> - <translation>Element %1 must have at least one of the attributes %2 or %3.</translation> - </message> - <message> - <source>At least one mode must be specified in the %1-attribute on element %2.</source> - <translation>At least one mode must be specified in the %1-attribute on element %2.</translation> - </message> - <message> - <source>Element %1 must come last.</source> - <translation>Element %1 must come last.</translation> - </message> - <message> - <source>At least one %1-element must occur before %2.</source> - <translation>At least one %1-element must occur before %2.</translation> - </message> - <message> - <source>Only one %1-element can appear.</source> - <translation>Only one %1-element can appear.</translation> - </message> - <message> - <source>At least one %1-element must occur inside %2.</source> - <translation>At least one %1-element must occur inside %2.</translation> - </message> - <message> - <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> - <translation>When attribute %1 is present on %2, a sequence constructor cannot be used.</translation> - </message> - <message> - <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> - <translation>Element %1 must have either a %2-attribute or a sequence constructor.</translation> - </message> - <message> - <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> - <translation>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</translation> - </message> - <message> - <source>Element %1 cannot have children.</source> - <translation>Element %1 cannot have children.</translation> - </message> - <message> - <source>Element %1 cannot have a sequence constructor.</source> - <translation>Element %1 cannot have a sequence constructor.</translation> - </message> - <message> - <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> - <translation>The attribute %1 cannot appear on %2, when it is a child of %3.</translation> - </message> - <message> - <source>A parameter in a function cannot be declared to be a tunnel.</source> - <translation>A parameter in a function cannot be declared to be a tunnel.</translation> - </message> - <message> - <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> - <translation>This processor is not Schema-aware and therefore %1 cannot be used.</translation> - </message> - <message> - <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> - <translation>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</translation> - </message> - <message> - <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> - <translation>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</translation> - </message> - <message> - <source>Attribute %1 cannot have the value %2.</source> - <translation>Attribute %1 cannot have the value %2.</translation> - </message> - <message> - <source>The attribute %1 can only appear on the first %2 element.</source> - <translation>The attribute %1 can only appear on the first %2 element.</translation> - </message> - <message> - <source>At least one %1 element must appear as child of %2.</source> - <translation>At least one %1 element must appear as child of %2.</translation> - </message> - <message> - <source>%1 has inheritance loop in its base type %2.</source> - <translation>%1 has inheritance loop in its base type %2.</translation> - </message> - <message> - <source>Circular inheritance of base type %1.</source> - <translation>Circular inheritance of base type %1.</translation> - </message> - <message> - <source>Circular inheritance of union %1.</source> - <translation>Circular inheritance of union %1.</translation> - </message> - <message> - <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source> - <translation>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</translation> - </message> - <message> - <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source> - <translation>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</translation> - </message> - <message> - <source>Base type of simple type %1 cannot be complex type %2.</source> - <translation>Base type of simple type %1 cannot be complex type %2.</translation> - </message> - <message> - <source>Simple type %1 cannot have direct base type %2.</source> - <translation>Simple type %1 cannot have direct base type %2.</translation> - </message> - <message> - <source>Simple type %1 is not allowed to have base type %2.</source> - <translation>Simple type %1 is not allowed to have base type %2.</translation> - </message> - <message> - <source>Simple type %1 can only have simple atomic type as base type.</source> - <translation>Simple type %1 can only have simple atomic type as base type.</translation> - </message> - <message> - <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source> - <translation>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</translation> - </message> - <message> - <source>Variety of item type of %1 must be either atomic or union.</source> - <translation>Variety of item type of %1 must be either atomic or union.</translation> - </message> - <message> - <source>Variety of member types of %1 must be atomic.</source> - <translation>Variety of member types of %1 must be atomic.</translation> - </message> - <message> - <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source> - <translation>%1 is not allowed to derive from %2 by list as the latter defines it as final.</translation> - </message> - <message> - <source>Simple type %1 is only allowed to have %2 facet.</source> - <translation>Simple type %1 is only allowed to have %2 facet.</translation> - </message> - <message> - <source>Base type of simple type %1 must have variety of type list.</source> - <translation>Base type of simple type %1 must have variety of type list.</translation> - </message> - <message> - <source>Base type of simple type %1 has defined derivation by restriction as final.</source> - <translation>Base type of simple type %1 has defined derivation by restriction as final.</translation> - </message> - <message> - <source>Item type of base type does not match item type of %1.</source> - <translation>Item type of base type does not match item type of %1.</translation> - </message> - <message> - <source>Simple type %1 contains not allowed facet type %2.</source> - <translation>Simple type %1 contains not allowed facet type %2.</translation> - </message> - <message> - <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source> - <translation>%1 is not allowed to derive from %2 by union as the latter defines it as final.</translation> - </message> - <message> - <source>%1 is not allowed to have any facets.</source> - <translation>%1 is not allowed to have any facets.</translation> - </message> - <message> - <source>Base type %1 of simple type %2 must have variety of union.</source> - <translation>Base type %1 of simple type %2 must have variety of union.</translation> - </message> - <message> - <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source> - <translation>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</translation> - </message> - <message> - <source>Member type %1 cannot be derived from member type %2 of %3's base type %4.</source> - <translation>Member type %1 cannot be derived from member type %2 of %3's base type %4.</translation> - </message> - <message> - <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source> - <translation>Derivation method of %1 must be extension because the base type %2 is a simple type.</translation> - </message> - <message> - <source>Complex type %1 has duplicated element %2 in its content model.</source> - <translation>Complex type %1 has duplicated element %2 in its content model.</translation> - </message> - <message> - <source>Complex type %1 has non-deterministic content.</source> - <translation>Complex type %1 has non-deterministic content.</translation> - </message> - <message> - <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source> - <translation>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</translation> - </message> - <message> - <source>Content model of complex type %1 is not a valid extension of content model of %2.</source> - <translation>Content model of complex type %1 is not a valid extension of content model of %2.</translation> - </message> - <message> - <source>Complex type %1 must have simple content.</source> - <translation>Complex type %1 must have simple content.</translation> - </message> - <message> - <source>Complex type %1 must have the same simple type as its base class %2.</source> - <translation>Complex type %1 must have the same simple type as its base class %2.</translation> - </message> - <message> - <source>Complex type %1 cannot be derived from base type %2%3.</source> - <translation>Complex type %1 cannot be derived from base type %2%3.</translation> - </message> - <message> - <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source> - <translation>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</translation> - </message> - <message> - <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source> - <translation>Complex type %1 with simple content cannot be derived from complex base type %2.</translation> - </message> - <message> - <source>Item type of simple type %1 cannot be a complex type.</source> - <translation>Item type of simple type %1 cannot be a complex type.</translation> - </message> - <message> - <source>Member type of simple type %1 cannot be a complex type.</source> - <translation>Member type of simple type %1 cannot be a complex type.</translation> - </message> - <message> - <source>%1 is not allowed to have a member type with the same name as itself.</source> - <translation>%1 is not allowed to have a member type with the same name as itself.</translation> - </message> - <message> - <source>%1 facet collides with %2 facet.</source> - <translation>%1 facet collides with %2 facet.</translation> - </message> - <message> - <source>%1 facet must have the same value as %2 facet of base type.</source> - <translation>%1 facet must have the same value as %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet must be equal or greater than %2 facet of base type.</source> - <translation>%1 facet must be equal or greater than %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet must be less than or equal to %2 facet of base type.</source> - <translation>%1 facet must be less than or equal to %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet contains invalid regular expression</source> - <translation>%1 facet contains invalid regular expression</translation> - </message> - <message> - <source>Unknown notation %1 used in %2 facet.</source> - <translation>Unknown notation %1 used in %2 facet.</translation> - </message> - <message> - <source>%1 facet contains invalid value %2: %3.</source> - <translation>%1 facet contains invalid value %2: %3.</translation> - </message> - <message> - <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source> - <translation>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</translation> - </message> - <message> - <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source> - <translation>%1 facet cannot be %2 if %3 facet of base type is %4.</translation> - </message> - <message> - <source>%1 facet must be less than or equal to %2 facet.</source> - <translation>%1 facet must be less than or equal to %2 facet.</translation> - </message> - <message> - <source>%1 facet must be less than %2 facet of base type.</source> - <translation>%1 facet must be less than %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet and %2 facet cannot appear together.</source> - <translation>%1 facet and %2 facet cannot appear together.</translation> - </message> - <message> - <source>%1 facet must be greater than %2 facet of base type.</source> - <translation>%1 facet must be greater than %2 facet of base type.</translation> - </message> - <message> - <source>%1 facet must be less than %2 facet.</source> - <translation>%1 facet must be less than %2 facet.</translation> - </message> - <message> - <source>%1 facet must be greater than or equal to %2 facet of base type.</source> - <translation>%1 facet must be greater than or equal to %2 facet of base type.</translation> - </message> - <message> - <source>Simple type contains not allowed facet %1.</source> - <translation>Simple type contains not allowed facet %1.</translation> - </message> - <message> - <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source> - <translation>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</translation> - </message> - <message> - <source>Only %1 and %2 facets are allowed when derived by union.</source> - <translation>Only %1 and %2 facets are allowed when derived by union.</translation> - </message> - <message> - <source>%1 contains %2 facet with invalid data: %3.</source> - <translation>%1 contains %2 facet with invalid data: %3.</translation> - </message> - <message> - <source>Attribute group %1 contains attribute %2 twice.</source> - <translation>Attribute group %1 contains attribute %2 twice.</translation> - </message> - <message> - <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source> - <translation>Attribute group %1 contains two different attributes that both have types derived from %2.</translation> - </message> - <message> - <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</translation> - </message> - <message> - <source>Complex type %1 contains attribute %2 twice.</source> - <translation>Complex type %1 contains attribute %2 twice.</translation> - </message> - <message> - <source>Complex type %1 contains two different attributes that both have types derived from %2.</source> - <translation>Complex type %1 contains two different attributes that both have types derived from %2.</translation> - </message> - <message> - <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</translation> - </message> - <message> - <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source> - <translation>Element %1 is not allowed to have a value constraint if its base type is complex.</translation> - </message> - <message> - <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source> - <translation>Element %1 is not allowed to have a value constraint if its type is derived from %2.</translation> - </message> - <message> - <source>Value constraint of element %1 is not of elements type: %2.</source> - <translation>Value constraint of element %1 is not of elements type: %2.</translation> - </message> - <message> - <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source> - <translation>Element %1 is not allowed to have substitution group affiliation as it is no global element.</translation> - </message> - <message> - <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source> - <translation>Type of element %1 cannot be derived from type of substitution group affiliation.</translation> - </message> - <message> - <source>Value constraint of attribute %1 is not of attributes type: %2.</source> - <translation>Value constraint of attribute %1 is not of attributes type: %2.</translation> - </message> - <message> - <source>Attribute %1 has value constraint but has type derived from %2.</source> - <translation>Attribute %1 has value constraint but has type derived from %2.</translation> - </message> - <message> - <source>%1 attribute in derived complex type must be %2 like in base type.</source> - <translation>%1 attribute in derived complex type must be %2 like in base type.</translation> - </message> - <message> - <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source> - <translation>Attribute %1 in derived complex type must have %2 value constraint like in base type.</translation> - </message> - <message> - <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source> - <translation>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</translation> - </message> - <message> - <source>Attribute %1 in derived complex type must have %2 value constraint.</source> - <translation>Attribute %1 in derived complex type must have %2 value constraint.</translation> - </message> - <message> - <source>processContent of base wildcard must be weaker than derived wildcard.</source> - <translation>processContent of base wildcard must be weaker than derived wildcard.</translation> - </message> - <message> - <source>Element %1 exists twice with different types.</source> - <translation>Element %1 exists twice with different types.</translation> - </message> - <message> - <source>Particle contains non-deterministic wildcards.</source> - <translation>Particle contains non-deterministic wildcards.</translation> - </message> - <message> - <source>Base attribute %1 is required but derived attribute is not.</source> - <translation>Base attribute %1 is required but derived attribute is not.</translation> - </message> - <message> - <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source> - <translation>Type of derived attribute %1 cannot be validly derived from type of base attribute.</translation> - </message> - <message> - <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source> - <translation>Value constraint of derived attribute %1 does not match value constraint of base attribute.</translation> - </message> - <message> - <source>Derived attribute %1 does not exist in the base definition.</source> - <translation>Derived attribute %1 does not exist in the base definition.</translation> - </message> - <message> - <source>Derived attribute %1 does not match the wildcard in the base definition.</source> - <translation>Derived attribute %1 does not match the wildcard in the base definition.</translation> - </message> - <message> - <source>Base attribute %1 is required but missing in derived definition.</source> - <translation>Base attribute %1 is required but missing in derived definition.</translation> - </message> - <message> - <source>Derived definition contains an %1 element that does not exists in the base definition</source> - <translation>Derived definition contains an %1 element that does not exists in the base definition</translation> - </message> - <message> - <source>Derived wildcard is not a subset of the base wildcard.</source> - <translation>Derived wildcard is not a subset of the base wildcard.</translation> - </message> - <message> - <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source> - <translation>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</translation> - </message> - <message> - <source>Attribute %1 from base type is missing in derived type.</source> - <translation>Attribute %1 from base type is missing in derived type.</translation> - </message> - <message> - <source>Type of derived attribute %1 differs from type of base attribute.</source> - <translation>Type of derived attribute %1 differs from type of base attribute.</translation> - </message> - <message> - <source>Base definition contains an %1 element that is missing in the derived definition</source> - <translation>Base definition contains an %1 element that is missing in the derived definition</translation> - </message> - <message> - <source>%1 references unknown %2 or %3 element %4.</source> - <translation>%1 references unknown %2 or %3 element %4.</translation> - </message> - <message> - <source>%1 references identity constraint %2 that is no %3 or %4 element.</source> - <translation>%1 references identity constraint %2 that is no %3 or %4 element.</translation> - </message> - <message> - <source>%1 has a different number of fields from the identity constraint %2 that it references.</source> - <translation>%1 has a different number of fields from the identity constraint %2 that it references.</translation> - </message> - <message> - <source>Base type %1 of %2 element cannot be resolved.</source> - <translation>Base type %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Item type %1 of %2 element cannot be resolved.</source> - <translation>Item type %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Member type %1 of %2 element cannot be resolved.</source> - <translation>Member type %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Type %1 of %2 element cannot be resolved.</source> - <translation>Type %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Base type %1 of complex type cannot be resolved.</source> - <translation>Base type %1 of complex type cannot be resolved.</translation> - </message> - <message> - <source>%1 cannot have complex base type that has a %2.</source> - <translation>%1 cannot have complex base type that has a %2.</translation> - </message> - <message> - <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source> - <translation>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</translation> - </message> - <message> - <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source> - <translation>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</translation> - </message> - <message> - <source>Type of %1 element must be a simple type, %2 is not.</source> - <translation>Type of %1 element must be a simple type, %2 is not.</translation> - </message> - <message> - <source>Substitution group %1 of %2 element cannot be resolved.</source> - <translation>Substitution group %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Substitution group %1 has circular definition.</source> - <translation>Substitution group %1 has circular definition.</translation> - </message> - <message> - <source>Duplicated element names %1 in %2 element.</source> - <translation>Duplicated element names %1 in %2 element.</translation> - </message> - <message> - <source>Reference %1 of %2 element cannot be resolved.</source> - <translation>Reference %1 of %2 element cannot be resolved.</translation> - </message> - <message> - <source>Circular group reference for %1.</source> - <translation>Circular group reference for %1.</translation> - </message> - <message> - <source>%1 element is not allowed in this scope</source> - <translation>%1 element is not allowed in this scope</translation> - </message> - <message> - <source>%1 element cannot have %2 attribute with value other than %3.</source> - <translation>%1 element cannot have %2 attribute with value other than %3.</translation> - </message> - <message> - <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source> - <translation>%1 element cannot have %2 attribute with value other than %3 or %4.</translation> - </message> - <message> - <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source> - <translation>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</translation> - </message> - <message> - <source>Attribute group %1 has circular reference.</source> - <translation>Attribute group %1 has circular reference.</translation> - </message> - <message> - <source>%1 attribute in %2 must have %3 use like in base type %4.</source> - <translation>%1 attribute in %2 must have %3 use like in base type %4.</translation> - </message> - <message> - <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source> - <translation>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</translation> - </message> - <message> - <source>%1 has attribute wildcard but its base type %2 has not.</source> - <translation>%1 has attribute wildcard but its base type %2 has not.</translation> - </message> - <message> - <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source> - <translation>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</translation> - </message> - <message> - <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source> - <translation>Enumeration facet contains invalid content: {%1} is not a value of type %2.</translation> - </message> - <message> - <source>Namespace prefix of qualified name %1 is not defined.</source> - <translation>Namespace prefix of qualified name %1 is not defined.</translation> - </message> - <message> - <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source> - <translation>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</translation> - </message> - <message> - <source>Empty particle cannot be derived from non-empty particle.</source> - <translation>Empty particle cannot be derived from non-empty particle.</translation> - </message> - <message> - <source>Derived particle is missing element %1.</source> - <translation>Derived particle is missing element %1.</translation> - </message> - <message> - <source>Derived element %1 is missing value constraint as defined in base particle.</source> - <translation>Derived element %1 is missing value constraint as defined in base particle.</translation> - </message> - <message> - <source>Derived element %1 has weaker value constraint than base particle.</source> - <translation>Derived element %1 has weaker value constraint than base particle.</translation> - </message> - <message> - <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source> - <translation>Fixed value constraint of element %1 differs from value constraint in base particle.</translation> - </message> - <message> - <source>Derived element %1 cannot be nillable as base element is not nillable.</source> - <translation>Derived element %1 cannot be nillable as base element is not nillable.</translation> - </message> - <message> - <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source> - <translation>Block constraints of derived element %1 must not be more weaker than in the base element.</translation> - </message> - <message> - <source>Simple type of derived element %1 cannot be validly derived from base element.</source> - <translation>Simple type of derived element %1 cannot be validly derived from base element.</translation> - </message> - <message> - <source>Complex type of derived element %1 cannot be validly derived from base element.</source> - <translation>Complex type of derived element %1 cannot be validly derived from base element.</translation> - </message> - <message> - <source>Element %1 is missing in derived particle.</source> - <translation>Element %1 is missing in derived particle.</translation> - </message> - <message> - <source>Element %1 does not match namespace constraint of wildcard in base particle.</source> - <translation>Element %1 does not match namespace constraint of wildcard in base particle.</translation> - </message> - <message> - <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source> - <translation>Wildcard in derived particle is not a valid subset of wildcard in base particle.</translation> - </message> - <message> - <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source> - <translation>processContent of wildcard in derived particle is weaker than wildcard in base particle.</translation> - </message> - <message> - <source>Derived particle allows content that is not allowed in the base particle.</source> - <translation>Derived particle allows content that is not allowed in the base particle.</translation> - </message> - <message> - <source>Can not process unknown element %1, expected elements are: %2.</source> - <translation>Can not process unknown element %1, expected elements are: %2.</translation> - </message> - <message> - <source>Element %1 is not allowed in this scope, possible elements are: %2.</source> - <translation>Element %1 is not allowed in this scope, possible elements are: %2.</translation> - </message> - <message> - <source>Child element is missing in that scope, possible child elements are: %1.</source> - <translation>Child element is missing in that scope, possible child elements are: %1.</translation> - </message> - <message> - <source>Document is not a XML schema.</source> - <translation>Document is not a XML schema.</translation> - </message> - <message> - <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source> - <translation>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</translation> - </message> - <message> - <source>%1 attribute of %2 element contains invalid content: {%3}.</source> - <translation>%1 attribute of %2 element contains invalid content: {%3}.</translation> - </message> - <message> - <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source> - <translation>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</translation> - </message> - <message> - <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source> - <translation>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</translation> - </message> - <message> - <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source> - <translation>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</translation> - </message> - <message> - <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source> - <translation>%1 element without %2 attribute is not allowed inside schema without target namespace.</translation> - </message> - <message> - <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source> - <translation>%1 element is not allowed inside %2 element if %3 attribute is present.</translation> - </message> - <message> - <source>%1 element has neither %2 attribute nor %3 child element.</source> - <translation>%1 element has neither %2 attribute nor %3 child element.</translation> - </message> - <message> - <source>%1 element with %2 child element must not have a %3 attribute.</source> - <translation>%1 element with %2 child element must not have a %3 attribute.</translation> - </message> - <message> - <source>%1 attribute of %2 element must be %3 or %4.</source> - <translation>%1 attribute of %2 element must be %3 or %4.</translation> - </message> - <message> - <source>%1 attribute of %2 element must have a value of %3.</source> - <translation>%1 attribute of %2 element must have a value of %3.</translation> - </message> - <message> - <source>%1 attribute of %2 element must have a value of %3 or %4.</source> - <translation>%1 attribute of %2 element must have a value of %3 or %4.</translation> - </message> - <message> - <source>%1 element must not have %2 and %3 attribute together.</source> - <translation>%1 element must not have %2 and %3 attribute together.</translation> - </message> - <message> - <source>Content of %1 attribute of %2 element must not be from namespace %3.</source> - <translation>Content of %1 attribute of %2 element must not be from namespace %3.</translation> - </message> - <message> - <source>%1 attribute of %2 element must not be %3.</source> - <translation>%1 attribute of %2 element must not be %3.</translation> - </message> - <message> - <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source> - <translation>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</translation> - </message> - <message> - <source>Specifying use='prohibited' inside an attribute group has no effect.</source> - <translation>Specifying use='prohibited' inside an attribute group has no effect.</translation> - </message> - <message> - <source>%1 element must have either %2 or %3 attribute.</source> - <translation>%1 element must have either %2 or %3 attribute.</translation> - </message> - <message> - <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source> - <translation>%1 element must have either %2 attribute or %3 or %4 as child element.</translation> - </message> - <message> - <source>%1 element requires either %2 or %3 attribute.</source> - <translation>%1 element requires either %2 or %3 attribute.</translation> - </message> - <message> - <source>Text or entity references not allowed inside %1 element</source> - <translation>Text or entity references not allowed inside %1 element</translation> - </message> - <message> - <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source> - <translation>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</translation> - </message> - <message> - <source>%1 element is not allowed in this context.</source> - <translation>%1 element is not allowed in this context.</translation> - </message> - <message> - <source>%1 attribute of %2 element has larger value than %3 attribute.</source> - <translation>%1 attribute of %2 element has larger value than %3 attribute.</translation> - </message> - <message> - <source>Prefix of qualified name %1 is not defined.</source> - <translation>Prefix of qualified name %1 is not defined.</translation> - </message> - <message> - <source>%1 attribute of %2 element must either contain %3 or the other values.</source> - <translation>%1 attribute of %2 element must either contain %3 or the other values.</translation> - </message> - <message> - <source>Component with ID %1 has been defined previously.</source> - <translation>Component with ID %1 has been defined previously.</translation> - </message> - <message> - <source>Element %1 already defined.</source> - <translation>Element %1 already defined.</translation> - </message> - <message> - <source>Attribute %1 already defined.</source> - <translation>Attribute %1 already defined.</translation> - </message> - <message> - <source>Type %1 already defined.</source> - <translation>Type %1 already defined.</translation> - </message> - <message> - <source>Attribute group %1 already defined.</source> - <translation>Attribute group %1 already defined.</translation> - </message> - <message> - <source>Element group %1 already defined.</source> - <translation>Element group %1 already defined.</translation> - </message> - <message> - <source>Notation %1 already defined.</source> - <translation>Notation %1 already defined.</translation> - </message> - <message> - <source>Identity constraint %1 already defined.</source> - <translation>Identity constraint %1 already defined.</translation> - </message> - <message> - <source>Duplicated facets in simple type %1.</source> - <translation>Duplicated facets in simple type %1.</translation> - </message> - <message> - <source>%1 is not valid according to %2.</source> - <translation>%1 is not valid according to %2.</translation> - </message> - <message> - <source>String content does not match the length facet.</source> - <translation>String content does not match the length facet.</translation> - </message> - <message> - <source>String content does not match the minLength facet.</source> - <translation>String content does not match the minLength facet.</translation> - </message> - <message> - <source>String content does not match the maxLength facet.</source> - <translation>String content does not match the maxLength facet.</translation> - </message> - <message> - <source>String content does not match pattern facet.</source> - <translation>String content does not match pattern facet.</translation> - </message> - <message> - <source>String content is not listed in the enumeration facet.</source> - <translation>String content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Signed integer content does not match the maxInclusive facet.</source> - <translation>Signed integer content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Signed integer content does not match the maxExclusive facet.</source> - <translation>Signed integer content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Signed integer content does not match the minInclusive facet.</source> - <translation>Signed integer content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Signed integer content does not match the minExclusive facet.</source> - <translation>Signed integer content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Signed integer content is not listed in the enumeration facet.</source> - <translation>Signed integer content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Signed integer content does not match pattern facet.</source> - <translation>Signed integer content does not match pattern facet.</translation> - </message> - <message> - <source>Signed integer content does not match in the totalDigits facet.</source> - <translation>Signed integer content does not match in the totalDigits facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match the maxInclusive facet.</source> - <translation>Unsigned integer content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match the maxExclusive facet.</source> - <translation>Unsigned integer content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match the minInclusive facet.</source> - <translation>Unsigned integer content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match the minExclusive facet.</source> - <translation>Unsigned integer content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Unsigned integer content is not listed in the enumeration facet.</source> - <translation>Unsigned integer content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match pattern facet.</source> - <translation>Unsigned integer content does not match pattern facet.</translation> - </message> - <message> - <source>Unsigned integer content does not match in the totalDigits facet.</source> - <translation>Unsigned integer content does not match in the totalDigits facet.</translation> - </message> - <message> - <source>Double content does not match the maxInclusive facet.</source> - <translation>Double content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Double content does not match the maxExclusive facet.</source> - <translation>Double content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Double content does not match the minInclusive facet.</source> - <translation>Double content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Double content does not match the minExclusive facet.</source> - <translation>Double content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Double content is not listed in the enumeration facet.</source> - <translation>Double content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Double content does not match pattern facet.</source> - <translation>Double content does not match pattern facet.</translation> - </message> - <message> - <source>Decimal content does not match in the fractionDigits facet.</source> - <translation>Decimal content does not match in the fractionDigits facet.</translation> - </message> - <message> - <source>Decimal content does not match in the totalDigits facet.</source> - <translation>Decimal content does not match in the totalDigits facet.</translation> - </message> - <message> - <source>Date time content does not match the maxInclusive facet.</source> - <translation>Date time content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Date time content does not match the maxExclusive facet.</source> - <translation>Date time content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Date time content does not match the minInclusive facet.</source> - <translation>Date time content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Date time content does not match the minExclusive facet.</source> - <translation>Date time content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Date time content is not listed in the enumeration facet.</source> - <translation>Date time content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Date time content does not match pattern facet.</source> - <translation>Date time content does not match pattern facet.</translation> - </message> - <message> - <source>Duration content does not match the maxInclusive facet.</source> - <translation>Duration content does not match the maxInclusive facet.</translation> - </message> - <message> - <source>Duration content does not match the maxExclusive facet.</source> - <translation>Duration content does not match the maxExclusive facet.</translation> - </message> - <message> - <source>Duration content does not match the minInclusive facet.</source> - <translation>Duration content does not match the minInclusive facet.</translation> - </message> - <message> - <source>Duration content does not match the minExclusive facet.</source> - <translation>Duration content does not match the minExclusive facet.</translation> - </message> - <message> - <source>Duration content is not listed in the enumeration facet.</source> - <translation>Duration content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Duration content does not match pattern facet.</source> - <translation>Duration content does not match pattern facet.</translation> - </message> - <message> - <source>Boolean content does not match pattern facet.</source> - <translation>Boolean content does not match pattern facet.</translation> - </message> - <message> - <source>Binary content does not match the length facet.</source> - <translation>Binary content does not match the length facet.</translation> - </message> - <message> - <source>Binary content does not match the minLength facet.</source> - <translation>Binary content does not match the minLength facet.</translation> - </message> - <message> - <source>Binary content does not match the maxLength facet.</source> - <translation>Binary content does not match the maxLength facet.</translation> - </message> - <message> - <source>Binary content is not listed in the enumeration facet.</source> - <translation>Binary content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Invalid QName content: %1.</source> - <translation>Invalid QName content: %1.</translation> - </message> - <message> - <source>QName content is not listed in the enumeration facet.</source> - <translation>QName content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>QName content does not match pattern facet.</source> - <translation>QName content does not match pattern facet.</translation> - </message> - <message> - <source>Notation content is not listed in the enumeration facet.</source> - <translation>Notation content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>List content does not match length facet.</source> - <translation>List content does not match length facet.</translation> - </message> - <message> - <source>List content does not match minLength facet.</source> - <translation>List content does not match minLength facet.</translation> - </message> - <message> - <source>List content does not match maxLength facet.</source> - <translation>List content does not match maxLength facet.</translation> - </message> - <message> - <source>List content is not listed in the enumeration facet.</source> - <translation>List content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>List content does not match pattern facet.</source> - <translation>List content does not match pattern facet.</translation> - </message> - <message> - <source>Union content is not listed in the enumeration facet.</source> - <translation>Union content is not listed in the enumeration facet.</translation> - </message> - <message> - <source>Union content does not match pattern facet.</source> - <translation>Union content does not match pattern facet.</translation> - </message> - <message> - <source>Data of type %1 are not allowed to be empty.</source> - <translation>Data of type %1 are not allowed to be empty.</translation> - </message> - <message> - <source>Element %1 is missing child element.</source> - <translation>Element %1 is missing child element.</translation> - </message> - <message> - <source>There is one IDREF value with no corresponding ID: %1.</source> - <translation>There is one IDREF value with no corresponding ID: %1.</translation> - </message> - <message> - <source>Loaded schema file is invalid.</source> - <translation>Loaded schema file is invalid.</translation> - </message> - <message> - <source>%1 contains invalid data.</source> - <translation>%1 contains invalid data.</translation> - </message> - <message> - <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source> - <translation>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</translation> - </message> - <message> - <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source> - <translation>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</translation> - </message> - <message> - <source>No schema defined for validation.</source> - <translation>No schema defined for validation.</translation> - </message> - <message> - <source>No definition for element %1 available.</source> - <translation>No definition for element %1 available.</translation> - </message> - <message> - <source>Specified type %1 is not known to the schema.</source> - <translation>Specified type %1 is not known to the schema.</translation> - </message> - <message> - <source>Element %1 is not defined in this scope.</source> - <translation>Element %1 is not defined in this scope.</translation> - </message> - <message> - <source>Declaration for element %1 does not exist.</source> - <translation>Declaration for element %1 does not exist.</translation> - </message> - <message> - <source>Element %1 contains invalid content.</source> - <translation>Element %1 contains invalid content.</translation> - </message> - <message> - <source>Element %1 is declared as abstract.</source> - <translation>Element %1 is declared as abstract.</translation> - </message> - <message> - <source>Element %1 is not nillable.</source> - <translation>Element %1 is not nillable.</translation> - </message> - <message> - <source>Attribute %1 contains invalid data: %2</source> - <translation>Attribute %1 contains invalid data: %2</translation> - </message> - <message> - <source>Element contains content although it is nillable.</source> - <translation>Element contains content although it is nillable.</translation> - </message> - <message> - <source>Fixed value constraint not allowed if element is nillable.</source> - <translation>Fixed value constraint not allowed if element is nillable.</translation> - </message> - <message> - <source>Element %1 cannot contain other elements, as it has a fixed content.</source> - <translation>Element %1 cannot contain other elements, as it has a fixed content.</translation> - </message> - <message> - <source>Specified type %1 is not validly substitutable with element type %2.</source> - <translation>Specified type %1 is not validly substitutable with element type %2.</translation> - </message> - <message> - <source>Complex type %1 is not allowed to be abstract.</source> - <translation>Complex type %1 is not allowed to be abstract.</translation> - </message> - <message> - <source>Element %1 contains not allowed attributes.</source> - <translation>Element %1 contains not allowed attributes.</translation> - </message> - <message> - <source>Element %1 contains not allowed child element.</source> - <translation>Element %1 contains not allowed child element.</translation> - </message> - <message> - <source>Content of element %1 does not match its type definition: %2.</source> - <translation>Content of element %1 does not match its type definition: %2.</translation> - </message> - <message> - <source>Content of element %1 does not match defined value constraint.</source> - <translation>Content of element %1 does not match defined value constraint.</translation> - </message> - <message> - <source>Element %1 contains not allowed child content.</source> - <translation>Element %1 contains not allowed child content.</translation> - </message> - <message> - <source>Element %1 contains not allowed text content.</source> - <translation>Element %1 contains not allowed text content.</translation> - </message> - <message> - <source>Element %1 is missing required attribute %2.</source> - <translation>Element %1 is missing required attribute %2.</translation> - </message> - <message> - <source>Attribute %1 does not match the attribute wildcard.</source> - <translation>Attribute %1 does not match the attribute wildcard.</translation> - </message> - <message> - <source>Declaration for attribute %1 does not exist.</source> - <translation>Declaration for attribute %1 does not exist.</translation> - </message> - <message> - <source>Element %1 contains two attributes of type %2.</source> - <translation>Element %1 contains two attributes of type %2.</translation> - </message> - <message> - <source>Attribute %1 contains invalid content.</source> - <translation>Attribute %1 contains invalid content.</translation> - </message> - <message> - <source>Element %1 contains unknown attribute %2.</source> - <translation>Element %1 contains unknown attribute %2.</translation> - </message> - <message> - <source>Content of attribute %1 does not match its type definition: %2.</source> - <translation>Content of attribute %1 does not match its type definition: %2.</translation> - </message> - <message> - <source>Content of attribute %1 does not match defined value constraint.</source> - <translation>Content of attribute %1 does not match defined value constraint.</translation> - </message> - <message> - <source>Non-unique value found for constraint %1.</source> - <translation>Non-unique value found for constraint %1.</translation> - </message> - <message> - <source>Key constraint %1 contains absent fields.</source> - <translation>Key constraint %1 contains absent fields.</translation> - </message> - <message> - <source>Key constraint %1 contains references nillable element %2.</source> - <translation>Key constraint %1 contains references nillable element %2.</translation> - </message> - <message> - <source>No referenced value found for key reference %1.</source> - <translation>No referenced value found for key reference %1.</translation> - </message> - <message> - <source>More than one value found for field %1.</source> - <translation>More than one value found for field %1.</translation> - </message> - <message> - <source>Field %1 has no simple type.</source> - <translation>Field %1 has no simple type.</translation> - </message> - <message> - <source>ID value '%1' is not unique.</source> - <translation>ID value '%1' is not unique.</translation> - </message> - <message> - <source>'%1' attribute contains invalid QName content: %2.</source> - <translation>'%1' attribute contains invalid QName content: %2.</translation> - </message> - </context> +<context> + <name>QApplication</name> + <message> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation>RTL</translation> + </message> +</context> </TS> -- cgit v0.12 From bfed75ec958bcea206ba086395f1e2fa4bbcd76f Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Thu, 27 Jan 2011 14:33:05 +0100 Subject: Cocoa: fix autotest, qgraphicsview::moveItemWhileScrolling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This test reveals a real bug when updating and scrolling at the same time in graphicsview. The problem is that the scroll will issue an update to cocoa that gets handled before already queued Qt events. This means that the viewport of graphicsview will receive a paintevent, and clear dirtyScrollOffset, before the posted call to _q_processDirtyItems is executed. This means that we 'loose' the scrolling information upon painting. I discussed this problem with Bjørn Erik, and he had strong opinions about this promblem not worthwhile fixing. The raster engine is anyway about to be default on Mac, and there the problem will not exist. --- tests/auto/qgraphicsview/tst_qgraphicsview.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp index cf697bb..aaff51e 100644 --- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp @@ -3357,6 +3357,10 @@ void tst_QGraphicsView::moveItemWhileScrolling() int a = adjustForAntialiasing ? 2 : 1; expectedRegion += QRect(40, 50, 10, 10).adjusted(-a, -a, a, a); expectedRegion += QRect(40, 60, 10, 10).adjusted(-a, -a, a, a); +#ifdef QT_MAC_USE_COCOA + if (QApplicationPrivate::graphicsSystem() == 0) + QEXPECT_FAIL("", "This will fail with Cocoa because paint events are not send in the order expected by graphicsview", Continue); +#endif COMPARE_REGIONS(view.lastPaintedRegion, expectedRegion); } -- cgit v0.12 From 4ec245a3e75470186557d00b2383af3872a720b0 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Thu, 27 Jan 2011 12:40:33 +0200 Subject: No longer replace dash and dot in TARGET with underscore in Symbian There is no fundamental reason to not have dash or dot in binary names in Symbian, so do not replace them with underscore. One thing that doesn't work with a dot in the filename is launching an application via resources, so automatic resource generation is suppressed for applications that have a dot in filename portion of the TARGET value. Task-number: QTBUG-16888 Reviewed-by: axis --- mkspecs/common/symbian/symbian.conf | 9 +-- mkspecs/features/symbian/application_icon.prf | 106 ++++++++++++++------------ qmake/generators/symbian/symbiancommon.cpp | 23 ++---- qmake/generators/symbian/symbiancommon.h | 1 - qmake/generators/symbian/symmake.cpp | 31 ++++++-- 5 files changed, 89 insertions(+), 81 deletions(-) diff --git a/mkspecs/common/symbian/symbian.conf b/mkspecs/common/symbian/symbian.conf index 5619d4f..0bb3a29 100644 --- a/mkspecs/common/symbian/symbian.conf +++ b/mkspecs/common/symbian/symbian.conf @@ -215,19 +215,14 @@ default_deployment.pkg_prerules += pkg_depends_webkit pkg_depends_qt pkg_platfor DEPLOYMENT += default_deployment default_bin_deployment default_resource_deployment default_reg_deployment defineReplace(symbianRemoveSpecialCharacters) { - # Produce identical string to what SymbianCommonGenerator::removeSpecialCharacters and - # SymbianCommonGenerator::removeEpocSpecialCharacters produce + # Produce identical string to what SymbianCommonGenerator::removeSpecialCharacters fixedStr = $$1 fixedStr = $$replace(fixedStr, /,_) fixedStr = $$replace(fixedStr, \\\\,_) fixedStr = $$replace(fixedStr, " ",_) - symbian-abld|symbian-sbsv2 { - fixedStr = $$replace(fixedStr, -,_) - fixedStr = $$replace(fixedStr, \\.,_) - fixedStr = $$replace(fixedStr, :,_) - } + fixedStr = $$replace(fixedStr, :,_) return ($$fixedStr) } diff --git a/mkspecs/features/symbian/application_icon.prf b/mkspecs/features/symbian/application_icon.prf index 6e1aa8e..b6be89b 100644 --- a/mkspecs/features/symbian/application_icon.prf +++ b/mkspecs/features/symbian/application_icon.prf @@ -11,68 +11,74 @@ contains(CONFIG, no_icon) { !contains(CONFIG, no_icon) { baseTarget = $$symbianRemoveSpecialCharacters($$basename(TARGET)) - symbian-abld|symbian-sbsv2 { - resourceZDir = $$EPOCROOT$$HW_ZDIR$$APP_RESOURCE_DIR - regZDir = $$EPOCROOT$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR + contains(baseTarget, "^.*\\..*$") { + CONFIG += no_icon + ICON = + warning("Symbian resources do not support '.' character in TARGET, skipping resource generation.") } else { - contains(DESTDIR, "/.*") { - resourceZDir = $$DESTDIR - } else:isEmpty(DESTDIR) { - resourceZDir = $$OUT_PWD + symbian-abld|symbian-sbsv2 { + resourceZDir = $$EPOCROOT$$HW_ZDIR$$APP_RESOURCE_DIR + regZDir = $$EPOCROOT$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR } else { - resourceZDir = $$OUT_PWD/$$DESTDIR + contains(DESTDIR, "/.*") { + resourceZDir = $$DESTDIR + } else:isEmpty(DESTDIR) { + resourceZDir = $$OUT_PWD + } else { + resourceZDir = $$OUT_PWD/$$DESTDIR + } + regZDir = $$resourceZDir } - regZDir = $$resourceZDir - } - default_resource_deployment.sources += $$resourceZDir/$${baseTarget}.rsc - default_resource_deployment.path = $$APP_RESOURCE_DIR - default_reg_deployment.sources += $$regZDir/$${baseTarget}_reg.rsc - default_reg_deployment.path = $$REG_RESOURCE_IMPORT_DIR + default_resource_deployment.sources += $$resourceZDir/$${baseTarget}.rsc + default_resource_deployment.path = $$APP_RESOURCE_DIR + default_reg_deployment.sources += $$regZDir/$${baseTarget}_reg.rsc + default_reg_deployment.path = $$REG_RESOURCE_IMPORT_DIR - !isEmpty(ICON) { - !count(ICON, 1) { - ICON = $$first(ICON) - warning("Only first icon specified in ICON variable is used: $$ICON") - } + !isEmpty(ICON) { + !count(ICON, 1) { + ICON = $$first(ICON) + warning("Only first icon specified in ICON variable is used: $$ICON") + } - # Note: symbian-sbsv2 builds can't utilize extra compiler for mifconv, so ICON handling is done in code - !symbian-sbsv2 { - # Absolute path required for shadow builds. - # However, in older Symbian environments abld toolchain can't handle even moderately long - # paths, so don't force absolute there. - !symbian-abld:!contains(ICON, "^(/|\\\\|.:).*"):ICON = $$_PRO_FILE_PWD_/$$ICON + # Note: symbian-sbsv2 builds can't utilize extra compiler for mifconv, so ICON handling is done in code + !symbian-sbsv2 { + # Absolute path required for shadow builds. + # However, in older Symbian environments abld toolchain can't handle even moderately long + # paths, so don't force absolute there. + !symbian-abld:!contains(ICON, "^(/|\\\\|.:).*"):ICON = $$_PRO_FILE_PWD_/$$ICON - #Makefile: requires paths with backslash - ICON_backslashed = $$ICON + #Makefile: requires paths with backslash + ICON_backslashed = $$ICON - symbian-abld { - # ${ZDIR} is defined in Makefile - mifIconZDir = ${ZDIR}$$APP_RESOURCE_DIR - } else { - mifIconZDir = $$resourceZDir - } + symbian-abld { + # ${ZDIR} is defined in Makefile + mifIconZDir = ${ZDIR}$$APP_RESOURCE_DIR + } else { + mifIconZDir = $$resourceZDir + } - # Extra compiler rules for mifconv - mifconv.target = $$mifIconZDir/$${baseTarget}.mif - contains(QMAKE_HOST.os, "Windows") { - ICON_backslashed = $$replace(ICON_backslashed, /, \\) - mifconv.target = $$replace(mifconv.target, /, \\) + # Extra compiler rules for mifconv + mifconv.target = $$mifIconZDir/$${baseTarget}.mif + contains(QMAKE_HOST.os, "Windows") { + ICON_backslashed = $$replace(ICON_backslashed, /, \\) + mifconv.target = $$replace(mifconv.target, /, \\) + } + # Based on: http://www.forum.nokia.com/document/Cpp_Developers_Library + # svg-t icons should always use /c32 depth + mifconv.commands = mifconv $$mifconv.target /c32 $$ICON_backslashed + + mifconv.depends = $$ICON + PRE_TARGETDEPS += $$mifconv.target + QMAKE_EXTRA_TARGETS += mifconv + QMAKE_DISTCLEAN += $$mifconv.target } - # Based on: http://www.forum.nokia.com/document/Cpp_Developers_Library - # svg-t icons should always use /c32 depth - mifconv.commands = mifconv $$mifconv.target /c32 $$ICON_backslashed + # Rules to use generated MIF file from symbian resources + RSS_RULES.number_of_icons = $$size(ICON_backslashed) + RSS_RULES.icon_file = $$APP_RESOURCE_DIR/$${baseTarget}.mif - mifconv.depends = $$ICON - PRE_TARGETDEPS += $$mifconv.target - QMAKE_EXTRA_TARGETS += mifconv - QMAKE_DISTCLEAN += $$mifconv.target + default_resource_deployment.sources += $$resourceZDir/$${baseTarget}.mif } - # Rules to use generated MIF file from symbian resources - RSS_RULES.number_of_icons = $$size(ICON_backslashed) - RSS_RULES.icon_file = $$APP_RESOURCE_DIR/$${baseTarget}.mif - - default_resource_deployment.sources += $$resourceZDir/$${baseTarget}.mif } } diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp index 2270c2e..96d7725 100644 --- a/qmake/generators/symbian/symbiancommon.cpp +++ b/qmake/generators/symbian/symbiancommon.cpp @@ -79,11 +79,7 @@ void SymbianCommonGenerator::init() fixedTarget = project->first("TARGET"); fixedTarget = generator->unescapeFilePath(fixedTarget); fixedTarget = removePathSeparators(fixedTarget); - if (project->first("MAKEFILE_GENERATOR") == "SYMBIAN_ABLD" - || project->first("MAKEFILE_GENERATOR") == "SYMBIAN_SBSV2") - removeEpocSpecialCharacters(fixedTarget); - else - removeSpecialCharacters(fixedTarget); + removeSpecialCharacters(fixedTarget); // This should not be empty since the mkspecs are supposed to set it if missing. uid3 = project->first("TARGET.UID3").trimmed(); @@ -131,18 +127,11 @@ bool SymbianCommonGenerator::containsStartWithItem(const QChar &c, const QString void SymbianCommonGenerator::removeSpecialCharacters(QString& str) { // When modifying this method check also symbianRemoveSpecialCharacters in symbian.conf - str.replace(QString("/"), QString("_")); - str.replace(QString("\\"), QString("_")); - str.replace(QString(" "), QString("_")); -} - -void SymbianCommonGenerator::removeEpocSpecialCharacters(QString& str) -{ - // When modifying this method check also symbianRemoveSpecialCharacters in symbian.conf - str.replace(QString("-"), QString("_")); - str.replace(QString(":"), QString("_")); - str.replace(QString("."), QString("_")); - removeSpecialCharacters(str); + QString underscore = QLatin1String("_"); + str.replace(QLatin1String("/"), underscore); + str.replace(QLatin1String("\\"), underscore); + str.replace(QLatin1String(" "), underscore); + str.replace(QLatin1String(":"), underscore); } QString romPath(const QString& path) diff --git a/qmake/generators/symbian/symbiancommon.h b/qmake/generators/symbian/symbiancommon.h index 0b5f53d..5182021 100644 --- a/qmake/generators/symbian/symbiancommon.h +++ b/qmake/generators/symbian/symbiancommon.h @@ -82,7 +82,6 @@ protected: QString removePathSeparators(QString &file); void removeSpecialCharacters(QString& str); - void removeEpocSpecialCharacters(QString& str); void generatePkgFile(const QString &iconFile, bool epocBuild, const SymbianLocalizationList &symbianLocalizationList); diff --git a/qmake/generators/symbian/symmake.cpp b/qmake/generators/symbian/symmake.cpp index a2b567d..4f9f22d 100644 --- a/qmake/generators/symbian/symmake.cpp +++ b/qmake/generators/symbian/symmake.cpp @@ -83,6 +83,8 @@ #define VAR_CFLAGS "QMAKE_CFLAGS" #define VAR_LFLAGS "QMAKE_LFLAGS" +#define DEFINE_REPLACE_REGEXP "[^A-Z0-9_]" + QString SymbianMakefileGenerator::fixPathForMmp(const QString& origPath, const QDir& parentDir) { static QString epocRootStr; @@ -165,11 +167,15 @@ void SymbianMakefileGenerator::writeHeader(QTextStream &t) QString bldinfDefine = shortProFilename; bldinfDefine.append("_"); bldinfDefine.append(generate_uid(project->projectFile())); + bldinfDefine = bldinfDefine.toUpper(); + + // replace anything not alphanumeric with underscore + QRegExp replacementMask(DEFINE_REPLACE_REGEXP); + bldinfDefine.replace(replacementMask, QLatin1String("_")); bldinfDefine.prepend("BLD_INF_"); - removeEpocSpecialCharacters(bldinfDefine); - t << "#define " << bldinfDefine.toUpper() << endl << endl; + t << "#define " << bldinfDefine << endl << endl; } bool SymbianMakefileGenerator::writeMakefile(QTextStream &t) @@ -902,13 +908,17 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy const QStringList &subdirs = project->values("SUBDIRS"); foreach(QString item, subdirs) { + bool fromFile = false; QString fixedItem; if (!project->isEmpty(item + ".file")) { fixedItem = project->first(item + ".file"); + fromFile = true; } else if (!project->isEmpty(item + ".subdir")) { fixedItem = project->first(item + ".subdir"); + fromFile = false; } else { fixedItem = item; + fromFile = item.endsWith(Option::pro_ext); } QString condition; @@ -917,9 +927,15 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy QFileInfo subdir(fileInfo(fixedItem)); QString relativePath = directory.relativeFilePath(fixedItem); - QString subdirFileName = subdir.completeBaseName(); - QString fullProName = subdir.absoluteFilePath();; + QString fullProName = subdir.absoluteFilePath(); QString bldinfFilename; + QString subdirFileName; + + if (fromFile) { + subdirFileName = subdir.completeBaseName(); + } else { + subdirFileName = subdir.fileName(); + } if (subdir.isDir()) { // Subdir is a regular project @@ -941,7 +957,10 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy QString uid = generate_uid(fullProName); QString bldinfDefine = QString("BLD_INF_") + subdirFileName + QString("_") + uid; bldinfDefine = bldinfDefine.toUpper(); - removeEpocSpecialCharacters(bldinfDefine); + + // replace anything not alphanumeric with underscore + QRegExp replacementMask(DEFINE_REPLACE_REGEXP); + bldinfDefine.replace(replacementMask, QLatin1String("_")); if (!condition.isEmpty()) t << "#if defined(" << condition << ")" << endl; @@ -1124,4 +1143,4 @@ QString SymbianMakefileGenerator::generateLocFileTarget(QTextStream& t, const QS } return locFile; -} \ No newline at end of file +} -- cgit v0.12 From 2e72a8b19ea6c674fb4777860dac50faa5d387e6 Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Thu, 27 Jan 2011 11:49:49 +0100 Subject: Restore Qt 4.6 behaviour: exec() always enters the event loop. In Qt 4.6 as well as 4.7's QCoreApplication and QEventLoop, calling exec() always enters the event loop, even if you had tried to quit()/exit() it before entering, with one exception (noted in the unit tests; this difference has been in Qt since at least Qt 4.2). Add unit tests to ensure all of the three classes have the same behaviour. Decide if we want to match the behaviours in Qt 4.8. Reviewed-by: Bradley T. Hughes --- src/corelib/thread/qthread.cpp | 5 +- .../auto/qcoreapplication/tst_qcoreapplication.cpp | 45 +++++ tests/auto/qeventloop/tst_qeventloop.cpp | 41 ++++- tests/auto/qthread/tst_qthread.cpp | 191 +++++++++++++++------ 4 files changed, 221 insertions(+), 61 deletions(-) diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index f368192..f4bfa5d 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -482,10 +482,7 @@ int QThread::exec() Q_D(QThread); QMutexLocker locker(&d->mutex); d->data->quitNow = false; - if (d->exited) { - d->exited = false; - return d->returnCode; - } + d->exited = false; locker.unlock(); QEventLoop eventLoop; diff --git a/tests/auto/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/qcoreapplication/tst_qcoreapplication.cpp index 95055d1..bc69461 100644 --- a/tests/auto/qcoreapplication/tst_qcoreapplication.cpp +++ b/tests/auto/qcoreapplication/tst_qcoreapplication.cpp @@ -59,6 +59,9 @@ private slots: void applicationPid(); void globalPostedEventsCount(); void processEventsAlwaysSendsPostedEvents(); + void reexec(); + void execAfterExit(); + void eventLoopExecAfterExit(); }; class EventSpy : public QObject @@ -524,5 +527,47 @@ void tst_QCoreApplication::processEventsAlwaysSendsPostedEvents() } while (t.elapsed() < 3000); } +void tst_QCoreApplication::reexec() +{ + int argc = 1; + char *argv[] = { "tst_qcoreapplication" }; + QCoreApplication app(argc, argv); + + // exec once + QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection); + QCOMPARE(app.exec(), 0); + + // and again + QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection); + QCOMPARE(app.exec(), 0); +} + +void tst_QCoreApplication::execAfterExit() +{ + int argc = 1; + char *argv[] = { "tst_qcoreapplication" }; + QCoreApplication app(argc, argv); + + app.exit(1); + QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection); + QCOMPARE(app.exec(), 0); +} + +void tst_QCoreApplication::eventLoopExecAfterExit() +{ + int argc = 1; + char *argv[] = { "tst_qcoreapplication" }; + QCoreApplication app(argc, argv); + + // exec once and exit + QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection); + QCOMPARE(app.exec(), 0); + + // and again, but this time using a QEventLoop + QEventLoop loop; + QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection); + QCOMPARE(loop.exec(), 0); +} + QTEST_APPLESS_MAIN(tst_QCoreApplication) #include "tst_qcoreapplication.moc" diff --git a/tests/auto/qeventloop/tst_qeventloop.cpp b/tests/auto/qeventloop/tst_qeventloop.cpp index 7af722f..6860f19 100644 --- a/tests/auto/qeventloop/tst_qeventloop.cpp +++ b/tests/auto/qeventloop/tst_qeventloop.cpp @@ -112,6 +112,10 @@ signals: public: QMutex mutex; QWaitCondition cond; + volatile int result1; + volatile int result2; + MultipleExecThread() : result1(0xdead), result2(0xbeef) {} + void run() { QMutexLocker locker(&mutex); @@ -124,13 +128,13 @@ public: connect(&timer, SIGNAL(timeout()), SLOT(quit()), Qt::DirectConnection); timer.setInterval(1000); timer.start(); - (void) exec(); + result1 = exec(); // this should return immediately, since exit() has been called cond.wakeOne(); cond.wait(&mutex); QEventLoop eventLoop; - (void) eventLoop.exec(); + result2 = eventLoop.exec(); } }; @@ -197,7 +201,9 @@ private slots: void symbianNestedActiveSchedulerLoop(); void processEvents(); void exec(); + void reexec(); void exit(); + void execAfterExit(); void wakeUp(); void quit(); void processEventsExcludeSocket(); @@ -398,7 +404,9 @@ void tst_QEventLoop::exec() } { - // calling exec() after exit()/quit() should return immediately + // calling QEventLoop::exec() after a thread loop has exit()ed should return immediately + // Note: this behaviour differs from QCoreApplication and QEventLoop + // see tst_QCoreApplication::eventLoopExecAfterExit, tst_QEventLoop::reexec MultipleExecThread thread; // start thread and wait for checkpoint @@ -411,6 +419,8 @@ void tst_QEventLoop::exec() thread.cond.wakeOne(); thread.cond.wait(&thread.mutex); QVERIFY(spy.count() > 0); + int v = thread.result1; + QCOMPARE(v, 0); // exec should return immediately spy.clear(); @@ -418,6 +428,8 @@ void tst_QEventLoop::exec() thread.mutex.unlock(); thread.wait(); QCOMPARE(spy.count(), 0); + v = thread.result2; + QCOMPARE(v, -1); } { @@ -462,9 +474,32 @@ void tst_QEventLoop::exec() #endif } +void tst_QEventLoop::reexec() +{ + QEventLoop loop; + + // exec once + QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection); + QCOMPARE(loop.exec(), 0); + + // and again + QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection); + QCOMPARE(loop.exec(), 0); +} + void tst_QEventLoop::exit() { DEPENDS_ON(exec()); } +void tst_QEventLoop::execAfterExit() +{ + QEventLoop loop; + EventLoopExiter obj(&loop); + + QMetaObject::invokeMethod(&obj, "exit", Qt::QueuedConnection); + loop.exit(1); + QCOMPARE(loop.exec(), 0); +} + void tst_QEventLoop::wakeUp() { EventLoopThread thread; diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp index e6bf9ce..c7036e4 100644 --- a/tests/auto/qthread/tst_qthread.cpp +++ b/tests/auto/qthread/tst_qthread.cpp @@ -86,6 +86,7 @@ private slots: void start(); void terminate(); void quit(); + void execAfterQuit(); void wait(); void started(); void finished(); @@ -265,6 +266,34 @@ public: } }; +class ExecAfterQuitThreadHelper: public QObject +{ + Q_OBJECT + QThread *thr; +public: + ExecAfterQuitThreadHelper(QThread *thr) : thr(thr) {} +public slots: + void doIt() { thr->exit(0); } +}; + +class ExecAfterQuitThread: public QThread +{ +public: + int returnValue; + void run() + { + ExecAfterQuitThreadHelper obj(this); + + QMetaObject::invokeMethod(&obj, "doIt", Qt::QueuedConnection); + exit(1); + + // returnValue will be either 0 or 1, depending on which of the two + // above take effect. The correct value is 0, since exit(1) before + // exec() should have no effect + returnValue = exec(); + } +}; + tst_QThread::tst_QThread() { @@ -424,34 +453,52 @@ void tst_QThread::stackSize() void tst_QThread::exit() { - Exit_Thread thread; - thread.object = new Exit_Object; - thread.object->moveToThread(&thread); - thread.code = 42; - thread.result = 0; - QVERIFY(!thread.isFinished()); - QVERIFY(!thread.isRunning()); - QMutexLocker locker(&thread.mutex); - thread.start(); - QVERIFY(thread.isRunning()); - QVERIFY(!thread.isFinished()); - thread.cond.wait(locker.mutex()); - QVERIFY(thread.wait(five_minutes)); - QVERIFY(thread.isFinished()); - QVERIFY(!thread.isRunning()); - QCOMPARE(thread.result, thread.code); - delete thread.object; + { + Exit_Thread thread; + thread.object = new Exit_Object; + thread.object->moveToThread(&thread); + thread.code = 42; + thread.result = 0; + QVERIFY(!thread.isFinished()); + QVERIFY(!thread.isRunning()); - Exit_Thread thread2; - thread2.object = 0; - thread2.code = 53; - thread2.result = 0; - QMutexLocker locker2(&thread2.mutex); - thread2.start(); - thread2.exit(thread2.code); - thread2.cond.wait(locker2.mutex()); - QVERIFY(thread2.wait(five_minutes)); - QCOMPARE(thread2.result, thread2.code); + QMutexLocker locker(&thread.mutex); + thread.start(); + QVERIFY(thread.isRunning()); + QVERIFY(!thread.isFinished()); + // but the thread is not running the event loop yet (the mutex is locked) + + // start the event loop + thread.cond.wait(locker.mutex()); + + // the Exit_Object above will cause the thread to exit + QVERIFY(thread.wait(five_minutes)); + QVERIFY(thread.isFinished()); + QVERIFY(!thread.isRunning()); + QCOMPARE(thread.result, thread.code); + delete thread.object; + } + + { + Exit_Thread thread2; + thread2.object = 0; + thread2.code = 53; + thread2.result = 0; + QMutexLocker locker2(&thread2.mutex); + thread2.start(); + + // the mutex is locked, so the thread has *not* started running the event loop yet + // this will do nothing: + thread2.exit(thread2.code); + + // the thread will now start running + thread2.cond.wait(locker2.mutex()); + + // this will cause it to exit now + thread2.exit(++thread2.code); + QVERIFY(thread2.wait(five_minutes)); + QCOMPARE(thread2.result, thread2.code); + } } void tst_QThread::start() @@ -498,32 +545,59 @@ void tst_QThread::terminate() void tst_QThread::quit() { - Quit_Thread thread; - thread.object = new Quit_Object; - thread.object->moveToThread(&thread); - thread.result = -1; - QVERIFY(!thread.isFinished()); - QVERIFY(!thread.isRunning()); - QMutexLocker locker(&thread.mutex); - thread.start(); - QVERIFY(thread.isRunning()); - QVERIFY(!thread.isFinished()); - thread.cond.wait(locker.mutex()); - QVERIFY(thread.wait(five_minutes)); - QVERIFY(thread.isFinished()); - QVERIFY(!thread.isRunning()); - QCOMPARE(thread.result, 0); - delete thread.object; + // very similar to exit() above + { + Quit_Thread thread; + thread.object = new Quit_Object; + thread.object->moveToThread(&thread); + thread.result = -1; + QVERIFY(!thread.isFinished()); + QVERIFY(!thread.isRunning()); - Quit_Thread thread2; - thread2.object = 0; - thread2.result = -1; - QMutexLocker locker2(&thread2.mutex); - thread2.start(); - thread2.quit(); - thread2.cond.wait(locker2.mutex()); - QVERIFY(thread2.wait(five_minutes)); - QCOMPARE(thread2.result, 0); + // start the thread, but keep the event loop from starting + // (while the mutex is locked) + QMutexLocker locker(&thread.mutex); + thread.start(); + QVERIFY(thread.isRunning()); + QVERIFY(!thread.isFinished()); + + // unlock the mutex and let the event loop run + // the Quit_Object above will cause the thread to quit + thread.cond.wait(locker.mutex()); + QVERIFY(thread.wait(five_minutes)); + QVERIFY(thread.isFinished()); + QVERIFY(!thread.isRunning()); + QCOMPARE(thread.result, 0); + delete thread.object; + } + + { + Quit_Thread thread2; + thread2.object = 0; + thread2.result = -1; + + // start the thread, but keep the event loop from starting + // (while the mutex is locked) + QMutexLocker locker2(&thread2.mutex); + thread2.start(); + thread2.quit(); // does nothing, the event loop is not running! + + // unlock the mutex and let the event loop run + thread2.cond.wait(locker2.mutex()); + + // there's no Quit_Object so it won't quit on its own + thread2.quit(); + QVERIFY(thread2.wait(five_minutes)); + QCOMPARE(thread2.result, 0); + } +} + +void tst_QThread::execAfterQuit() +{ + ExecAfterQuitThread thread; + thread.start(); + QVERIFY(thread.wait()); + QCOMPARE(thread.returnValue, 0); } void tst_QThread::wait() @@ -994,8 +1068,17 @@ void tst_QThread::QTBUG15378_exitAndExec() Thread thread; thread.value = 0; thread.start(); - thread.exit(556); - thread.sem1.release(); //should exit the first loop + thread.exit(42); // will do nothing, this value should not appear + thread.sem1.release(); //should enter the first loop + + Exit_Object *exit_object = new Exit_Object; + exit_object->code = 556; + exit_object->thread = &thread; + QMetaObject::invokeMethod(exit_object, "slot", Qt::QueuedConnection); + exit_object->deleteLater(); + exit_object->moveToThread(&thread); // should exit the first loop + exit_object = 0; + thread.sem2.acquire(); int v = thread.value; QCOMPARE(v, 556); -- cgit v0.12 From e0489b905d6a31c7a904ca2b62a1e60cd12dba4f Mon Sep 17 00:00:00 2001 From: mread <qt-info@nokia.com> Date: Tue, 25 Jan 2011 14:29:41 +0000 Subject: Orientation control implementation for Symbian This used the orientation control QWidget attributes API from maemo5, and provides a simple implementation for Symbian. The essense of the implementation is that the latest setting of one of these QWidget orientation attributes will set the orientation for the whole app. Testing the attributes will return only the last attribute set, it will not return the app orientation state. A new task, QTBUG-16972, has been created to provide a more comprehensive implementation in the future. This may provide a more effective emulation of the maemo5 behaviour, or may incorporate further reaching concepts for QML rotations. Task-number: QTBUG-11785 Reviewed-by: Shane Kearns --- src/corelib/global/qnamespace.h | 13 ++++++++++--- src/gui/kernel/qt_s60_p.h | 2 ++ src/gui/kernel/qwidget.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 4f3a742..e492345 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -511,9 +511,16 @@ public: #if 0 // these values are reserved for Maemo5 - do not re-use them WA_Maemo5NonComposited = 126, WA_Maemo5StackedWindow = 127, - WA_Maemo5PortraitOrientation = 128, - WA_Maemo5LandscapeOrientation = 129, - WA_Maemo5AutoOrientation = 130, +#endif + + WA_LockPortraitOrientation = 128, + WA_LockLandscapeOrientation = 129, + WA_AutoOrientation = 130, + +#if 0 // these values are reserved for Maemo5 - do not re-use them + WA_Maemo5PortraitOrientation = WA_LockPortraitOrientation, + WA_Maemo5LandscapeOrientation = WA_LockLandscapeOrientation, + WA_Maemo5AutoOrientation = WA_AutoOrientation, WA_Maemo5ShowProgressIndicator = 131, #endif diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h index fdb35d5..40697bf 100644 --- a/src/gui/kernel/qt_s60_p.h +++ b/src/gui/kernel/qt_s60_p.h @@ -141,6 +141,7 @@ public: int supportsPremultipliedAlpha : 1; int avkonComponentsSupportTransparency : 1; int menuBeingConstructed : 1; + int orientationSet : 1; QApplication::QS60MainApplicationFactory s60ApplicationFactory; // typedef'ed pointer type static CEikButtonGroupContainer *cba; @@ -295,6 +296,7 @@ inline QS60Data::QS60Data() supportsPremultipliedAlpha(0), avkonComponentsSupportTransparency(0), menuBeingConstructed(0), + orientationSet(0), s60ApplicationFactory(0) #ifdef Q_OS_SYMBIAN ,s60InstalledTrapHandler(0) diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 9a76b0a..e542a59 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -124,6 +124,10 @@ #include "qtabwidget.h" // Needed in inTabWidget() #endif // QT_KEYPAD_NAVIGATION +#ifdef Q_WS_S60 +#include <aknappui.h> +#endif + // widget/widget data creation count //#define QWIDGET_EXTRA_DEBUG //#define ALIEN_DEBUG @@ -10810,6 +10814,42 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) d->registerTouchWindow(); #endif break; + case Qt::WA_LockPortraitOrientation: + case Qt::WA_LockLandscapeOrientation: + case Qt::WA_AutoOrientation: { + const Qt::WidgetAttribute orientations[3] = { + Qt::WA_LockPortraitOrientation, + Qt::WA_LockLandscapeOrientation, + Qt::WA_AutoOrientation + }; + + if (on) { + // We can only have one of these set at a time + for (int i = 0; i < 3; ++i) { + if (orientations[i] != attribute) + setAttribute_internal(orientations[i], false, data, d); + } + } + +#ifdef Q_WS_S60 + CAknAppUiBase* appUi = static_cast<CAknAppUiBase*>(CEikonEnv::Static()->EikAppUi()); + const CAknAppUiBase::TAppUiOrientation s60orientations[] = { + CAknAppUiBase::EAppUiOrientationPortrait, + CAknAppUiBase::EAppUiOrientationLandscape, + CAknAppUiBase::EAppUiOrientationAutomatic + }; + CAknAppUiBase::TAppUiOrientation s60orientation = CAknAppUiBase::EAppUiOrientationUnspecified; + for (int i = 0; i < 3; ++i) { + if (testAttribute(orientations[i])) { + s60orientation = s60orientations[i]; + break; + } + } + QT_TRAP_THROWING(appUi->SetOrientationL(s60orientation)); + S60->orientationSet = true; +#endif + break; + } default: break; } -- cgit v0.12 From c9d26aa99c8f2279b54e6bb7ea68f30608e7e02a Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Fri, 28 Jan 2011 09:19:58 +0100 Subject: Cocoa: fix qgraphicsview autotest Moving the cursor to the corner of the desktop (0, 0) will typically trigger things to happend in the OS, at least on Mac (spaces, synergy etc). So I changed those tests to move it to (1, 1) instead. The reason to move it to (0, 0) was just to get the mouse away from the window anyway. And second, it takes some time after using QCursor::setPos on Mac before the events from the move actually arrive. And many tests that use this function relies on this. So I introduces a little delay. This alone will fix a couble of tests. --- src/testlib/qtestmouse.h | 4 ++++ tests/auto/qgraphicsview/tst_qgraphicsview.cpp | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/testlib/qtestmouse.h b/src/testlib/qtestmouse.h index 35752b0..5abb019 100644 --- a/src/testlib/qtestmouse.h +++ b/src/testlib/qtestmouse.h @@ -107,7 +107,11 @@ namespace QTest break; case MouseMove: QCursor::setPos(widget->mapToGlobal(pos)); +#ifdef QT_MAC_USE_COCOA + QTest::qWait(20); +#else qApp->processEvents(); +#endif return; default: QTEST_ASSERT(false); diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp index aaff51e..f8fc5d0 100644 --- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp @@ -2967,7 +2967,7 @@ protected: void tst_QGraphicsView::task186827_deleteReplayedItem() { // make sure the mouse is not over the window, causing spontaneous mouse moves - QCursor::setPos(0, 0); + QCursor::setPos(1, 1); QGraphicsScene scene; scene.addRect(0, 0, 50, 50); @@ -4504,7 +4504,7 @@ void tst_QGraphicsView::hoverLeave() QVERIFY(item->receivedEnterEvent); QCOMPARE(item->enterWidget, view.viewport()); - QCursor::setPos(0,0); + QCursor::setPos(1,1); QTest::qWait(200); QVERIFY(item->receivedLeaveEvent); QCOMPARE(item->leaveWidget, view.viewport()); -- cgit v0.12 From ead20f4c1edc2e1c5c39f47bf7c9e56600d6362b Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Thu, 27 Jan 2011 16:29:52 +0100 Subject: Fix alignment issue causing crash in QtScript/JavaScriptCore When creating a substring, JSC::UStringImpl required that the base string pointer was 8-byte aligned. However, on platforms where FastMalloc isn't enabled (such as Symbian), it's possible that the system malloc() returns a pointer that is only 4-byte aligned. (On Symbian, this can happen if the argument to malloc() itself isn't a multiple of 8.) Cherry-picked http://trac.webkit.org/changeset/54743 from WebKit trunk, which fixes this issue. (The commit happened shortly after we rebased QtScript/JSC for 4.7, so it applies cleanly to our copy.) Task-number: QTBUG-16828 Reviewed-by: Simon Hausmann --- .../javascriptcore/JavaScriptCore/ChangeLog | 25 +++++ .../JavaScriptCore/runtime/UStringImpl.cpp | 14 +-- .../JavaScriptCore/runtime/UStringImpl.h | 117 ++++++++------------- src/3rdparty/javascriptcore/VERSION | 4 +- 4 files changed, 76 insertions(+), 84 deletions(-) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog index c2b1155..9cbf0c1 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog +++ b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog @@ -358,6 +358,31 @@ * wtf/AlwaysInline.h: +2010-02-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=33731 + Many false leaks in release builds due to PtrAndFlags + + Remove UntypedPtrAndBitfield (similar to PtrAndFlags) in UStringImpl, + and steal bits from the refCount instead. + + * runtime/UStringImpl.cpp: + (JSC::UStringImpl::baseSharedBuffer): + (JSC::UStringImpl::~UStringImpl): + * runtime/UStringImpl.h: + (JSC::UStringImpl::cost): + (JSC::UStringImpl::isIdentifier): + (JSC::UStringImpl::setIsIdentifier): + (JSC::UStringImpl::ref): + (JSC::UStringImpl::deref): + (JSC::UStringImpl::UStringImpl): + (JSC::UStringImpl::bufferOwnerString): + (JSC::UStringImpl::bufferOwnership): + (JSC::UStringImpl::isStatic): + (JSC::UStringImpl::): + 2010-02-12 Kwang Yul Seo <skyul@company100.net> Reviewed by Adam Barth. diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp index 4b0d1c9..4fde49e 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.cpp @@ -38,12 +38,14 @@ namespace JSC { SharedUChar* UStringImpl::baseSharedBuffer() { ASSERT((bufferOwnership() == BufferShared) - || ((bufferOwnership() == BufferOwned) && !m_dataBuffer.asPtr<void*>())); + || ((bufferOwnership() == BufferOwned) && !m_buffer)); - if (bufferOwnership() != BufferShared) - m_dataBuffer = UntypedPtrAndBitfield(SharedUChar::create(new OwnFastMallocPtr<UChar>(m_data)).releaseRef(), BufferShared); + if (bufferOwnership() != BufferShared) { + m_refCountAndFlags = (m_refCountAndFlags & ~s_refCountMaskBufferOwnership) | BufferShared; + m_bufferShared = SharedUChar::create(new OwnFastMallocPtr<UChar>(m_data)).releaseRef(); + } - return m_dataBuffer.asPtr<SharedUChar*>(); + return m_bufferShared; } SharedUChar* UStringImpl::sharedBuffer() @@ -71,10 +73,10 @@ UStringImpl::~UStringImpl() if (bufferOwnership() == BufferOwned) fastFree(m_data); else if (bufferOwnership() == BufferSubstring) - m_dataBuffer.asPtr<UStringImpl*>()->deref(); + m_bufferSubstring->deref(); else { ASSERT(bufferOwnership() == BufferShared); - m_dataBuffer.asPtr<SharedUChar*>()->deref(); + m_bufferShared->deref(); } } } diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h index 4e1ddc7..e6d1a8a 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/UStringImpl.h @@ -40,48 +40,6 @@ class IdentifierTable; typedef CrossThreadRefCounted<OwnFastMallocPtr<UChar> > SharedUChar; -class UntypedPtrAndBitfield { -public: - UntypedPtrAndBitfield() {} - - UntypedPtrAndBitfield(void* ptrValue, uintptr_t bitValue) - : m_value(reinterpret_cast<uintptr_t>(ptrValue) | bitValue) -#ifndef NDEBUG - , m_leaksPtr(ptrValue) -#endif - { - ASSERT(ptrValue == asPtr<void*>()); - ASSERT((*this & ~s_alignmentMask) == bitValue); - } - - template<typename T> - T asPtr() const { return reinterpret_cast<T>(m_value & s_alignmentMask); } - - UntypedPtrAndBitfield& operator&=(uintptr_t bits) - { - m_value &= bits | s_alignmentMask; - return *this; - } - - UntypedPtrAndBitfield& operator|=(uintptr_t bits) - { - m_value |= bits & ~s_alignmentMask; - return *this; - } - - uintptr_t operator&(uintptr_t mask) const - { - return m_value & mask & ~s_alignmentMask; - } - -private: - static const uintptr_t s_alignmentMask = ~static_cast<uintptr_t>(0x7); - uintptr_t m_value; -#ifndef NDEBUG - void* m_leaksPtr; // Only used to allow tools like leaks on OSX to detect that the memory is referenced. -#endif -}; - class UStringImpl : Noncopyable { public: template<size_t inlineCapacity> @@ -151,21 +109,27 @@ public: { // For substrings, return the cost of the base string. if (bufferOwnership() == BufferSubstring) - return m_dataBuffer.asPtr<UStringImpl*>()->cost(); + return m_bufferSubstring->cost(); - if (m_dataBuffer & s_reportedCostBit) + if (m_refCountAndFlags & s_refCountFlagHasReportedCost) return 0; - m_dataBuffer |= s_reportedCostBit; + m_refCountAndFlags |= s_refCountFlagHasReportedCost; return m_length; } unsigned hash() const { if (!m_hash) m_hash = computeHash(data(), m_length); return m_hash; } unsigned existingHash() const { ASSERT(m_hash); return m_hash; } // fast path for Identifiers void setHash(unsigned hash) { ASSERT(hash == computeHash(data(), m_length)); m_hash = hash; } // fast path for Identifiers - bool isIdentifier() const { return m_isIdentifier; } - void setIsIdentifier(bool isIdentifier) { m_isIdentifier = isIdentifier; } + bool isIdentifier() const { return m_refCountAndFlags & s_refCountFlagIsIdentifier; } + void setIsIdentifier(bool isIdentifier) + { + if (isIdentifier) + m_refCountAndFlags |= s_refCountFlagIsIdentifier; + else + m_refCountAndFlags &= ~s_refCountFlagIsIdentifier; + } - UStringImpl* ref() { m_refCount += s_refCountIncrement; return this; } - ALWAYS_INLINE void deref() { if (!(m_refCount -= s_refCountIncrement)) delete this; } + UStringImpl* ref() { m_refCountAndFlags += s_refCountIncrement; return this; } + ALWAYS_INLINE void deref() { m_refCountAndFlags -= s_refCountIncrement; if (!(m_refCountAndFlags & s_refCountMask)) delete this; } static void copyChars(UChar* destination, const UChar* source, unsigned numCharacters) { @@ -205,11 +169,10 @@ private: // Used to construct normal strings with an internal or external buffer. UStringImpl(UChar* data, int length, BufferOwnership ownership) : m_data(data) + , m_buffer(0) , m_length(length) - , m_refCount(s_refCountIncrement) + , m_refCountAndFlags(s_refCountIncrement | ownership) , m_hash(0) - , m_isIdentifier(false) - , m_dataBuffer(0, ownership) { ASSERT((ownership == BufferInternal) || (ownership == BufferOwned)); checkConsistency(); @@ -221,11 +184,10 @@ private: enum StaticStringConstructType { ConstructStaticString }; UStringImpl(UChar* data, int length, StaticStringConstructType) : m_data(data) + , m_buffer(0) , m_length(length) - , m_refCount(s_staticRefCountInitialValue) + , m_refCountAndFlags(s_refCountFlagStatic | BufferOwned) , m_hash(0) - , m_isIdentifier(false) - , m_dataBuffer(0, BufferOwned) { checkConsistency(); } @@ -233,28 +195,26 @@ private: // Used to create new strings that are a substring of an existing string. UStringImpl(UChar* data, int length, PassRefPtr<UStringImpl> base) : m_data(data) + , m_bufferSubstring(base.releaseRef()) , m_length(length) - , m_refCount(s_refCountIncrement) + , m_refCountAndFlags(s_refCountIncrement | BufferSubstring) , m_hash(0) - , m_isIdentifier(false) - , m_dataBuffer(base.releaseRef(), BufferSubstring) { // Do use static strings as a base for substrings; UntypedPtrAndBitfield assumes // that all pointers will be at least 8-byte aligned, we cannot guarantee that of // UStringImpls that are not heap allocated. - ASSERT(m_dataBuffer.asPtr<UStringImpl*>()->size()); - ASSERT(!m_dataBuffer.asPtr<UStringImpl*>()->isStatic()); + ASSERT(m_bufferSubstring->size()); + ASSERT(!m_bufferSubstring->isStatic()); checkConsistency(); } // Used to construct new strings sharing an existing shared buffer. UStringImpl(UChar* data, int length, PassRefPtr<SharedUChar> sharedBuffer) : m_data(data) + , m_bufferShared(sharedBuffer.releaseRef()) , m_length(length) - , m_refCount(s_refCountIncrement) + , m_refCountAndFlags(s_refCountIncrement | BufferShared) , m_hash(0) - , m_isIdentifier(false) - , m_dataBuffer(sharedBuffer.releaseRef(), BufferShared) { checkConsistency(); } @@ -277,26 +237,31 @@ private: // This number must be at least 2 to avoid sharing empty, null as well as 1 character strings from SmallStrings. static const int s_minLengthToShare = 10; static const unsigned s_copyCharsInlineCutOff = 20; - static const uintptr_t s_bufferOwnershipMask = 3; - static const uintptr_t s_reportedCostBit = 4; // We initialize and increment/decrement the refCount for all normal (non-static) strings by the value 2. // We initialize static strings with an odd number (specifically, 1), such that the refCount cannot reach zero. - static const int s_refCountIncrement = 2; - static const int s_staticRefCountInitialValue = 1; - - UStringImpl* bufferOwnerString() { return (bufferOwnership() == BufferSubstring) ? m_dataBuffer.asPtr<UStringImpl*>() : this; } - const UStringImpl* bufferOwnerString() const { return (bufferOwnership() == BufferSubstring) ? m_dataBuffer.asPtr<UStringImpl*>() : this; } + static const unsigned s_refCountMask = 0xFFFFFFF0; + static const int s_refCountIncrement = 0x20; + static const int s_refCountFlagStatic = 0x10; + static const unsigned s_refCountFlagHasReportedCost = 0x8; + static const unsigned s_refCountFlagIsIdentifier = 0x4; + static const unsigned s_refCountMaskBufferOwnership = 0x3; + + UStringImpl* bufferOwnerString() { return (bufferOwnership() == BufferSubstring) ? m_bufferSubstring : this; } + const UStringImpl* bufferOwnerString() const { return (bufferOwnership() == BufferSubstring) ? m_bufferSubstring : this; } SharedUChar* baseSharedBuffer(); - unsigned bufferOwnership() const { return m_dataBuffer & s_bufferOwnershipMask; } - bool isStatic() const { return m_refCount & 1; } + unsigned bufferOwnership() const { return m_refCountAndFlags & s_refCountMaskBufferOwnership; } + bool isStatic() const { return m_refCountAndFlags & s_refCountFlagStatic; } // unshared data UChar* m_data; + union { + void* m_buffer; + UStringImpl* m_bufferSubstring; + SharedUChar* m_bufferShared; + }; int m_length; - unsigned m_refCount; - mutable unsigned m_hash : 31; - mutable unsigned m_isIdentifier : 1; - UntypedPtrAndBitfield m_dataBuffer; + unsigned m_refCountAndFlags; + mutable unsigned m_hash; JS_EXPORTDATA static UStringImpl* s_null; JS_EXPORTDATA static UStringImpl* s_empty; diff --git a/src/3rdparty/javascriptcore/VERSION b/src/3rdparty/javascriptcore/VERSION index b4744b7..13943b2 100644 --- a/src/3rdparty/javascriptcore/VERSION +++ b/src/3rdparty/javascriptcore/VERSION @@ -4,8 +4,8 @@ This is a snapshot of JavaScriptCore from The commit imported was from the - javascriptcore-snapshot-24012011 branch/tag + javascriptcore-snapshot-27012011 branch/tag and has the sha1 checksum - d143bde5ae8cff229aebd43487a2fce5e713e990 + 3ab0f621048fbeb480b687a28ed31d92d8506150 -- cgit v0.12 From b127b1036ec75c625920a6c029b64a95e3702bf9 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Fri, 28 Jan 2011 10:10:31 +0100 Subject: Invalidate QScriptPrograms when engine is destroyed If the engine is destroyed before the program, the program must be invalidated; otherwise the program destructor will access a stale engine pointer, which can cause a crash (it crashes on Symbian, but "only" gives a Valgrind warning on Linux for our autotests). We need to keep track of all associated programs, just like we already do for values and strings. This fix follows the exact same pattern, but uses a QSet to keep the patch minimal. No new tests, but the evaluateProgram() test runs successfully on Symbian now, and there are no more Valgrind warnings. Task-number: QTBUG-16987 Reviewed-by: Olivier Goffart --- src/script/api/qscriptengine.cpp | 9 +++++++++ src/script/api/qscriptengine_p.h | 18 ++++++++++++++++++ src/script/api/qscriptprogram.cpp | 21 ++++++++++++++------- src/script/api/qscriptprogram_p.h | 1 + 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index 9e338d4..54039c0 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -1022,6 +1022,7 @@ QScriptEnginePrivate::~QScriptEnginePrivate() while (!ownedAgents.isEmpty()) delete ownedAgents.takeFirst(); + detachAllRegisteredScriptPrograms(); detachAllRegisteredScriptValues(); detachAllRegisteredScriptStrings(); qDeleteAll(m_qobjectData); @@ -1576,6 +1577,14 @@ bool QScriptEnginePrivate::scriptDisconnect(JSC::JSValue signal, JSC::JSValue re #endif +void QScriptEnginePrivate::detachAllRegisteredScriptPrograms() +{ + QSet<QScriptProgramPrivate*>::const_iterator it; + for (it = registeredScriptPrograms.constBegin(); it != registeredScriptPrograms.constEnd(); ++it) + (*it)->detachFromEngine(); + registeredScriptPrograms.clear(); +} + void QScriptEnginePrivate::detachAllRegisteredScriptValues() { QScriptValuePrivate *it; diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h index 05a8901..f8144e9 100644 --- a/src/script/api/qscriptengine_p.h +++ b/src/script/api/qscriptengine_p.h @@ -87,6 +87,7 @@ class QScriptEngineAgent; class QScriptEnginePrivate; class QScriptSyntaxCheckResult; class QScriptEngine; +class QScriptProgramPrivate; namespace QScript { @@ -273,6 +274,10 @@ public: static QScriptSyntaxCheckResult checkSyntax(const QString &program); static bool canEvaluate(const QString &program); + inline void registerScriptProgram(QScriptProgramPrivate *program); + inline void unregisterScriptProgram(QScriptProgramPrivate *program); + void detachAllRegisteredScriptPrograms(); + inline QScriptValuePrivate *allocateScriptValuePrivate(size_t); inline void freeScriptValuePrivate(QScriptValuePrivate *p); @@ -368,6 +373,7 @@ public: static const int maxFreeScriptValues = 256; int freeScriptValuesCount; QScriptStringPrivate *registeredScriptStrings; + QSet<QScriptProgramPrivate*> registeredScriptPrograms; QHash<int, QScriptTypeInfo*> m_typeInfos; int processEventsInterval; QScriptValue abortResult; @@ -566,6 +572,18 @@ inline QByteArray convertToLatin1(const JSC::UString &str) } // namespace QScript +inline void QScriptEnginePrivate::registerScriptProgram(QScriptProgramPrivate *program) +{ + Q_ASSERT(!registeredScriptPrograms.contains(program)); + registeredScriptPrograms.insert(program); +} + +inline void QScriptEnginePrivate::unregisterScriptProgram(QScriptProgramPrivate *program) +{ + Q_ASSERT(registeredScriptPrograms.contains(program)); + registeredScriptPrograms.remove(program); +} + inline QScriptValuePrivate *QScriptEnginePrivate::allocateScriptValuePrivate(size_t size) { if (freeScriptValues) { diff --git a/src/script/api/qscriptprogram.cpp b/src/script/api/qscriptprogram.cpp index da103bb..31af9a0 100644 --- a/src/script/api/qscriptprogram.cpp +++ b/src/script/api/qscriptprogram.cpp @@ -64,6 +64,7 @@ QScriptProgramPrivate::~QScriptProgramPrivate() if (engine) { QScript::APIShim shim(engine); _executable.clear(); + engine->unregisterScriptProgram(this); } } @@ -78,7 +79,10 @@ JSC::EvalExecutable *QScriptProgramPrivate::executable(JSC::ExecState *exec, if (_executable) { if (eng == engine) return _executable.get(); - _executable = 0; + // "Migrating" to another engine; clean up old state + QScript::APIShim shim(engine); + _executable.clear(); + engine->unregisterScriptProgram(this); } WTF::PassRefPtr<QScript::UStringSourceProviderWithFeedback> provider = QScript::UStringSourceProviderWithFeedback::create(sourceCode, fileName, firstLineNumber, eng); @@ -86,10 +90,19 @@ JSC::EvalExecutable *QScriptProgramPrivate::executable(JSC::ExecState *exec, JSC::SourceCode source(provider, firstLineNumber); //after construction of SourceCode provider variable will be null. _executable = JSC::EvalExecutable::create(exec, source); engine = eng; + engine->registerScriptProgram(this); isCompiled = false; return _executable.get(); } +void QScriptProgramPrivate::detachFromEngine() +{ + _executable.clear(); + sourceId = -1; + isCompiled = false; + engine = 0; +} + /*! Constructs a null QScriptProgram. */ @@ -122,9 +135,6 @@ QScriptProgram::QScriptProgram(const QScriptProgram &other) */ QScriptProgram::~QScriptProgram() { - // Q_D(QScriptProgram); - // if (d->engine && (d->ref == 1)) - // d->engine->unregisterScriptProgram(d); } /*! @@ -132,9 +142,6 @@ QScriptProgram::~QScriptProgram() */ QScriptProgram &QScriptProgram::operator=(const QScriptProgram &other) { - // if (d_func() && d_func()->engine && (d_func()->ref == 1)) - // d_func()->engine->unregisterScriptProgram(d_func()); - // } d_ptr = other.d_ptr; return *this; } diff --git a/src/script/api/qscriptprogram_p.h b/src/script/api/qscriptprogram_p.h index d2fd234..e7809ab 100644 --- a/src/script/api/qscriptprogram_p.h +++ b/src/script/api/qscriptprogram_p.h @@ -61,6 +61,7 @@ public: JSC::EvalExecutable *executable(JSC::ExecState *exec, QScriptEnginePrivate *engine); + void detachFromEngine(); QBasicAtomicInt ref; -- cgit v0.12 From 298b54b4fa99db47d62ec37eacefb4f419b79a69 Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Fri, 28 Jan 2011 11:12:50 +0100 Subject: Revert "Improve timer ID safety by using a serial counter per ID." This reverts commit 121e2b39043a4ffc6583f250aebb9a3a746076c1. It was considered too dangerous for 4.7. --- src/corelib/kernel/qabstracteventdispatcher.cpp | 30 +++++-------------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp index cc08f092..e79f87a 100644 --- a/src/corelib/kernel/qabstracteventdispatcher.cpp +++ b/src/corelib/kernel/qabstracteventdispatcher.cpp @@ -137,12 +137,6 @@ void QAbstractEventDispatcherPrivate::init() // free list). As an added protection, we use the cell to store an invalid // (negative) value that we can later check for integrity. // -// ABA prevention simply adds a value to 7 of the top 8 bits when resetting -// nextFreeTimerId. -// -// The extra code is the bucket allocation which allows us to start with a -// very small bucket size and grow as needed. -// // (continues below). int QAbstractEventDispatcherPrivate::allocateTimerId() { @@ -170,8 +164,6 @@ int QAbstractEventDispatcherPrivate::allocateTimerId() newTimerId = prepareNewValueWithSerialNumber(timerId, b[at]); } while (!nextFreeTimerId.testAndSetRelaxed(timerId, newTimerId)); - timerId &= TimerIdMask; - timerId |= b[at] & TimerSerialMask; b[at] = -timerId; return timerId; @@ -182,13 +174,12 @@ int QAbstractEventDispatcherPrivate::allocateTimerId() // X[timerId] = nextFreeTimerId; // then we update nextFreeTimerId to the timer we've just released // +// The extra code in allocateTimerId and releaseTimerId are ABA prevention +// and bucket memory. The buckets are simply to make sure we allocate only +// the necessary number of timers. See above. +// // ABA prevention simply adds a value to 7 of the top 8 bits when resetting // nextFreeTimerId. -// -// In addition to that, we update the same 7 bits in each entry in the bucket -// as a counter. That way, a timer ID allocated and released will always be -// returned with a different ID. This reduces the chances of timers being released -// erroneously by application code. void QAbstractEventDispatcherPrivate::releaseTimerId(int timerId) { int which = timerId & TimerIdMask; @@ -196,21 +187,12 @@ void QAbstractEventDispatcherPrivate::releaseTimerId(int timerId) int at = bucketIndex(bucket, which); int *b = timerIds[bucket]; -#ifndef QT_NO_DEBUG - // debug code - Q_ASSERT_X(timerId == -b[at], "QAbstractEventDispatcher::releaseTimerId", "Timer ID was not found, fix application"); -#else - if (timerId != -b[at]) { - // release code - qWarning("Timer ID %d was not found, fix application", timerId); - return; - } -#endif + Q_ASSERT(b[at] == -timerId); int freeId, newTimerId; do { freeId = nextFreeTimerId;//.loadAcquire(); // ### FIXME Proper memory ordering semantics - b[at] = prepareNewValueWithSerialNumber(-b[at], freeId); + b[at] = freeId & TimerIdMask; newTimerId = prepareNewValueWithSerialNumber(freeId, timerId); } while (!nextFreeTimerId.testAndSetRelease(freeId, newTimerId)); -- cgit v0.12 From 97503dfd7fad9c8023b2f9632e6ef865ccd0cad8 Mon Sep 17 00:00:00 2001 From: Jani Hautakangas <jani.hautakangas@nokia.com> Date: Fri, 28 Jan 2011 13:12:47 +0200 Subject: Fix typo in qglthreads auto test. Reviewed-by: TRUSTME --- tests/auto/qglthreads/tst_qglthreads.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/qglthreads/tst_qglthreads.cpp b/tests/auto/qglthreads/tst_qglthreads.cpp index 0bcc4f6..65bebb0 100644 --- a/tests/auto/qglthreads/tst_qglthreads.cpp +++ b/tests/auto/qglthreads/tst_qglthreads.cpp @@ -216,7 +216,7 @@ public: // That's why we create only small textures. width = 50; height = 20; -#else +#endif QImage image(width, height, QImage::Format_RGB32); QPainter p(&image); p.fillRect(image.rect(), QColor(rand() % 256, rand() % 256, rand() % 256)); -- cgit v0.12 From bdf3782b40b0fc2ebfda960be08c90b549cfd970 Mon Sep 17 00:00:00 2001 From: Simon Hausmann <simon.hausmann@nokia.com> Date: Fri, 28 Jan 2011 12:23:08 +0100 Subject: Fix potential networking crash due to null-pointer dereference An internal bug report suggests that we unconditionally dereference the backend pointer in QNetworkReplyImpl when checking for the synchronity of the originating request. The dereferencing code was introduced in commit ad1e82323225e996720136e8b2d669166b8d8441. Unfortunately the report does not detail where/how the crash happened, but it appears plausible that the backend pointer became null, and the surrounding code that has extra checks suggests this, too. In an attempt of defensive programming this patch introduces the missing check in the reported line 112 as well as in other places where it seems appropriate. Reviewed-by: Peter Hartmann --- src/network/access/qnetworkreplyimpl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index 9d7082c..343f344 100644 --- a/src/network/access/qnetworkreplyimpl.cpp +++ b/src/network/access/qnetworkreplyimpl.cpp @@ -109,7 +109,7 @@ void QNetworkReplyImplPrivate::_q_startOperation() } #endif - if (backend->isSynchronous()) { + if (backend && backend->isSynchronous()) { state = Finished; } else { if (state != Finished) { @@ -296,7 +296,7 @@ void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const // in QtWebKit. QVariant synchronousHttpAttribute = req.attribute( static_cast<QNetworkRequest::Attribute>(QNetworkRequest::DownloadBufferAttribute + 1)); - if (synchronousHttpAttribute.toBool()) { + if (backend && synchronousHttpAttribute.toBool()) { backend->setSynchronous(true); if (outgoingData && outgoingData->isSequential()) { outgoingDataBuffer = new QRingBuffer(); @@ -351,7 +351,7 @@ void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection); } #else - if (backend->isSynchronous()) + if (backend && backend->isSynchronous()) _q_startOperation(); else QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection); -- cgit v0.12 From 47ae1acdd9b6caaa8626e58fc97888dfdc821fe1 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@nokia.com> Date: Fri, 28 Jan 2011 13:36:27 +0100 Subject: Cocoa/Alien: fix qgraphicseffectsource autotest The test discovered a serious bug where we for alien widgets on mac returned a zero sized paintdevice. The reason is that we used to ask the nsview backing the widget for its size, but with alien, there where no such view. Very strange that this was not seen visually for any of the many applications tested. This patch does the same implementation strategy as found in QWidget::metric in qwidget_x11.cpp --- src/gui/kernel/qwidget_mac.mm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 1a1bb6e..3ba12cd 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4858,16 +4858,19 @@ int QWidget::metric(PaintDeviceMetric m) const case PdmWidthMM: return qRound(metric(PdmWidth) * 25.4 / qreal(metric(PdmDpiX))); case PdmHeight: - case PdmWidth: { + case PdmWidth: #ifndef QT_MAC_USE_COCOA - HIRect rect; + { HIRect rect; HIViewGetFrame(qt_mac_nativeview_for(this), &rect); -#else - NSRect rect = [qt_mac_nativeview_for(this) frame]; -#endif if(m == PdmWidth) return (int)rect.size.width; return (int)rect.size.height; } +#else + if (m == PdmWidth) + return data->crect.width(); + else + return data->crect.height(); +#endif case PdmDepth: return 32; case PdmNumColors: -- cgit v0.12 From be4d3182e48dcae70837f26d76dd449d914e8cb3 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen <miikka.heikkinen@digia.com> Date: Fri, 28 Jan 2011 16:32:33 +0200 Subject: Fix generated mif file cleaning in symbian-abld Mif file cleaning was incorrectly done at distclean phase. Task-number: QTBUG-16893 Reviewed-by: axis --- mkspecs/features/symbian/application_icon.prf | 2 +- qmake/generators/symbian/symmake_abld.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mkspecs/features/symbian/application_icon.prf b/mkspecs/features/symbian/application_icon.prf index b6be89b..06f5b31 100644 --- a/mkspecs/features/symbian/application_icon.prf +++ b/mkspecs/features/symbian/application_icon.prf @@ -71,7 +71,7 @@ contains(CONFIG, no_icon) { mifconv.depends = $$ICON PRE_TARGETDEPS += $$mifconv.target QMAKE_EXTRA_TARGETS += mifconv - QMAKE_DISTCLEAN += $$mifconv.target + QMAKE_CLEAN += $$mifconv.target } # Rules to use generated MIF file from symbian resources RSS_RULES.number_of_icons = $$size(ICON_backslashed) diff --git a/qmake/generators/symbian/symmake_abld.cpp b/qmake/generators/symbian/symmake_abld.cpp index 5729e26..b582257 100644 --- a/qmake/generators/symbian/symmake_abld.cpp +++ b/qmake/generators/symbian/symmake_abld.cpp @@ -190,6 +190,7 @@ void SymbianAbldMakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, bool t << "QMAKE = " << var("QMAKE_QMAKE") << endl; t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl; t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl; + t << "DEL_TREE = " << var("QMAKE_DEL_TREE") << endl; t << "MOVE = " << var("QMAKE_MOVE") << endl; t << "CHK_DIR_EXISTS = " << var("QMAKE_CHK_DIR_EXISTS") << endl; t << "MKDIR = " << var("QMAKE_MKDIR") << endl; @@ -329,7 +330,8 @@ void SymbianAbldMakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, bool // Note: EXTENSION_CLEAN will get called many times when doing reallyclean // This is why the "2> NUL" gets appended to generated clean targets in makefile.cpp. t << EXTENSION_CLEAN ": " COMPILER_CLEAN_TARGET << endl; - generateCleanCommands(t, dirsToClean, var("QMAKE_DEL_TREE"), "", "", ""); + generateCleanCommands(t, dirsToClean, "$(DEL_TREE)", "", "", ""); + generateCleanCommands(t, project->values("QMAKE_CLEAN"), "$(DEL_FILE)", "", "", ""); t << endl; t << PRE_TARGETDEPS_TARGET ":" -- cgit v0.12 From 05d8caa4c42b5539d993a898830307c21cb942b6 Mon Sep 17 00:00:00 2001 From: Carlos Manuel Duclos Vergara <carlos.duclos@nokia.com> Date: Fri, 28 Jan 2011 15:03:32 +0100 Subject: Incorrect comparison result in QString::locale The problem is that we are not able to set the locale in Symbian, therefore this test becomes unreliable since it depends on a particular locale being defined. We are disabling this test for now. Task-number: QTBUG-16921 Reviewed-by: Shane Kearns --- tests/auto/qstring/tst_qstring.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/auto/qstring/tst_qstring.cpp b/tests/auto/qstring/tst_qstring.cpp index 969521f..abc8d9a 100644 --- a/tests/auto/qstring/tst_qstring.cpp +++ b/tests/auto/qstring/tst_qstring.cpp @@ -4319,6 +4319,9 @@ void tst_QString::localeAwareCompare_data() void tst_QString::localeAwareCompare() { +#ifdef Q_OS_SYMBIAN + QSKIP("QTBUG-16921: There is no way to set up the system locale, so this test is not reliable in Symbian."); +#else #ifdef Q_OS_WIN # ifndef Q_OS_WINCE QSKIP("On others than Win CE, we cannot set the system or user locale.", SkipAll); @@ -4416,6 +4419,7 @@ void tst_QString::localeAwareCompare() if (!locale.isEmpty()) setlocale(LC_ALL, ""); #endif +#endif // Q_OS_SYMBIAN } void tst_QString::split_data() -- cgit v0.12 From ca1601ae78963fbaa668d82f63988ad7b41f23bc Mon Sep 17 00:00:00 2001 From: Yoann Lopes <yoann.lopes@nokia.com> Date: Mon, 31 Jan 2011 12:37:53 +0100 Subject: Fixes compilation when using FreeType on Symbian. --- src/declarative/declarative.pro | 7 +++++++ src/gui/kernel/qapplication_s60.cpp | 4 ++++ src/gui/text/qfontdatabase_s60.cpp | 2 ++ src/gui/text/text.pri | 2 +- src/opengl/opengl.pro | 7 +++++++ src/openvg/openvg.pro | 7 +++++++ 6 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro index 4ed4f9f..6bd314f 100644 --- a/src/declarative/declarative.pro +++ b/src/declarative/declarative.pro @@ -27,6 +27,13 @@ include(debugger/debugger.pri) symbian: { TARGET.UID3=0x2001E623 LIBS += -lefsrv + + contains(QT_CONFIG, freetype) { + DEFINES += QT_NO_FONTCONFIG + INCLUDEPATH += \ + ../3rdparty/freetype/src \ + ../3rdparty/freetype/include + } } DEFINES += QT_NO_OPENTYPE diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 3a70dd5..8b2412e 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -1616,7 +1616,9 @@ void qt_init(QApplicationPrivate * /* priv */, int) qRegisterMetaType<WId>("WId"); } +#ifdef QT_NO_FREETYPE extern void qt_cleanup_symbianFontDatabaseExtras(); // qfontdatabase_s60.cpp +#endif /***************************************************************************** qt_cleanup() - cleans up when the application is finished @@ -1633,7 +1635,9 @@ void qt_cleanup() QFontCache::cleanup(); // Has to happen now, since QFontEngineS60 has FBS handles QPixmapCache::clear(); // Has to happen now, since QS60PixmapData has FBS handles +#ifdef QT_NO_FREETYPE qt_cleanup_symbianFontDatabaseExtras(); +#endif // S60 structure and window server session are freed in eventdispatcher destructor as they are needed there // It's important that this happens here, before the event dispatcher gets diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp index 6ba035e..6d8d7c3 100644 --- a/src/gui/text/qfontdatabase_s60.cpp +++ b/src/gui/text/qfontdatabase_s60.cpp @@ -331,6 +331,7 @@ void QFontEngineMultiS60::loadEngine(int at) Q_ASSERT(engines[at]); } +#ifdef QT_NO_FREETYPE static bool addFontToScreenDevice(int screenDeviceFontIndex, const QSymbianFontDatabaseExtrasImplementation *dbExtras) { @@ -381,6 +382,7 @@ static bool addFontToScreenDevice(int screenDeviceFontIndex, family->writingSystems[system] = QtFontFamily::Supported; return true; } +#endif static void initializeDb() { diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri index daafdd9..d3e8f2d 100644 --- a/src/gui/text/text.pri +++ b/src/gui/text/text.pri @@ -147,8 +147,8 @@ symbian { text/qfontengine_s60.cpp HEADERS += \ text/qfontengine_s60_p.h - LIBS += -lfntstr -lecom } + LIBS += -lfntstr -lecom } !qpa { diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro index 8b587cf..08ae774 100644 --- a/src/opengl/opengl.pro +++ b/src/opengl/opengl.pro @@ -163,6 +163,13 @@ symbian { HEADERS += qgl_egl_p.h + contains(QT_CONFIG, freetype) { + DEFINES += QT_NO_FONTCONFIG + INCLUDEPATH += \ + ../3rdparty/freetype/src \ + ../3rdparty/freetype/include + } + symbian:TARGET.UID3 = 0x2002131A } diff --git a/src/openvg/openvg.pro b/src/openvg/openvg.pro index e7ed890..e185949 100644 --- a/src/openvg/openvg.pro +++ b/src/openvg/openvg.pro @@ -38,6 +38,13 @@ symbian { DEFINES += QVG_RECREATE_ON_SIZE_CHANGE QVG_BUFFER_SCROLLING QVG_SCISSOR_CLIP SOURCES += \ qvg_symbian.cpp + + contains(QT_CONFIG, freetype) { + DEFINES += QT_NO_FONTCONFIG + INCLUDEPATH += \ + ../3rdparty/freetype/src \ + ../3rdparty/freetype/include + } } include(../qbase.pri) -- cgit v0.12 From fd1190c75f05faa14aa84e65fa37b40d5a5fc2c5 Mon Sep 17 00:00:00 2001 From: Yoann Lopes <yoann.lopes@nokia.com> Date: Mon, 31 Jan 2011 13:54:18 +0100 Subject: Fixes lastResortFamily() on Symbian when using FreeType. It was previously always returning 'Series 60 Sans'. On Symbian^3 the default font can be 'Nokia Sans S60'. The patch makes sure the available one is returned. Reviewed-by: Alessandro Portale <alessandro.portale@nokia.com> --- src/gui/text/qfont_s60.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfont_s60.cpp b/src/gui/text/qfont_s60.cpp index c7d36ef..114191d 100644 --- a/src/gui/text/qfont_s60.cpp +++ b/src/gui/text/qfont_s60.cpp @@ -49,13 +49,14 @@ QT_BEGIN_NAMESPACE #ifdef QT_NO_FREETYPE Q_GLOBAL_STATIC(QMutex, lastResortFamilyMutex); +#endif // QT_NO_FREETYPE + extern QStringList qt_symbian_fontFamiliesOnFontServer(); // qfontdatabase_s60.cpp Q_GLOBAL_STATIC_WITH_INITIALIZER(QStringList, fontFamiliesOnFontServer, { // We are only interested in the initial font families. No Application fonts. // Therefore, we are allowed to cache the list. x->append(qt_symbian_fontFamiliesOnFontServer()); }); -#endif // QT_NO_FREETYPE QString QFont::lastResortFont() const { @@ -95,7 +96,20 @@ QString QFont::lastResortFamily() const const bool isJapaneseOrChineseSystem = User::Language() == ELangJapanese || User::Language() == ELangPrcChinese; - return QLatin1String(isJapaneseOrChineseSystem?"Heisei Kaku Gothic S60":"Series 60 Sans"); + static QString family; + if (family.isEmpty()) { + QStringList families = qt_symbian_fontFamiliesOnFontServer(); + const char* const preferredFamilies[] = {"Nokia Sans S60", "Series 60 Sans"}; + for (int i = 0; i < sizeof preferredFamilies / sizeof preferredFamilies[0]; ++i) { + const QString preferredFamily = QLatin1String(preferredFamilies[i]); + if (families.contains(preferredFamily)) { + family = preferredFamily; + break; + } + } + } + + return QLatin1String(isJapaneseOrChineseSystem?"Heisei Kaku Gothic S60":family.toLatin1()); #endif // QT_NO_FREETYPE } -- cgit v0.12 From 0e456bf74dfea10c0f5c164eb5a920e4661a91b2 Mon Sep 17 00:00:00 2001 From: Jarek Kobus <jkobus@trolltech.com> Date: Tue, 1 Feb 2011 13:15:28 +0100 Subject: Fix a crash when undoing form layout In a rare case when breaking a layout might make widgets overlap, the internal heuristic failed when recreating an original layout during undo. Some widgets were removed from the grid. The patch fixes this heuristic (makes sure we don't remove other widgets). Creating a form layout from overlapping widgets works better now. Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com> Task-number: QTCREATORBUG-3616 --- tools/designer/src/lib/shared/layout.cpp | 22 ++++++++++++++-------- tools/designer/src/lib/shared/qlayout_widget.cpp | 3 +-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/tools/designer/src/lib/shared/layout.cpp b/tools/designer/src/lib/shared/layout.cpp index c9ffe71..9fe438b 100644 --- a/tools/designer/src/lib/shared/layout.cpp +++ b/tools/designer/src/lib/shared/layout.cpp @@ -996,13 +996,23 @@ bool Grid::shrinkFormLayoutSpans() for (WidgetSet::const_iterator it = widgets.constBegin(); it != cend ; ++it) { QWidget *w = *it; int row, col, rowspan, colspan; - locateWidget(w, row, col, rowspan, colspan); + if (!locateWidget(w, row, col, rowspan, colspan)) + qDebug("ooops, widget '%s' does not fit in layout", w->objectName().toUtf8().constData()); const int maxColSpan = col == 0 ? 2 : 1; const int newColSpan = qMin(colspan, maxColSpan); const int newRowSpan = qMin(rowspan, maxRowSpan); if (newColSpan != colspan || newRowSpan != rowspan) { - setCells(QRect(col, row, colspan, rowspan), 0); - setCells(QRect(col, row, newColSpan, newRowSpan), w); + // in case like this: + // W1 W1 + // W1 W2 + // do: + // W1 0 + // 0 W2 + for (int i = row; i < row + rowspan - 1; i++) + for (int j = col; j < col + colspan - 1; j++) + if (i > row + newColSpan - 1 || j > col + newRowSpan - 1) + if (cell(i, j) == w) + setCell(i, j, 0); shrunk = true; } } @@ -1177,11 +1187,7 @@ void GridLayout<GridLikeLayout, LayoutType, GridMode>::doLayout() if (const Spacer *spacer = qobject_cast<const Spacer*>(w)) alignment = spacer->alignment(); - if (rs * cs == 1) { - addWidgetToGrid(layout, w, r, c, 1, 1, alignment); - } else { - addWidgetToGrid(layout, w, r, c, rs, cs, alignment); - } + addWidgetToGrid(layout, w, r, c, rs, cs, alignment); w->show(); } else { diff --git a/tools/designer/src/lib/shared/qlayout_widget.cpp b/tools/designer/src/lib/shared/qlayout_widget.cpp index 20db606..4debb5e 100644 --- a/tools/designer/src/lib/shared/qlayout_widget.cpp +++ b/tools/designer/src/lib/shared/qlayout_widget.cpp @@ -1181,8 +1181,7 @@ QRect LayoutHelper::itemInfo(QLayout *lt, const QWidget *widget) const } else { for (int c = 0; c < FormLayoutColumns; c++) { const QFormLayout::ItemRole role = c == 0 ? QFormLayout::LabelRole : QFormLayout::FieldRole; - if (widgets[c]) { - Q_ASSERT(BoxLayoutHelper::findItemOfWidget(items, widgets[c])); + if (widgets[c] && BoxLayoutHelper::findItemOfWidget(items, widgets[c])) { formLayout->setWidget(r, role, widgets[c]); } else { formLayout->setItem(r, role, createFormSpacer()); -- cgit v0.12 From 363d983f2f65e9b7bdc440d1c4f7b98fafc284bb Mon Sep 17 00:00:00 2001 From: Jedrzej Nowacki <jedrzej.nowacki@nokia.com> Date: Mon, 31 Jan 2011 11:16:17 +0200 Subject: Add new test to tst_QScriptContextInfo. Test checks comparison between two null contexts. Reviewed-by: Kent Hansen --- tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp b/tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp index aba16b2..89c5330 100644 --- a/tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp +++ b/tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp @@ -93,6 +93,7 @@ private slots: void qtPropertyFunction(); void nullContext(); void streaming(); + void comparison_null(); void assignmentAndComparison(); }; @@ -366,6 +367,13 @@ void tst_QScriptContextInfo::streaming() } } +void tst_QScriptContextInfo::comparison_null() +{ + QScriptContextInfo info1, info2, info3(0); + QCOMPARE(info1, info2); + QCOMPARE(info1, info3); +} + void tst_QScriptContextInfo::assignmentAndComparison() { QScriptEngine eng; -- cgit v0.12 From 70727b3cd373c66aa8a4883ca05a9eaf1f0a0d6d Mon Sep 17 00:00:00 2001 From: Jedrzej Nowacki <jedrzej.nowacki@nokia.com> Date: Tue, 1 Feb 2011 15:50:26 +0200 Subject: Refactoring of tst_QScriptEngine::automaticSemicolonInsertion test. Test shouldn't relay on error message, but on error type. Reviewed-by: Kent Hansen --- tests/auto/qscriptengine/tst_qscriptengine.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp index c4c53e9..956f06c 100644 --- a/tests/auto/qscriptengine/tst_qscriptengine.cpp +++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp @@ -3018,7 +3018,7 @@ void tst_QScriptEngine::automaticSemicolonInsertion() { QScriptValue ret = eng.evaluate("{ 1 2 } 3"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("SyntaxError: Parse error")); + QVERIFY(ret.toString().contains("SyntaxError")); } { QScriptValue ret = eng.evaluate("{ 1\n2 } 3"); @@ -3028,7 +3028,7 @@ void tst_QScriptEngine::automaticSemicolonInsertion() { QScriptValue ret = eng.evaluate("for (a; b\n)"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("SyntaxError: Parse error")); + QVERIFY(ret.toString().contains("SyntaxError")); } { QScriptValue ret = eng.evaluate("(function() { return\n1 + 2 })()"); @@ -3043,7 +3043,7 @@ void tst_QScriptEngine::automaticSemicolonInsertion() { QScriptValue ret = eng.evaluate("if (a > b)\nelse c = d"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("SyntaxError: Parse error")); + QVERIFY(ret.toString().contains("SyntaxError")); } { eng.evaluate("function c() { return { foo: function() { return 5; } } }"); @@ -3055,7 +3055,7 @@ void tst_QScriptEngine::automaticSemicolonInsertion() { QScriptValue ret = eng.evaluate("throw\n1"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("SyntaxError: Parse error")); + QVERIFY(ret.toString().contains("SyntaxError")); } { QScriptValue ret = eng.evaluate("a = Number(1)\n++a"); -- cgit v0.12 From bb84c5ef4f620af659395b66e6ed792a380b9a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@nokia.com> Date: Tue, 1 Feb 2011 15:17:53 +0100 Subject: Don't ignore source-text when generating qsTrId translations for QML Reviewed-by: ossi --- tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml | 3 +++ tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result | 5 +++++ tools/linguist/lupdate/qdeclarative.cpp | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml b/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml index 768a4e2..c966fa1 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml +++ b/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml @@ -93,5 +93,8 @@ QtObject { //: qsTrId() with comment, meta-data and plurals. //~ well-tested True qsTrId("qtn_bar_baz", 10); + + //% "Source text" + qsTrId("qtn_baz_biz"); } } diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result index 7dac8cb..4843902 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result @@ -27,6 +27,11 @@ </translation> <extra-well-tested>True</extra-well-tested> </message> + <message id="qtn_baz_biz"> + <location filename="main.qml" line="98"/> + <source>Source text</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>BarContext</name> diff --git a/tools/linguist/lupdate/qdeclarative.cpp b/tools/linguist/lupdate/qdeclarative.cpp index b85b1a7..1c1e9ad 100644 --- a/tools/linguist/lupdate/qdeclarative.cpp +++ b/tools/linguist/lupdate/qdeclarative.cpp @@ -225,7 +225,7 @@ protected: const QString id = literal->value->asString(); bool plural = node->arguments->next; - TranslatorMessage msg(QString(), QString(), + TranslatorMessage msg(QString(), sourcetext, QString(), QString(), m_fileName, node->firstSourceLocation().startLine, QStringList(), TranslatorMessage::Unfinished, plural); -- cgit v0.12 From 9fa392cdb528db0bb5073892484c809e99ae27b3 Mon Sep 17 00:00:00 2001 From: Olivier Goffart <olivier.goffart@nokia.com> Date: Wed, 2 Feb 2011 09:27:53 +0100 Subject: Revert "Restore Qt 4.6 behaviour: exec() always enters the event loop." This reverts commit 2e72a8b19ea6c674fb4777860dac50faa5d387e6. The behavour in Qt 4.6 was wrong. And even if it was not documented, it is too late to change the behaviour back at this point. The tests for QEventLoop and QCoreApplication have not been reverted Reviewed-by: Brad --- src/corelib/thread/qthread.cpp | 5 +- tests/auto/qthread/tst_qthread.cpp | 191 +++++++++++-------------------------- 2 files changed, 58 insertions(+), 138 deletions(-) diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index f4bfa5d..f368192 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -482,7 +482,10 @@ int QThread::exec() Q_D(QThread); QMutexLocker locker(&d->mutex); d->data->quitNow = false; - d->exited = false; + if (d->exited) { + d->exited = false; + return d->returnCode; + } locker.unlock(); QEventLoop eventLoop; diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp index c7036e4..e6bf9ce 100644 --- a/tests/auto/qthread/tst_qthread.cpp +++ b/tests/auto/qthread/tst_qthread.cpp @@ -86,7 +86,6 @@ private slots: void start(); void terminate(); void quit(); - void execAfterQuit(); void wait(); void started(); void finished(); @@ -266,34 +265,6 @@ public: } }; -class ExecAfterQuitThreadHelper: public QObject -{ - Q_OBJECT - QThread *thr; -public: - ExecAfterQuitThreadHelper(QThread *thr) : thr(thr) {} -public slots: - void doIt() { thr->exit(0); } -}; - -class ExecAfterQuitThread: public QThread -{ -public: - int returnValue; - void run() - { - ExecAfterQuitThreadHelper obj(this); - - QMetaObject::invokeMethod(&obj, "doIt", Qt::QueuedConnection); - exit(1); - - // returnValue will be either 0 or 1, depending on which of the two - // above take effect. The correct value is 0, since exit(1) before - // exec() should have no effect - returnValue = exec(); - } -}; - tst_QThread::tst_QThread() { @@ -453,52 +424,34 @@ void tst_QThread::stackSize() void tst_QThread::exit() { - { - Exit_Thread thread; - thread.object = new Exit_Object; - thread.object->moveToThread(&thread); - thread.code = 42; - thread.result = 0; - QVERIFY(!thread.isFinished()); - QVERIFY(!thread.isRunning()); - - QMutexLocker locker(&thread.mutex); - thread.start(); - QVERIFY(thread.isRunning()); - QVERIFY(!thread.isFinished()); - // but the thread is not running the event loop yet (the mutex is locked) - - // start the event loop - thread.cond.wait(locker.mutex()); - - // the Exit_Object above will cause the thread to exit - QVERIFY(thread.wait(five_minutes)); - QVERIFY(thread.isFinished()); - QVERIFY(!thread.isRunning()); - QCOMPARE(thread.result, thread.code); - delete thread.object; - } + Exit_Thread thread; + thread.object = new Exit_Object; + thread.object->moveToThread(&thread); + thread.code = 42; + thread.result = 0; + QVERIFY(!thread.isFinished()); + QVERIFY(!thread.isRunning()); + QMutexLocker locker(&thread.mutex); + thread.start(); + QVERIFY(thread.isRunning()); + QVERIFY(!thread.isFinished()); + thread.cond.wait(locker.mutex()); + QVERIFY(thread.wait(five_minutes)); + QVERIFY(thread.isFinished()); + QVERIFY(!thread.isRunning()); + QCOMPARE(thread.result, thread.code); + delete thread.object; - { - Exit_Thread thread2; - thread2.object = 0; - thread2.code = 53; - thread2.result = 0; - QMutexLocker locker2(&thread2.mutex); - thread2.start(); - - // the mutex is locked, so the thread has *not* started running the event loop yet - // this will do nothing: - thread2.exit(thread2.code); - - // the thread will now start running - thread2.cond.wait(locker2.mutex()); - - // this will cause it to exit now - thread2.exit(++thread2.code); - QVERIFY(thread2.wait(five_minutes)); - QCOMPARE(thread2.result, thread2.code); - } + Exit_Thread thread2; + thread2.object = 0; + thread2.code = 53; + thread2.result = 0; + QMutexLocker locker2(&thread2.mutex); + thread2.start(); + thread2.exit(thread2.code); + thread2.cond.wait(locker2.mutex()); + QVERIFY(thread2.wait(five_minutes)); + QCOMPARE(thread2.result, thread2.code); } void tst_QThread::start() @@ -545,59 +498,32 @@ void tst_QThread::terminate() void tst_QThread::quit() { - // very similar to exit() above - { - Quit_Thread thread; - thread.object = new Quit_Object; - thread.object->moveToThread(&thread); - thread.result = -1; - QVERIFY(!thread.isFinished()); - QVERIFY(!thread.isRunning()); - - // start the thread, but keep the event loop from starting - // (while the mutex is locked) - QMutexLocker locker(&thread.mutex); - thread.start(); - QVERIFY(thread.isRunning()); - QVERIFY(!thread.isFinished()); - - // unlock the mutex and let the event loop run - // the Quit_Object above will cause the thread to quit - thread.cond.wait(locker.mutex()); - QVERIFY(thread.wait(five_minutes)); - QVERIFY(thread.isFinished()); - QVERIFY(!thread.isRunning()); - QCOMPARE(thread.result, 0); - delete thread.object; - } - - { - Quit_Thread thread2; - thread2.object = 0; - thread2.result = -1; - - // start the thread, but keep the event loop from starting - // (while the mutex is locked) - QMutexLocker locker2(&thread2.mutex); - thread2.start(); - thread2.quit(); // does nothing, the event loop is not running! - - // unlock the mutex and let the event loop run - thread2.cond.wait(locker2.mutex()); - - // there's no Quit_Object so it won't quit on its own - thread2.quit(); - QVERIFY(thread2.wait(five_minutes)); - QCOMPARE(thread2.result, 0); - } -} - -void tst_QThread::execAfterQuit() -{ - ExecAfterQuitThread thread; + Quit_Thread thread; + thread.object = new Quit_Object; + thread.object->moveToThread(&thread); + thread.result = -1; + QVERIFY(!thread.isFinished()); + QVERIFY(!thread.isRunning()); + QMutexLocker locker(&thread.mutex); thread.start(); - QVERIFY(thread.wait()); - QCOMPARE(thread.returnValue, 0); + QVERIFY(thread.isRunning()); + QVERIFY(!thread.isFinished()); + thread.cond.wait(locker.mutex()); + QVERIFY(thread.wait(five_minutes)); + QVERIFY(thread.isFinished()); + QVERIFY(!thread.isRunning()); + QCOMPARE(thread.result, 0); + delete thread.object; + + Quit_Thread thread2; + thread2.object = 0; + thread2.result = -1; + QMutexLocker locker2(&thread2.mutex); + thread2.start(); + thread2.quit(); + thread2.cond.wait(locker2.mutex()); + QVERIFY(thread2.wait(five_minutes)); + QCOMPARE(thread2.result, 0); } void tst_QThread::wait() @@ -1068,17 +994,8 @@ void tst_QThread::QTBUG15378_exitAndExec() Thread thread; thread.value = 0; thread.start(); - thread.exit(42); // will do nothing, this value should not appear - thread.sem1.release(); //should enter the first loop - - Exit_Object *exit_object = new Exit_Object; - exit_object->code = 556; - exit_object->thread = &thread; - QMetaObject::invokeMethod(exit_object, "slot", Qt::QueuedConnection); - exit_object->deleteLater(); - exit_object->moveToThread(&thread); // should exit the first loop - exit_object = 0; - + thread.exit(556); + thread.sem1.release(); //should exit the first loop thread.sem2.acquire(); int v = thread.value; QCOMPARE(v, 556); -- cgit v0.12 From 216b29f0c976405c718c7bb8e24699d368baac7e Mon Sep 17 00:00:00 2001 From: Olivier Goffart <olivier.goffart@nokia.com> Date: Wed, 2 Feb 2011 10:03:51 +0100 Subject: document that QThread::exit will exit future event loops Reviewed-by: Brad --- src/corelib/thread/qthread.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index f368192..8223cff 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -509,10 +509,12 @@ int QThread::exec() Note that unlike the C library function of the same name, this function \e does return to the caller -- it is event processing - that stops. - - This function does nothing if the thread does not have an event - loop. + that stops. + + No QEventLoops will be started anymore in this thread until + QThread::exec() has been called again. If the eventloop in QThread::exec() + is not running then the next call to QThread::exec() will also return + immediately. \sa quit() QEventLoop */ -- cgit v0.12 From 186a9f967394d554ce99b8a3313cbc679b54c7c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com> Date: Tue, 1 Feb 2011 17:12:11 +0100 Subject: Fixed es2 configure when both EGL/egl.h and GLES/egl.h are present. Change e0c2861976e06658a1d651941310407c15b0bcde fixed es1 configure by only picking EGL/egl.h if GLES/egl.h is not found. This broke es2 configure on platforms where both EGL/egl.h and GLES/egl.h are present, by picking GLES/egl.h instead of EGL/egl.h, which implicitly pulled in the GLES/gl.h header as well, causing inconsistent declarations due to both GLES2/gl2.h and GLES/gl.h getting included. Instead, we need to prioritize depending on whether we're using es1 or es2. For es1, we prefer GLES/egl.h, and for es2, we prefer EGL/egl.h. If only one of the headers is found we still use it unconditionally, to preserve the existing behaviour and minimize the risk of breaking other platforms. Reviewed-by: Ritt Konstantin Reviewed-by: Marius Storm-Olsen --- configure | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/configure b/configure index dfbf9bd..5e8ef17 100755 --- a/configure +++ b/configure @@ -6056,19 +6056,28 @@ if [ "$PLATFORM_QWS" = "yes" ]; then fi # QWS +EGL_VARIANT=none # EGL Support if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then if [ "$CFG_EGL" != "no" ]; then # detect EGL support - if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl4gles1" "EGL (GLES/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then - # EGL specified by QMAKE_*_EGL, included with <GLES/egl.h> - CFG_EGL=yes - CFG_EGL_GLES_INCLUDES=yes - elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl" "EGL (EGL/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then + if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl" "EGL (EGL/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then # EGL specified by QMAKE_*_EGL, included with <EGL/egl.h> + EGL_VARIANT=regular CFG_EGL=yes - CFG_EGL_GLES_INCLUDES=no - else + fi + + # Prefer this variant for ES1 + if [ "$CFG_OPENGL" = "es1" -o "$EGL_VARIANT" = "none" ]; then + if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl4gles1" "EGL (GLES/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then + # EGL specified by QMAKE_*_EGL, included with <GLES/egl.h> + EGL_VARIANT=gles + CFG_EGL=yes + CFG_EGL_GLES_INCLUDES=yes + fi + fi + + if [ "$EGL_VARIANT" = "none" ]; then if [ "$CFG_EGL" = "yes" ]; then echo "The EGL functionality test failed!" echo " EGL is required for OpenGL ES to manage contexts & surfaces." -- cgit v0.12 From 5ad8cd48a1ed3be183c0af8698491b039f0054e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com> Date: Tue, 1 Feb 2011 17:59:54 +0100 Subject: Prevent recursion when creating window surface. If we can't access the qt_gl_share_widget() we should just create a raster window surface. This might happen when creating the share widget itself leads to creation of a window surface (which isn't really going to be used anyways). Reviewed-by: Michael Dominic K --- src/plugins/graphicssystems/meego/qmeegographicssystem.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp index 20b092e..a70d232 100644 --- a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp +++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp @@ -42,6 +42,7 @@ #include <QDebug> #include <private/qpixmap_raster_p.h> #include <private/qwindowsurface_gl_p.h> +#include <private/qwindowsurface_raster_p.h> #include <private/qegl_p.h> #include <private/qglextensions_p.h> #include <private/qgl_p.h> @@ -75,7 +76,12 @@ QMeeGoGraphicsSystem::~QMeeGoGraphicsSystem() QWindowSurface* QMeeGoGraphicsSystem::createWindowSurface(QWidget *widget) const { - QGLShareContextScope ctx(qt_gl_share_widget()->context()); + QGLWidget *shareWidget = qt_gl_share_widget(); + + if (!shareWidget) + return new QRasterWindowSurface(widget); + + QGLShareContextScope ctx(shareWidget->context()); QMeeGoGraphicsSystem::surfaceWasCreated = true; QWindowSurface *surface = new QGLWindowSurface(widget); -- cgit v0.12 From 4d38013cfc3058e36de1b6a6c20653ef2688a92b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com> Date: Tue, 1 Feb 2011 17:57:10 +0100 Subject: Fixed missing text when using static text items in GL 2 engine. When the context is destroyed and recreated, we end up with a new glyph cache, but we only recreate the vertex arrays for the very first static text item. We need to keep track of the glyph cache in each text item, so that we can recreate the vertex arrays and re-populate the cache accordingly. As the pointer might be the same after the glyph cache is recreated, we need to use serial numbers instead. We also need to re-create the cache when the context pointer has been invalidated, so that the static text items also get invalidated, and the texture glyph cache gets repopulated. Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp | 13 ++++++++----- src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp | 3 +++ src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h | 3 +++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index ad2852e..cda31e5 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -1489,7 +1489,7 @@ namespace { { public: QOpenGLStaticTextUserData() - : QStaticTextUserData(OpenGLUserData), cacheSize(0, 0) + : QStaticTextUserData(OpenGLUserData), cacheSize(0, 0), cacheSerialNumber(0) { } @@ -1501,6 +1501,7 @@ namespace { QGL2PEXVertexArray vertexCoordinateArray; QGL2PEXVertexArray textureCoordinateArray; QFontEngineGlyphCache::Type glyphType; + int cacheSerialNumber; }; } @@ -1518,12 +1519,10 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp QGLTextureGlyphCache *cache = (QGLTextureGlyphCache *) staticTextItem->fontEngine()->glyphCache(ctx, glyphType, QTransform()); - if (!cache || cache->cacheType() != glyphType) { + if (!cache || cache->cacheType() != glyphType || cache->context() == 0) { cache = new QGLTextureGlyphCache(ctx, glyphType, QTransform()); staticTextItem->fontEngine()->setGlyphCache(ctx, cache); recreateVertexArrays = true; - } else if (cache->context() == 0) { // Old context has been destroyed, new context has same ptr value - cache->setContext(ctx); } if (staticTextItem->userDataNeedsUpdate) { @@ -1534,8 +1533,11 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp recreateVertexArrays = true; } else { QOpenGLStaticTextUserData *userData = static_cast<QOpenGLStaticTextUserData *>(staticTextItem->userData()); - if (userData->glyphType != glyphType) + if (userData->glyphType != glyphType) { recreateVertexArrays = true; + } else if (userData->cacheSerialNumber != cache->serialNumber()) { + recreateVertexArrays = true; + } } // We only need to update the cache with new glyphs if we are actually going to recreate the vertex arrays. @@ -1580,6 +1582,7 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp } userData->glyphType = glyphType; + userData->cacheSerialNumber = cache->serialNumber(); // Use cache if backend optimizations is turned on vertexCoordinates = &userData->vertexCoordinateArray; diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp index 58c78ec..312d66f 100644 --- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp +++ b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp @@ -52,12 +52,15 @@ QT_BEGIN_NAMESPACE extern Q_GUI_EXPORT bool qt_cleartype_enabled; #endif +QBasicAtomicInt qgltextureglyphcache_serial_number = Q_BASIC_ATOMIC_INITIALIZER(1); + QGLTextureGlyphCache::QGLTextureGlyphCache(QGLContext *context, QFontEngineGlyphCache::Type type, const QTransform &matrix) : QImageTextureGlyphCache(type, matrix) , ctx(0) , m_width(0) , m_height(0) , m_filterMode(Nearest) + , m_serialNumber(qgltextureglyphcache_serial_number.fetchAndAddRelaxed(1)) { setContext(context); } diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h b/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h index 1c1b7c4..2eb4e65 100644 --- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h +++ b/src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h @@ -83,6 +83,8 @@ public: inline void setPaintEnginePrivate(QGL2PaintEngineExPrivate *p) { pex = p; } + inline int serialNumber() const { return m_serialNumber; } + enum FilterMode { Nearest, Linear @@ -140,6 +142,7 @@ private: QGLShaderProgram *m_program; FilterMode m_filterMode; + int m_serialNumber; }; QT_END_NAMESPACE -- cgit v0.12 From 31492cc049a8dfe7f52748922a88f117499d62a3 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko <denis.dzyubenko@nokia.com> Date: Wed, 26 Jan 2011 08:43:34 +0100 Subject: Fixes memory leaks in QX11Embed We should XFree the values returned from XGetWindowProperty. Task-number: QTBUG-16597 Reviewed-by: Ritt Konstantin --- src/gui/kernel/qx11embed_x11.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qx11embed_x11.cpp b/src/gui/kernel/qx11embed_x11.cpp index aba42f2..710f607 100644 --- a/src/gui/kernel/qx11embed_x11.cpp +++ b/src/gui/kernel/qx11embed_x11.cpp @@ -415,8 +415,9 @@ static Bool functor(Display *display, XEvent *event, XPointer arg) status = XGetWindowProperty(display, data->id, ATOM(WM_STATE), 0, 2, False, ATOM(WM_STATE), &ret, &format, &nitems, &after, &retval ); if (status == Success && ret == ATOM(WM_STATE) && format == 32 && nitems > 0) { - long *state = (long *)retval; - if (state[0] == WithdrawnState) { + long state = *(long *)retval; + XFree(retval); + if (state == WithdrawnState) { data->clearedWmState = true; return true; } @@ -833,6 +834,8 @@ bool QX11EmbedWidget::x11Event(XEvent *event) XUnmapWindow(x11Info().display(), internalWinId()); } } + if (prop_return) + XFree(prop_return); } } -- cgit v0.12 From 17ee918b2cd2bb012a538b721bbd888677072614 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko <denis.dzyubenko@nokia.com> Date: Wed, 2 Feb 2011 12:54:20 +0100 Subject: Carefull free the data from XGetWindowProperty on X11. Make sure we free the data correctly in case of error. Task-number: QTBUG-16616 Patch-by: Juuso Pakarinen Reviewed-by: Ritt Konstantin --- src/gui/kernel/qwidget_x11.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp index 9893478..28eb3f0 100644 --- a/src/gui/kernel/qwidget_x11.cpp +++ b/src/gui/kernel/qwidget_x11.cpp @@ -444,6 +444,7 @@ static QVector<Atom> getNetWmState(QWidget *w) && actualType == XA_ATOM && actualFormat == 32) { returnValue.resize(bytesLeft / 4); XFree((char*) propertyData); + propertyData = 0; // fetch all data if (XGetWindowProperty(X11->display, w->internalWinId(), ATOM(_NET_WM_STATE), 0, @@ -458,7 +459,8 @@ static QVector<Atom> getNetWmState(QWidget *w) if (!returnValue.isEmpty()) { memcpy(returnValue.data(), propertyData, returnValue.size() * sizeof(Atom)); } - XFree((char*) propertyData); + if (propertyData) + XFree((char*) propertyData); } return returnValue; -- cgit v0.12 From 7987d4cfd3ce86c20a55b5661a5221f12246b27e Mon Sep 17 00:00:00 2001 From: Olivier Goffart <olivier.goffart@nokia.com> Date: Wed, 2 Feb 2011 11:31:20 +0100 Subject: Fix QMutex can deadlock when calling tryLock in the unix code, if the QMutexPrivate::wait() with a timeout expires in the same moment that the mutex is released, wakeup would be set, but would be then ignored. (reset to false quickly after) If we waken up between the timeout and the re-aquisition of the internal mutex, we consider that the mutex has been locked. Reviewed-by: brad Task-number: QTBUG-16115 --- src/corelib/thread/qmutex_unix.cpp | 5 ++++- tests/auto/qmutex/tst_qmutex.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/corelib/thread/qmutex_unix.cpp b/src/corelib/thread/qmutex_unix.cpp index 41d87a7..dd7e5d1 100644 --- a/src/corelib/thread/qmutex_unix.cpp +++ b/src/corelib/thread/qmutex_unix.cpp @@ -94,8 +94,11 @@ bool QMutexPrivate::wait(int timeout) errorCode = pthread_cond_timedwait(&cond, &mutex, &ti); } if (errorCode) { - if (errorCode == ETIMEDOUT) + if (errorCode == ETIMEDOUT) { + if (wakeup) + errorCode = 0; break; + } report_error(errorCode, "QMutex::lock()", "cv wait"); } } diff --git a/tests/auto/qmutex/tst_qmutex.cpp b/tests/auto/qmutex/tst_qmutex.cpp index 3c4c767..ea983cb 100644 --- a/tests/auto/qmutex/tst_qmutex.cpp +++ b/tests/auto/qmutex/tst_qmutex.cpp @@ -67,6 +67,7 @@ private slots: void lock_unlock_locked_tryLock(); void stressTest(); void tryLockRace(); + void qtbug16115_trylock(); }; static const int iterations = 100; @@ -464,5 +465,42 @@ void tst_QMutex::tryLockRace() TryLockRaceThread::mutex.unlock(); } +static volatile int qtbug16115_trylock_counter; + +void tst_QMutex::qtbug16115_trylock() +{ + //Used to deadlock on unix + struct TrylockThread : QThread { + TrylockThread(QMutex &mut) : mut(mut) {} + QMutex &mut; + void run() { + for (int i = 0; i < 1000000; ++i) { + if (mut.tryLock(0)) { + Q_ASSERT((++qtbug16115_trylock_counter) == 1); + Q_ASSERT((--qtbug16115_trylock_counter) == 0); + mut.unlock(); + } + } + } + }; + QMutex mut; + TrylockThread t1(mut); + TrylockThread t2(mut); + TrylockThread t3(mut); + t1.start(); + t2.start(); + t3.start(); + + for (int i = 0; i < 1000000; ++i) { + mut.lock(); + Q_ASSERT((++qtbug16115_trylock_counter) == 1); + Q_ASSERT((--qtbug16115_trylock_counter) == 0); + mut.unlock(); + } + t1.wait(); + t2.wait(); + t3.wait(); +} + QTEST_MAIN(tst_QMutex) #include "tst_qmutex.moc" -- cgit v0.12 From bb6d0f75d4a5d3dadb5e0134aa0270bcab61f205 Mon Sep 17 00:00:00 2001 From: kranthi <kranthi.kumar-kuntala@nokia.com> Date: Wed, 2 Feb 2011 16:57:45 +0200 Subject: Fix for QTBUG-17035 Reviewed-by: Aaron McCarthy Task-number: QTBUG-17035 --- src/plugins/bearer/icd/qnetworksession_impl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/bearer/icd/qnetworksession_impl.cpp b/src/plugins/bearer/icd/qnetworksession_impl.cpp index 6d578d3..af5d85e 100644 --- a/src/plugins/bearer/icd/qnetworksession_impl.cpp +++ b/src/plugins/bearer/icd/qnetworksession_impl.cpp @@ -125,9 +125,6 @@ static QString get_network_interface(); void QNetworkSessionPrivateImpl::iapStateChanged(const QString& iapid, uint icd_connection_state) { - if ((publicConfig.type() == QNetworkConfiguration::UserChoice) && opened) { - updateIdentifier(iapid); - } if (((publicConfig.type() == QNetworkConfiguration::UserChoice) && (activeConfig.identifier() == iapid)) || @@ -149,6 +146,9 @@ void QNetworkSessionPrivateImpl::iapStateChanged(const QString& iapid, uint icd_ break; } } + if (publicConfig.type() == QNetworkConfiguration::UserChoice) { + updateIdentifier(iapid); + } } void QNetworkSessionPrivateImpl::cleanupSession(void) -- cgit v0.12 From a6167267d302b97b94fd350df4b27dc7c9a20ef4 Mon Sep 17 00:00:00 2001 From: Bernhard Rosenkraenzer <br@blankpage.ch> Date: Thu, 27 Jan 2011 13:48:13 +0100 Subject: Allow the user to select imageformats to be built as plugin vs internal This adds what is already there for different plugin types to imageformats plugins -- allowing the user to configure which image formats will be built into Qt and which will be built as plugins. Merge-request: 1028 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- configure | 24 +++++++++++++++++++++++- tools/configure/configureapp.cpp | 12 ++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/configure b/configure index b11d82d..b60da9e 100755 --- a/configure +++ b/configure @@ -934,6 +934,16 @@ if [ -d "$relpath/src/plugins/gfxdrivers" ]; then CFG_GFX_OFF="$CFG_GFX_AVAILABLE" # assume all off fi +CFG_IMAGEFORMAT_PLUGIN_AVAILABLE= +if [ -d "$relpath/src/plugins/imageformats" ]; then + for a in "$relpath/src/plugins/imageformats/"*; do + if [ -d "$a" ]; then + base_a=`basename "$a"` + CFG_IMAGEFORMAT_PLUGIN_AVAILABLE="${CFG_IMAGEFORMAT_PLUGIN_AVAILABLE} ${base_a}" + fi + done +fi + #------------------------------------------------------------------------------- # Set Default NaCl options #------------------------------------------------------------------------------- @@ -2140,7 +2150,7 @@ while [ "$#" -gt 0 ]; do UNKNOWN_OPT=yes fi ;; - sql-*|gfx-*|decoration-*|kbd-*|mouse-*) + sql-*|gfx-*|decoration-*|kbd-*|mouse-*|imageformat-*) # if Qt style options were used, $VAL can be "no", "qt", or "plugin" # if autoconf style options were used, $VAL can be "yes" or "no" [ "$VAL" = "yes" ] && VAL=qt @@ -2182,6 +2192,13 @@ while [ "$#" -gt 0 ]; do avail="$CFG_MOUSE_PLUGIN_AVAILABLE" fi ;; + imageformat) + avail="$CFG_IMAGEFORMAT_PLUGIN_AVAILABLE" + if [ "$OPT" != "plugin" ]; then + # png is always built in + avail="$avail png" + fi + ;; *) avail="" echo "BUG: Unhandled type $VAR used in $CURRENT_OPT" @@ -2202,6 +2219,11 @@ while [ "$#" -gt 0 ]; do # set the CFG_SQL_driver eval "CFG_SQL_$VAL=\$OPT" continue + elif [ "$VAR" = "imageformat" ]; then + [ "$OPT" = "qt" ] && OPT=yes + VAL="`echo $VAL |tr a-z A-Z`" + eval "CFG_$VAL=$OPT" + continue fi if [ "$OPT" = "plugin" ] || [ "$OPT" = "qt" ]; then diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 64fc6a9..6b87c8e 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -437,6 +437,7 @@ void Configure::parseCmdLine() { int argCount = configCmdLine.size(); int i = 0; + const QStringList imageFormats = QStringList() << "gif" << "png" << "mng" << "jpeg" << "tiff"; #if !defined(EVAL) if (argCount < 1) // skip rest if no arguments @@ -829,6 +830,17 @@ void Configure::parseCmdLine() dictionary[ "SQL_IBASE" ] = "plugin"; else if (configCmdLine.at(i) == "-no-sql-ibase") dictionary[ "SQL_IBASE" ] = "no"; + + // Image formats -------------------------------------------- + else if (configCmdLine.at(i).startsWith("-qt-imageformat-") && + imageFormats.contains(configCmdLine.at(i).section('-', 3))) + dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "yes"; + else if (configCmdLine.at(i).startsWith("-plugin-imageformat-") && + imageFormats.contains(configCmdLine.at(i).section('-', 3))) + dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "plugin"; + else if (configCmdLine.at(i).startsWith("-no-imageformat-") && + imageFormats.contains(configCmdLine.at(i).section('-', 3))) + dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "no"; #endif // IDE project generation ----------------------------------- else if (configCmdLine.at(i) == "-no-dsp") -- cgit v0.12 From 1d9a0a2192bb9a2f2cff97fba8a7ee5668f8ae56 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Thu, 27 Jan 2011 15:30:27 +0100 Subject: fix windows configure compilation after lighthouse merge --- tools/configure/configure.pro | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/configure/configure.pro b/tools/configure/configure.pro index 608d876..1245646 100644 --- a/tools/configure/configure.pro +++ b/tools/configure/configure.pro @@ -65,6 +65,7 @@ HEADERS = configureapp.h environment.h tools.h\ $$QT_SOURCE_TREE/src/corelib/tools/qstringlist.h \ $$QT_SOURCE_TREE/src/corelib/tools/qstringmatcher.h \ $$QT_SOURCE_TREE/src/corelib/tools/qunicodetables_p.h \ + $$QT_SOURCE_TREE/src/corelib/kernel/qsystemerror_p.h \ $$QT_SOURCE_TREE/src/corelib/xml/qxmlstream.h \ $$QT_SOURCE_TREE/src/corelib/xml/qxmlutils_p.h \ $$QT_SOURCE_TREE/tools/shared/symbian/epocroot_p.h \ @@ -111,6 +112,7 @@ SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qunicodetables.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qvsnprintf.cpp \ $$QT_SOURCE_TREE/src/corelib/kernel/qvariant.cpp \ + $$QT_SOURCE_TREE/src/corelib/kernel/qsystemerror.cpp \ $$QT_SOURCE_TREE/src/corelib/io/qurl.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qline.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qsize.cpp \ -- cgit v0.12 From 210726453ff3ca0f16f036683e17097e1b62d458 Mon Sep 17 00:00:00 2001 From: "Yury G. Kudryashov" <urkud.urkud@gmail.com> Date: Wed, 2 Feb 2011 17:16:15 +0100 Subject: Load modules from QMAKEPATH With this commit one can install qt_pkg.pri to $someprefix/mkspecs/modules and export QMAKEPATH=$someprefix. Merge-request: 2559 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> --- mkspecs/features/qt_config.prf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mkspecs/features/qt_config.prf b/mkspecs/features/qt_config.prf index 19e01a1..de1cac4 100644 --- a/mkspecs/features/qt_config.prf +++ b/mkspecs/features/qt_config.prf @@ -11,7 +11,11 @@ isEmpty(QMAKE_QT_CONFIG)|!exists($$QMAKE_QT_CONFIG) { debug(1, "Cannot load qconfig.pri!") } else { debug(1, "Loaded .qconfig.pri from ($$QMAKE_QT_CONFIG)") - for(mod, $$list($$files($$dirname(QMAKE_QT_CONFIG)/modules/qt_*.pri))):include($$mod) + for(dir, $$list($$unique($$list($$dirname(QMAKE_QT_CONFIG) \ + $$split($$list($$[QMAKE_MKSPECS]), $$DIRLIST_SEPARATOR))))) { + debug(1, "Loading modules from $${dir}") + for(mod, $$list($$files($$dir/modules/qt_*.pri))):include($$mod) + } } load(qt_functions) -- cgit v0.12 From a97a36aac550c175a2e2045ead55ad4d263a24ed Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Wed, 2 Feb 2011 08:02:04 +0100 Subject: Split QScriptClass autotest into smaller functions Task-number: QTBUG-16746 Reviewed-by: Jedrzej Nowacki --- tests/auto/qscriptclass/tst_qscriptclass.cpp | 446 ++++++++++++++------------- 1 file changed, 236 insertions(+), 210 deletions(-) diff --git a/tests/auto/qscriptclass/tst_qscriptclass.cpp b/tests/auto/qscriptclass/tst_qscriptclass.cpp index 16f09b6..2d6daec 100644 --- a/tests/auto/qscriptclass/tst_qscriptclass.cpp +++ b/tests/auto/qscriptclass/tst_qscriptclass.cpp @@ -65,10 +65,15 @@ public: private slots: void newInstance(); - void getAndSetProperty(); + void setScriptClassOfExistingObject(); + void setScriptClassOfNonQtScriptObject(); + void getAndSetPropertyFromCpp(); void getProperty_invalidValue(); void enumerate(); - void extension(); + void extension_None(); + void extension_Callable(); + void extension_Callable_construct(); + void extension_HasInstance(); void originalProperties1(); void originalProperties2(); void originalProperties3(); @@ -611,7 +616,12 @@ void tst_QScriptClass::newInstance() QCOMPARE(obj2.scriptClass(), (QScriptClass*)&cls); QVERIFY(!obj2.equals(obj1)); QVERIFY(!obj2.strictlyEquals(obj1)); +} +void tst_QScriptClass::setScriptClassOfExistingObject() +{ + QScriptEngine eng; + TestClass cls(&eng); QScriptValue obj3 = eng.newObject(); QCOMPARE(obj3.scriptClass(), (QScriptClass*)0); obj3.setScriptClass(&cls); @@ -625,7 +635,12 @@ void tst_QScriptClass::newInstance() TestClass cls2(&eng); obj3.setScriptClass(&cls2); QCOMPARE(obj3.scriptClass(), (QScriptClass*)&cls2); +} +void tst_QScriptClass::setScriptClassOfNonQtScriptObject() +{ + QScriptEngine eng; + TestClass cls(&eng); // undefined behavior really, but shouldn't crash QScriptValue arr = eng.newArray(); QVERIFY(arr.isArray()); @@ -639,7 +654,7 @@ void tst_QScriptClass::newInstance() QVERIFY(arr.isObject()); } -void tst_QScriptClass::getAndSetProperty() +void tst_QScriptClass::getAndSetPropertyFromCpp() { QScriptEngine eng; @@ -651,7 +666,9 @@ void tst_QScriptClass::getAndSetProperty() QScriptString bar = eng.toStringHandle("bar"); QScriptValue num(&eng, 123); - // should behave just like normal + // Initially our TestClass instances have no custom properties, + // and queryProperty() will always return false. + // Hence, the properties will be created as normal JS properties. for (int x = 0; x < 2; ++x) { QScriptValue &o = (x == 0) ? obj1 : obj2; for (int y = 0; y < 2; ++y) { @@ -828,229 +845,238 @@ void tst_QScriptClass::enumerate() } } -void tst_QScriptClass::extension() +void tst_QScriptClass::extension_None() { QScriptEngine eng; + TestClass cls(&eng); + cls.setCallableMode(TestClass::NotCallable); + QVERIFY(!cls.supportsExtension(QScriptClass::Callable)); + QVERIFY(!cls.supportsExtension(QScriptClass::HasInstance)); + QScriptValue obj = eng.newObject(&cls); + QVERIFY(!obj.call().isValid()); + QCOMPARE((int)cls.lastExtensionType(), -1); + QVERIFY(!obj.instanceOf(obj)); + QCOMPARE((int)cls.lastExtensionType(), -1); + QVERIFY(!obj.construct().isValid()); +} + +void tst_QScriptClass::extension_Callable() +{ + QScriptEngine eng; + TestClass cls(&eng); + cls.setCallableMode(TestClass::CallableReturnsSum); + QVERIFY(cls.supportsExtension(QScriptClass::Callable)); + + QScriptValue obj = eng.newObject(&cls); + eng.globalObject().setProperty("obj", obj); + obj.setProperty("one", QScriptValue(&eng, 1)); + obj.setProperty("two", QScriptValue(&eng, 2)); + obj.setProperty("three", QScriptValue(&eng, 3)); + // From C++ + cls.clearReceivedArgs(); { - TestClass cls(&eng); - cls.setCallableMode(TestClass::NotCallable); - QVERIFY(!cls.supportsExtension(QScriptClass::Callable)); - QVERIFY(!cls.supportsExtension(QScriptClass::HasInstance)); - QScriptValue obj = eng.newObject(&cls); - QVERIFY(!obj.call().isValid()); - QCOMPARE((int)cls.lastExtensionType(), -1); - QVERIFY(!obj.instanceOf(obj)); - QCOMPARE((int)cls.lastExtensionType(), -1); - QVERIFY(!obj.construct().isValid()); + QScriptValueList args; + args << QScriptValue(&eng, 4) << QScriptValue(&eng, 5); + QScriptValue ret = obj.call(obj, args); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toNumber(), qsreal(1+2+3+4+5)); } - // Callable + // From JS + cls.clearReceivedArgs(); { - TestClass cls(&eng); - cls.setCallableMode(TestClass::CallableReturnsSum); - QVERIFY(cls.supportsExtension(QScriptClass::Callable)); - - QScriptValue obj = eng.newObject(&cls); - eng.globalObject().setProperty("obj", obj); - obj.setProperty("one", QScriptValue(&eng, 1)); - obj.setProperty("two", QScriptValue(&eng, 2)); - obj.setProperty("three", QScriptValue(&eng, 3)); - // From C++ - cls.clearReceivedArgs(); - { - QScriptValueList args; - args << QScriptValue(&eng, 4) << QScriptValue(&eng, 5); - QScriptValue ret = obj.call(obj, args); - QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); - QVERIFY(ret.isNumber()); - QCOMPARE(ret.toNumber(), qsreal(15)); - } - // From JS - cls.clearReceivedArgs(); - { - QScriptValue ret = eng.evaluate("obj(4, 5)"); - QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); - QVERIFY(ret.isNumber()); - QCOMPARE(ret.toNumber(), qsreal(15)); - } + QScriptValue ret = eng.evaluate("obj(4, 5)"); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toNumber(), qsreal(1+2+3+4+5)); + } - cls.setCallableMode(TestClass::CallableReturnsArgument); - // From C++ - cls.clearReceivedArgs(); - { - QScriptValue ret = obj.call(obj, QScriptValueList() << 123); - QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); - QVERIFY(ret.isNumber()); - QCOMPARE(ret.toInt32(), 123); - } - cls.clearReceivedArgs(); - { - QScriptValue ret = obj.call(obj, QScriptValueList() << true); - QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); - QVERIFY(ret.isBoolean()); - QCOMPARE(ret.toBoolean(), true); - } - { - QScriptValue ret = obj.call(obj, QScriptValueList() << QString::fromLatin1("ciao")); - QVERIFY(ret.isString()); - QCOMPARE(ret.toString(), QString::fromLatin1("ciao")); - } - { - QScriptValue objobj = eng.newObject(); - QScriptValue ret = obj.call(obj, QScriptValueList() << objobj); - QVERIFY(ret.isObject()); - QVERIFY(ret.strictlyEquals(objobj)); - } - { - QScriptValue ret = obj.call(obj, QScriptValueList() << QScriptValue()); - QVERIFY(ret.isUndefined()); - } - // From JS - cls.clearReceivedArgs(); - { - QScriptValue ret = eng.evaluate("obj(123)"); - QVERIFY(ret.isNumber()); - QCOMPARE(ret.toInt32(), 123); - } + cls.setCallableMode(TestClass::CallableReturnsArgument); + // From C++ + cls.clearReceivedArgs(); + { + QScriptValue ret = obj.call(obj, QScriptValueList() << 123); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toInt32(), 123); + } + cls.clearReceivedArgs(); + { + QScriptValue ret = obj.call(obj, QScriptValueList() << true); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); + QVERIFY(ret.isBoolean()); + QCOMPARE(ret.toBoolean(), true); + } + { + QScriptValue ret = obj.call(obj, QScriptValueList() << QString::fromLatin1("ciao")); + QVERIFY(ret.isString()); + QCOMPARE(ret.toString(), QString::fromLatin1("ciao")); + } + { + QScriptValue objobj = eng.newObject(); + QScriptValue ret = obj.call(obj, QScriptValueList() << objobj); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(objobj)); + } + { + QScriptValue ret = obj.call(obj, QScriptValueList() << QScriptValue()); + QVERIFY(ret.isUndefined()); + } + // From JS + cls.clearReceivedArgs(); + { + QScriptValue ret = eng.evaluate("obj(123)"); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toInt32(), 123); + } - cls.setCallableMode(TestClass::CallableReturnsInvalidVariant); - { - QScriptValue ret = obj.call(obj); - QVERIFY(ret.isUndefined()); - } + cls.setCallableMode(TestClass::CallableReturnsInvalidVariant); + { + QScriptValue ret = obj.call(obj); + QVERIFY(ret.isUndefined()); + } - cls.setCallableMode(TestClass::CallableReturnsThisObject); - // From C++ - { - QScriptValue ret = obj.call(obj); - QVERIFY(ret.isObject()); - QVERIFY(ret.strictlyEquals(obj)); - } - // From JS - { - QScriptValue ret = eng.evaluate("obj()"); - QVERIFY(ret.isObject()); - QVERIFY(ret.strictlyEquals(eng.globalObject())); - } + cls.setCallableMode(TestClass::CallableReturnsThisObject); + // From C++ + { + QScriptValue ret = obj.call(obj); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(obj)); + } + // From JS + { + QScriptValue ret = eng.evaluate("obj()"); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(eng.globalObject())); + } - cls.setCallableMode(TestClass::CallableReturnsCallee); - // From C++ - { - QScriptValue ret = obj.call(); - QVERIFY(ret.isObject()); - QVERIFY(ret.strictlyEquals(obj)); - } - // From JS - { - QScriptValue ret = eng.evaluate("obj()"); - QVERIFY(ret.isObject()); - QVERIFY(ret.strictlyEquals(obj)); - } + cls.setCallableMode(TestClass::CallableReturnsCallee); + // From C++ + { + QScriptValue ret = obj.call(); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(obj)); + } + // From JS + { + QScriptValue ret = eng.evaluate("obj()"); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(obj)); + } - cls.setCallableMode(TestClass::CallableReturnsArgumentsObject); - // From C++ - { - QScriptValue ret = obj.call(obj, QScriptValueList() << 123); - QVERIFY(ret.isObject()); - QVERIFY(ret.property("length").isNumber()); - QCOMPARE(ret.property("length").toInt32(), 1); - QVERIFY(ret.property(0).isNumber()); - QCOMPARE(ret.property(0).toInt32(), 123); - } - // From JS - { - QScriptValue ret = eng.evaluate("obj(123)"); - QVERIFY(ret.isObject()); - QVERIFY(ret.property("length").isNumber()); - QCOMPARE(ret.property("length").toInt32(), 1); - QVERIFY(ret.property(0).isNumber()); - QCOMPARE(ret.property(0).toInt32(), 123); - } + cls.setCallableMode(TestClass::CallableReturnsArgumentsObject); + // From C++ + { + QScriptValue ret = obj.call(obj, QScriptValueList() << 123); + QVERIFY(ret.isObject()); + QVERIFY(ret.property("length").isNumber()); + QCOMPARE(ret.property("length").toInt32(), 1); + QVERIFY(ret.property(0).isNumber()); + QCOMPARE(ret.property(0).toInt32(), 123); + } + // From JS + { + QScriptValue ret = eng.evaluate("obj(123)"); + QVERIFY(ret.isObject()); + QVERIFY(ret.property("length").isNumber()); + QCOMPARE(ret.property("length").toInt32(), 1); + QVERIFY(ret.property(0).isNumber()); + QCOMPARE(ret.property(0).toInt32(), 123); + } +} - // construct() - // From C++ - cls.clearReceivedArgs(); - cls.setCallableMode(TestClass::CallableReturnsGlobalObject); - { - QScriptValue ret = obj.construct(); - QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); - QVERIFY(ret.isObject()); - QVERIFY(ret.strictlyEquals(eng.globalObject())); - } - // From JS - cls.clearReceivedArgs(); - { - QScriptValue ret = eng.evaluate("new obj()"); - QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); - QVERIFY(ret.isObject()); - QVERIFY(ret.strictlyEquals(eng.globalObject())); - } - // From C++ - cls.clearReceivedArgs(); - cls.setCallableMode(TestClass::CallableInitializesThisObject); - { - QScriptValue ret = obj.construct(); - QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); - QVERIFY(ret.isQObject()); - QCOMPARE(ret.toQObject(), (QObject*)&eng); - } - // From JS - cls.clearReceivedArgs(); - { - QScriptValue ret = eng.evaluate("new obj()"); - QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); - QVERIFY(ret.isQObject()); - QCOMPARE(ret.toQObject(), (QObject*)&eng); - } +void tst_QScriptClass::extension_Callable_construct() +{ + QScriptEngine eng; + TestClass cls(&eng); + QScriptValue obj = eng.newObject(&cls); + eng.globalObject().setProperty("obj", obj); + + // From C++ + cls.clearReceivedArgs(); + cls.setCallableMode(TestClass::CallableReturnsGlobalObject); + { + QScriptValue ret = obj.construct(); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(eng.globalObject())); } - // HasInstance + // From JS + cls.clearReceivedArgs(); { - TestClass cls(&eng); - cls.setHasInstance(true); - QVERIFY(cls.supportsExtension(QScriptClass::HasInstance)); + QScriptValue ret = eng.evaluate("new obj()"); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(eng.globalObject())); + } + // From C++ + cls.clearReceivedArgs(); + cls.setCallableMode(TestClass::CallableInitializesThisObject); + { + QScriptValue ret = obj.construct(); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); + QVERIFY(ret.isQObject()); + QCOMPARE(ret.toQObject(), (QObject*)&eng); + } + // From JS + cls.clearReceivedArgs(); + { + QScriptValue ret = eng.evaluate("new obj()"); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); + QVERIFY(ret.isQObject()); + QCOMPARE(ret.toQObject(), (QObject*)&eng); + } +} + +void tst_QScriptClass::extension_HasInstance() +{ + QScriptEngine eng; + TestClass cls(&eng); + cls.setHasInstance(true); + QVERIFY(cls.supportsExtension(QScriptClass::HasInstance)); - QScriptValue obj = eng.newObject(&cls); - obj.setProperty("foo", QScriptValue(&eng, 123)); - QScriptValue plain = eng.newObject(); - QVERIFY(!plain.instanceOf(obj)); + QScriptValue obj = eng.newObject(&cls); + obj.setProperty("foo", QScriptValue(&eng, 123)); + QScriptValue plain = eng.newObject(); + QVERIFY(!plain.instanceOf(obj)); - eng.globalObject().setProperty("HasInstanceTester", obj); - eng.globalObject().setProperty("hasInstanceValue", plain); - cls.clearReceivedArgs(); - { - QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); - QCOMPARE(cls.lastExtensionType(), QScriptClass::HasInstance); - QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptValueList>()); - QScriptValueList lst = qvariant_cast<QScriptValueList>(cls.lastExtensionArgument()); - QCOMPARE(lst.size(), 2); - QVERIFY(lst.at(0).strictlyEquals(obj)); - QVERIFY(lst.at(1).strictlyEquals(plain)); - QVERIFY(ret.isBoolean()); - QVERIFY(!ret.toBoolean()); - } + eng.globalObject().setProperty("HasInstanceTester", obj); + eng.globalObject().setProperty("hasInstanceValue", plain); + cls.clearReceivedArgs(); + { + QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); + QCOMPARE(cls.lastExtensionType(), QScriptClass::HasInstance); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptValueList>()); + QScriptValueList lst = qvariant_cast<QScriptValueList>(cls.lastExtensionArgument()); + QCOMPARE(lst.size(), 2); + QVERIFY(lst.at(0).strictlyEquals(obj)); + QVERIFY(lst.at(1).strictlyEquals(plain)); + QVERIFY(ret.isBoolean()); + QVERIFY(!ret.toBoolean()); + } - plain.setProperty("foo", QScriptValue(&eng, 456)); - QVERIFY(!plain.instanceOf(obj)); - { - QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); - QVERIFY(ret.isBoolean()); - QVERIFY(!ret.toBoolean()); - } + plain.setProperty("foo", QScriptValue(&eng, 456)); + QVERIFY(!plain.instanceOf(obj)); + { + QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); + QVERIFY(ret.isBoolean()); + QVERIFY(!ret.toBoolean()); + } - plain.setProperty("foo", obj.property("foo")); - QVERIFY(plain.instanceOf(obj)); - { - QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); - QVERIFY(ret.isBoolean()); - QVERIFY(ret.toBoolean()); - } + plain.setProperty("foo", obj.property("foo")); + QVERIFY(plain.instanceOf(obj)); + { + QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); + QVERIFY(ret.isBoolean()); + QVERIFY(ret.toBoolean()); } } -- cgit v0.12 From 48f8d0cf20f8bcdb35bfc49057ad1fa768e66825 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Wed, 2 Feb 2011 08:11:32 +0100 Subject: Bring back "classic" iteration order of QScriptClass properties In the old back-end, normal JS properties were iterated before QScriptClass properties. There wasn't any good reason to change that. Now we can get rid of that left-over XFAIL as well. Task-number: QTBUG-16746 Reviewed-by: Jedrzej Nowacki --- src/script/bridge/qscriptclassobject.cpp | 5 ++++- tests/auto/qscriptclass/tst_qscriptclass.cpp | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/script/bridge/qscriptclassobject.cpp b/src/script/bridge/qscriptclassobject.cpp index 9285883..2085756 100644 --- a/src/script/bridge/qscriptclassobject.cpp +++ b/src/script/bridge/qscriptclassobject.cpp @@ -183,6 +183,10 @@ void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecSt JSC::PropertyNameArray &propertyNames, JSC::EnumerationMode mode) { + // For compatibility with the old back-end, normal JS properties + // are added first. + QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode); + QScriptEnginePrivate *engine = scriptEngineFromExec(exec); QScript::SaveFrameHelper saveFrame(engine, exec); QScriptValue scriptObject = engine->scriptValueFromJSCValue(object); @@ -195,7 +199,6 @@ void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecSt } delete it; } - QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode); } JSC::CallType ClassObjectDelegate::getCallData(QScriptObject*, JSC::CallData &callData) diff --git a/tests/auto/qscriptclass/tst_qscriptclass.cpp b/tests/auto/qscriptclass/tst_qscriptclass.cpp index 2d6daec..00fdd35 100644 --- a/tests/auto/qscriptclass/tst_qscriptclass.cpp +++ b/tests/auto/qscriptclass/tst_qscriptclass.cpp @@ -823,10 +823,12 @@ void tst_QScriptClass::enumerate() cls.setIterationEnabled(true); QScriptValueIterator it(obj); + // This test relies on the order in which properties are enumerated, + // which we don't guarantee. However, for compatibility's sake we prefer + // that normal JS properties come before QScriptClass properties. for (int x = 0; x < 2; ++x) { QVERIFY(it.hasNext()); it.next(); - QEXPECT_FAIL("", "", Abort); QVERIFY(it.scriptName() == foo); QVERIFY(it.hasNext()); it.next(); -- cgit v0.12 From a7027e7ecc0bfc97030110105436fd5406256108 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Wed, 2 Feb 2011 08:28:59 +0100 Subject: Improve QScriptClass test coverage Add tests for various kinds of property access from JS. Add tests for null-engine & using the same script class in two different engines. Task-number: QTBUG-16746 Reviewed-by: Jedrzej Nowacki --- tests/auto/qscriptclass/tst_qscriptclass.cpp | 149 ++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 1 deletion(-) diff --git a/tests/auto/qscriptclass/tst_qscriptclass.cpp b/tests/auto/qscriptclass/tst_qscriptclass.cpp index 00fdd35..5286a5a 100644 --- a/tests/auto/qscriptclass/tst_qscriptclass.cpp +++ b/tests/auto/qscriptclass/tst_qscriptclass.cpp @@ -68,6 +68,10 @@ private slots: void setScriptClassOfExistingObject(); void setScriptClassOfNonQtScriptObject(); void getAndSetPropertyFromCpp(); + void getAndSetPropertyFromJS(); + void deleteUndeletableProperty(); + void writeReadOnlyProperty(); + void writePropertyWithoutWriteAccess(); void getProperty_invalidValue(); void enumerate(); void extension_None(); @@ -79,6 +83,9 @@ private slots: void originalProperties3(); void originalProperties4(); void defaultImplementations(); + void scriptClassObjectInPrototype(); + void scriptClassWithNullEngine(); + void scriptClassInOtherEngine(); }; tst_QScriptClass::tst_QScriptClass() @@ -311,7 +318,12 @@ void TestClass::setProperty(QScriptValue &object, const QScriptString &name, CustomProperty *prop = findCustomProperty(name); if (!prop) return; - prop->value = value; + if (prop->pflags & QScriptValue::ReadOnly) + return; + if (!value.isValid()) // deleteProperty() requested + removeCustomProperty(name); + else + prop->value = value; } QScriptValue::PropertyFlags TestClass::propertyFlags( @@ -774,6 +786,80 @@ void tst_QScriptClass::getAndSetPropertyFromCpp() QVERIFY(!obj1.property(bar).isValid()); } +void tst_QScriptClass::getAndSetPropertyFromJS() +{ + QScriptEngine eng; + TestClass cls(&eng); + cls.addCustomProperty(eng.toStringHandle("x"), + QScriptClass::HandlesReadAccess + | QScriptClass::HandlesWriteAccess, + /*id=*/1, /*flags=*/0, /*value=*/123); + eng.globalObject().setProperty("o", eng.newObject(&cls)); + + // Accessing a custom property + QCOMPARE(eng.evaluate("o.x").toInt32(), 123); + QCOMPARE(eng.evaluate("o.x = 456; o.x").toInt32(), 456); + + // Accessing a new JS property + QVERIFY(eng.evaluate("o.y").isUndefined()); + QCOMPARE(eng.evaluate("o.y = 789; o.y").toInt32(), 789); + + // Deleting custom property + QVERIFY(eng.evaluate("delete o.x").toBool()); + QVERIFY(eng.evaluate("o.x").isUndefined()); + + // Deleting JS property + QVERIFY(eng.evaluate("delete o.y").toBool()); + QVERIFY(eng.evaluate("o.y").isUndefined()); +} + +void tst_QScriptClass::deleteUndeletableProperty() +{ + QScriptEngine eng; + TestClass cls(&eng); + cls.addCustomProperty(eng.toStringHandle("x"), QScriptClass::HandlesWriteAccess, + /*id=*/0, QScriptValue::Undeletable, QScriptValue()); + eng.globalObject().setProperty("o", eng.newObject(&cls)); + QVERIFY(!eng.evaluate("delete o.x").toBool()); +} + +void tst_QScriptClass::writeReadOnlyProperty() +{ + QScriptEngine eng; + TestClass cls(&eng); + cls.addCustomProperty(eng.toStringHandle("x"), + QScriptClass::HandlesReadAccess + | QScriptClass::HandlesWriteAccess, + /*id=*/0, QScriptValue::ReadOnly, 123); + eng.globalObject().setProperty("o", eng.newObject(&cls)); + // Note that if a property is read-only, the setProperty() + // reimplementation will still get called; it's up to that + // function to respect the ReadOnly flag. + QCOMPARE(eng.evaluate("o.x = 456; o.x").toInt32(), 123); +} + +void tst_QScriptClass::writePropertyWithoutWriteAccess() +{ + QScriptEngine eng; + TestClass cls(&eng); + cls.addCustomProperty(eng.toStringHandle("x"), + QScriptClass::HandlesReadAccess, + /*id=*/0, /*flags=*/0, 123); + eng.globalObject().setProperty("o", eng.newObject(&cls)); + QCOMPARE(eng.evaluate("o.x").toInt32(), 123); + + // This will create a JS property on the instance that + // shadows the custom property. + // This behavior is not documented. It might be more + // intuitive to treat a property that only handles read + // access as a read-only, non-shadowable property. + QCOMPARE(eng.evaluate("o.x = 456; o.x").toInt32(), 456); + + QVERIFY(eng.evaluate("delete o.x").toBool()); + // Now the custom property is seen again. + QCOMPARE(eng.evaluate("o.x").toInt32(), 123); +} + void tst_QScriptClass::getProperty_invalidValue() { QScriptEngine eng; @@ -1352,5 +1438,66 @@ void tst_QScriptClass::defaultImplementations() QVERIFY(!defaultClass.extension(QScriptClass::HasInstance).isValid()); } +void tst_QScriptClass::scriptClassObjectInPrototype() +{ + QScriptEngine eng; + TestClass cls(&eng); + QScriptValue plainObject = eng.newObject(); + QScriptValue classObject = eng.newObject(&cls); + plainObject.setPrototype(classObject); + QVERIFY(plainObject.prototype().equals(classObject)); + eng.globalObject().setProperty("plainObject", plainObject); + eng.globalObject().setProperty("classObject", classObject); + + QScriptString name = eng.toStringHandle("x"); + cls.addCustomProperty(name, QScriptClass::HandlesReadAccess, /*id=*/1, /*flags=*/0, /*value=*/123); + QVERIFY(plainObject.property(name).equals(classObject.property(name))); + QVERIFY(eng.evaluate("plainObject.x == classObject.x").toBool()); + + // Add a property that shadows the one in the script class. + plainObject.setProperty(name, 456); + QVERIFY(!plainObject.property(name).equals(classObject.property(name))); + QVERIFY(eng.evaluate("plainObject.x != classObject.x").toBool()); + + QVERIFY(eng.evaluate("delete plainObject.x").toBool()); + QVERIFY(eng.evaluate("plainObject.x == classObject.x").toBool()); +} + +void tst_QScriptClass::scriptClassWithNullEngine() +{ + QScriptClass cls(0); + QCOMPARE(cls.engine(), (QScriptEngine*)0); + QScriptEngine eng; + QScriptValue obj = eng.newObject(&cls); + QVERIFY(obj.isObject()); + QCOMPARE(obj.scriptClass(), &cls); + // The class could have been "bound" to the engine at this point, + // but it's currently not. + // This behavior is not documented and is subject to change. + QCOMPARE(cls.engine(), (QScriptEngine*)0); + // The engine pointer stored in the QScriptClass is not actually used + // during property access, so this still works. + obj.setProperty("x", 123); + QVERIFY(obj.property("x").isNumber()); +} + +void tst_QScriptClass::scriptClassInOtherEngine() +{ + QScriptEngine eng; + TestClass cls(&eng); + QScriptEngine eng2; + // We don't check that the class is associated with another engine, so + // we only get a warning when trying to set the prototype of the new + // instance. + // This behavior is not documented and is subject to change. + QTest::ignoreMessage(QtWarningMsg, "QScriptValue::setPrototype() failed: cannot set a prototype created in a different engine"); + QScriptValue obj = eng2.newObject(&cls); + QVERIFY(obj.isObject()); + QCOMPARE(obj.scriptClass(), &cls); + + obj.setProperty("x", 123); + QVERIFY(obj.property("x").isNumber()); +} + QTEST_MAIN(tst_QScriptClass) #include "tst_qscriptclass.moc" -- cgit v0.12 From 74c91e9f6de56728de5472b9d7c2372e480f37b3 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Wed, 2 Feb 2011 10:29:22 +0100 Subject: Split QScriptContext autotest into smaller functions Task-number: QTBUG-16746 Reviewed-by: Jedrzej Nowacki --- tests/auto/qscriptcontext/tst_qscriptcontext.cpp | 330 +++++++++++++---------- 1 file changed, 194 insertions(+), 136 deletions(-) diff --git a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp index cb6311e..eee67df 100644 --- a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp +++ b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp @@ -66,7 +66,9 @@ public: private slots: void callee(); + void callee_implicitCall(); void arguments(); + void argumentsInJS(); void thisObject(); void returnValue(); void throwError_data(); @@ -77,16 +79,24 @@ private slots: void throwValue(); void evaluateInFunction(); void pushAndPopContext(); + void pushAndPopContext_variablesInActivation(); + void pushAndPopContext_setThisObject(); + void pushAndPopContext_throwException(); void lineNumber(); void backtrace_data(); void backtrace(); - void scopeChain(); - void pushAndPopScope(); - void getSetActivationObject(); + void scopeChain_globalContext(); + void scopeChain_closure(); + void scopeChain_withStatement(); + void pushAndPopScope_globalContext(); + void pushAndPopScope_globalContext2(); + void getSetActivationObject_globalContext(); void getSetActivationObject_customContext(); void inheritActivationAndThisObject(); void toString(); - void calledAsConstructor(); + void calledAsConstructor_fromCpp(); + void calledAsConstructor_fromJS(); + void calledAsConstructor_parentContext(); void argumentsObjectInNative(); void jsActivationObject(); void qobjectAsActivationObject(); @@ -121,33 +131,33 @@ void tst_QScriptContext::callee() { QScriptEngine eng; - { - QScriptValue fun = eng.newFunction(get_callee); - fun.setProperty("foo", QScriptValue(&eng, "bar")); - eng.globalObject().setProperty("get_callee", fun); + QScriptValue fun = eng.newFunction(get_callee); + fun.setProperty("foo", QScriptValue(&eng, "bar")); + eng.globalObject().setProperty("get_callee", fun); - QScriptValue result = eng.evaluate("get_callee()"); - QCOMPARE(result.isFunction(), true); - QCOMPARE(result.property("foo").toString(), QString("bar")); - } + QScriptValue result = eng.evaluate("get_callee()"); + QCOMPARE(result.isFunction(), true); + QCOMPARE(result.property("foo").toString(), QString("bar")); +} +void tst_QScriptContext::callee_implicitCall() +{ + QScriptEngine eng; // callee when toPrimitive() is called internally - { - QScriptValue fun = eng.newFunction(store_callee_and_return_primitive); - QScriptValue obj = eng.newObject(); - obj.setProperty("toString", fun); - QVERIFY(!obj.property("callee").isValid()); - (void)obj.toString(); - QVERIFY(obj.property("callee").isFunction()); - QVERIFY(obj.property("callee").strictlyEquals(fun)); - - obj.setProperty("callee", QScriptValue()); - QVERIFY(!obj.property("callee").isValid()); - obj.setProperty("valueOf", fun); - (void)obj.toNumber(); - QVERIFY(obj.property("callee").isFunction()); - QVERIFY(obj.property("callee").strictlyEquals(fun)); - } + QScriptValue fun = eng.newFunction(store_callee_and_return_primitive); + QScriptValue obj = eng.newObject(); + obj.setProperty("toString", fun); + QVERIFY(!obj.property("callee").isValid()); + (void)obj.toString(); + QVERIFY(obj.property("callee").isFunction()); + QVERIFY(obj.property("callee").strictlyEquals(fun)); + + obj.setProperty("callee", QScriptValue()); + QVERIFY(!obj.property("callee").isValid()); + obj.setProperty("valueOf", fun); + (void)obj.toNumber(); + QVERIFY(obj.property("callee").isFunction()); + QVERIFY(obj.property("callee").strictlyEquals(fun)); } static QScriptValue get_arguments(QScriptContext *ctx, QScriptEngine *eng) @@ -167,6 +177,8 @@ void tst_QScriptContext::arguments() { QScriptEngine eng; + // See section 10.6 ("Arguments Object") of ECMA-262. + { QScriptValue args = eng.currentContext()->argumentsObject(); QVERIFY(args.isObject()); @@ -178,6 +190,8 @@ void tst_QScriptContext::arguments() } for (int x = 0; x < 2; ++x) { + // The expected arguments array should be the same regardless of + // whether get_arguments() is called as a constructor. QString prefix; if (x == 0) prefix = ""; @@ -224,11 +238,15 @@ void tst_QScriptContext::arguments() QCOMPARE(result.propertyFlags("length"), QScriptValue::SkipInEnumeration); QCOMPARE(result.property("callee").strictlyEquals(fun), true); QCOMPARE(result.propertyFlags("callee"), QScriptValue::SkipInEnumeration); + + // callee and length properties should be writable. QScriptValue replacedCallee(&eng, 123); result.setProperty("callee", replacedCallee); QVERIFY(result.property("callee").equals(replacedCallee)); QScriptValue replacedLength(&eng, 456); result.setProperty("length", replacedLength); + + // callee and length properties should be deletable. QVERIFY(result.property("length").equals(replacedLength)); result.setProperty("callee", QScriptValue()); QVERIFY(!result.property("callee").isValid()); @@ -262,28 +280,31 @@ void tst_QScriptContext::arguments() QCOMPARE(result.property("2").toBoolean(), true); QCOMPARE(result.property("3").isUndefined(), true); } + } +} - // arguments object returned from script - { - QScriptValue result = eng.evaluate("(function() { return arguments; })(123)"); - QCOMPARE(result.isArray(), false); - QVERIFY(result.isObject()); - QCOMPARE(result.property("length").toUInt32(), quint32(1)); - QCOMPARE(result.property("0").isNumber(), true); - QCOMPARE(result.property("0").toNumber(), 123.0); - } +void tst_QScriptContext::argumentsInJS() +{ + QScriptEngine eng; + { + QScriptValue result = eng.evaluate("(function() { return arguments; })(123)"); + QCOMPARE(result.isArray(), false); + QVERIFY(result.isObject()); + QCOMPARE(result.property("length").toUInt32(), quint32(1)); + QCOMPARE(result.property("0").isNumber(), true); + QCOMPARE(result.property("0").toNumber(), 123.0); + } - { - QScriptValue result = eng.evaluate("(function() { return arguments; })('ciao', null, true, undefined)"); - QCOMPARE(result.isArray(), false); - QCOMPARE(result.property("length").toUInt32(), quint32(4)); - QCOMPARE(result.property("0").isString(), true); - QCOMPARE(result.property("0").toString(), QString("ciao")); - QCOMPARE(result.property("1").isNull(), true); - QCOMPARE(result.property("2").isBoolean(), true); - QCOMPARE(result.property("2").toBoolean(), true); - QCOMPARE(result.property("3").isUndefined(), true); - } + { + QScriptValue result = eng.evaluate("(function() { return arguments; })('ciao', null, true, undefined)"); + QCOMPARE(result.isArray(), false); + QCOMPARE(result.property("length").toUInt32(), quint32(4)); + QCOMPARE(result.property("0").isString(), true); + QCOMPARE(result.property("0").toString(), QString("ciao")); + QCOMPARE(result.property("1").isNull(), true); + QCOMPARE(result.property("2").isBoolean(), true); + QCOMPARE(result.property("2").toBoolean(), true); + QCOMPARE(result.property("3").isUndefined(), true); } } @@ -517,58 +538,65 @@ void tst_QScriptContext::pushAndPopContext() QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::popContext() doesn't match with pushContext()"); eng.popContext(); QCOMPARE(eng.currentContext(), topLevel); +} - { - QScriptContext *ctx3 = eng.pushContext(); - ctx3->activationObject().setProperty("foo", QScriptValue(&eng, 123)); - QVERIFY(eng.evaluate("foo").strictlyEquals(QScriptValue(&eng, 123))); - QCOMPARE(ctx3->activationObject().propertyFlags("foo"), QScriptValue::PropertyFlags(0)); - - ctx3->activationObject().setProperty(4, 456); - QVERIFY(ctx3->activationObject().property(4, QScriptValue::ResolveLocal).equals(456)); - - eng.evaluate("var bar = 'ciao'"); - QVERIFY(ctx3->activationObject().property("bar", QScriptValue::ResolveLocal).strictlyEquals(QScriptValue(&eng, "ciao"))); - - ctx3->activationObject().setProperty("baz", 789, QScriptValue::ReadOnly); - QVERIFY(eng.evaluate("baz").equals(789)); - QCOMPARE(ctx3->activationObject().propertyFlags("baz"), QScriptValue::ReadOnly); - - QSet<QString> activationPropertyNames; - QScriptValueIterator it(ctx3->activationObject()); - while (it.hasNext()) { - it.next(); - activationPropertyNames.insert(it.name()); - } - QCOMPARE(activationPropertyNames.size(), 4); - QVERIFY(activationPropertyNames.contains("foo")); - QVERIFY(activationPropertyNames.contains("4")); - QVERIFY(activationPropertyNames.contains("bar")); - QVERIFY(activationPropertyNames.contains("baz")); - - eng.popContext(); +void tst_QScriptContext::pushAndPopContext_variablesInActivation() +{ + QScriptEngine eng; + QScriptContext *ctx = eng.pushContext(); + ctx->activationObject().setProperty("foo", QScriptValue(&eng, 123)); + // evaluate() should use the current context. + QVERIFY(eng.evaluate("foo").strictlyEquals(QScriptValue(&eng, 123))); + QCOMPARE(ctx->activationObject().propertyFlags("foo"), QScriptValue::PropertyFlags(0)); + + ctx->activationObject().setProperty(4, 456); + QVERIFY(ctx->activationObject().property(4, QScriptValue::ResolveLocal).equals(456)); + + // New JS variables should become properties of the current context's activation. + eng.evaluate("var bar = 'ciao'"); + QVERIFY(ctx->activationObject().property("bar", QScriptValue::ResolveLocal).strictlyEquals(QScriptValue(&eng, "ciao"))); + + ctx->activationObject().setProperty("baz", 789, QScriptValue::ReadOnly); + QVERIFY(eng.evaluate("baz").equals(789)); + QCOMPARE(ctx->activationObject().propertyFlags("baz"), QScriptValue::ReadOnly); + + QSet<QString> activationPropertyNames; + QScriptValueIterator it(ctx->activationObject()); + while (it.hasNext()) { + it.next(); + activationPropertyNames.insert(it.name()); } + QCOMPARE(activationPropertyNames.size(), 4); + QVERIFY(activationPropertyNames.contains("foo")); + QVERIFY(activationPropertyNames.contains("4")); + QVERIFY(activationPropertyNames.contains("bar")); + QVERIFY(activationPropertyNames.contains("baz")); - { - QScriptContext *ctx4 = eng.pushContext(); - QScriptValue obj = eng.newObject(); - obj.setProperty("prop", QScriptValue(&eng, 456)); - ctx4->setThisObject(obj); - QScriptValue ret = eng.evaluate("var tmp = this.prop; tmp + 1"); - QCOMPARE(eng.currentContext(), ctx4); - QVERIFY(ret.strictlyEquals(QScriptValue(&eng, 457))); - eng.popContext(); - } + eng.popContext(); +} - // throwing an exception - { - QScriptContext *ctx5 = eng.pushContext(); - QScriptValue ret = eng.evaluate("throw new Error('oops')"); - QVERIFY(ret.isError()); - QVERIFY(eng.hasUncaughtException()); - QCOMPARE(eng.currentContext(), ctx5); - eng.popContext(); - } +void tst_QScriptContext::pushAndPopContext_setThisObject() +{ + QScriptEngine eng; + QScriptContext *ctx = eng.pushContext(); + QScriptValue obj = eng.newObject(); + obj.setProperty("prop", QScriptValue(&eng, 456)); + ctx->setThisObject(obj); + QScriptValue ret = eng.evaluate("var tmp = this.prop; tmp + 1"); + QCOMPARE(eng.currentContext(), ctx); + QVERIFY(ret.strictlyEquals(QScriptValue(&eng, 457))); + eng.popContext(); +} + +void tst_QScriptContext::pushAndPopContext_throwException() +{ + QScriptEngine eng; + QScriptContext *ctx = eng.pushContext(); + QScriptValue ret = eng.evaluate("throw new Error('oops')"); + QVERIFY(ret.isError()); + QVERIFY(eng.hasUncaughtException()); + QCOMPARE(eng.currentContext(), ctx); + eng.popContext(); } void tst_QScriptContext::popNativeContextScope() @@ -596,7 +624,7 @@ void tst_QScriptContext::popNativeContextScope() QVERIFY(ctx->activationObject().strictlyEquals(customScope)); QCOMPARE(ctx->scopeChain().size(), 2); QVERIFY(ctx->scopeChain().at(0).strictlyEquals(customScope)); - QEXPECT_FAIL("", "QTBUG-11012", Continue); + QEXPECT_FAIL("", "QTBUG-11012: Global object is replaced in scope chain", Continue); QVERIFY(ctx->scopeChain().at(1).strictlyEquals(eng.globalObject())); QVERIFY(!eng.evaluate("baz = 456; var foo = 789; function barbar() {}").isError()); @@ -918,7 +946,7 @@ static QScriptValue getScopeChain(QScriptContext *ctx, QScriptEngine *eng) return qScriptValueFromValue(eng, ctx->parentContext()->scopeChain()); } -void tst_QScriptContext::scopeChain() +void tst_QScriptContext::scopeChain_globalContext() { QScriptEngine eng; { @@ -932,19 +960,35 @@ void tst_QScriptContext::scopeChain() QCOMPARE(ret.size(), 1); QVERIFY(ret.at(0).strictlyEquals(eng.globalObject())); } - { - eng.evaluate("function foo() { function bar() { return getScopeChain(); } return bar() }"); - QScriptValueList ret = qscriptvalue_cast<QScriptValueList>(eng.evaluate("foo()")); - QEXPECT_FAIL("", "Number of items in returned scope chain is incorrect", Abort); - QCOMPARE(ret.size(), 3); - QVERIFY(ret.at(2).strictlyEquals(eng.globalObject())); - QCOMPARE(ret.at(1).toString(), QString::fromLatin1("activation")); - QVERIFY(ret.at(1).property("arguments").isObject()); - QCOMPARE(ret.at(0).toString(), QString::fromLatin1("activation")); - QVERIFY(ret.at(0).property("arguments").isObject()); - } +} + +void tst_QScriptContext::scopeChain_closure() +{ + QScriptEngine eng; + eng.globalObject().setProperty("getScopeChain", eng.newFunction(getScopeChain)); + + eng.evaluate("function foo() { function bar() { return getScopeChain(); } return bar() }"); + QScriptValueList ret = qscriptvalue_cast<QScriptValueList>(eng.evaluate("foo()")); + // JSC will not create an activation for bar() unless we insert a call + // to eval() in the function body; JSC has no way of knowing that the + // native function will be asking for the activation, and we don't want + // to needlessly create it. + QEXPECT_FAIL("", "QTBUG-10313: JSC optimizes away the activation object", Abort); + QCOMPARE(ret.size(), 3); + QVERIFY(ret.at(2).strictlyEquals(eng.globalObject())); + QCOMPARE(ret.at(1).toString(), QString::fromLatin1("activation")); + QVERIFY(ret.at(1).property("arguments").isObject()); + QCOMPARE(ret.at(0).toString(), QString::fromLatin1("activation")); + QVERIFY(ret.at(0).property("arguments").isObject()); +} + +void tst_QScriptContext::scopeChain_withStatement() +{ + QScriptEngine eng; + eng.globalObject().setProperty("getScopeChain", eng.newFunction(getScopeChain)); { QScriptValueList ret = qscriptvalue_cast<QScriptValueList>(eng.evaluate("o = { x: 123 }; with(o) getScopeChain();")); + QEXPECT_FAIL("", "QTBUG-17131: with-scope isn't reflected by QScriptContext", Abort); QCOMPARE(ret.size(), 2); QVERIFY(ret.at(1).strictlyEquals(eng.globalObject())); QVERIFY(ret.at(0).isObject()); @@ -962,7 +1006,7 @@ void tst_QScriptContext::scopeChain() } } -void tst_QScriptContext::pushAndPopScope() +void tst_QScriptContext::pushAndPopScope_globalContext() { QScriptEngine eng; QScriptContext *ctx = eng.currentContext(); @@ -1019,14 +1063,19 @@ void tst_QScriptContext::pushAndPopScope() ctx->pushScope(QScriptValue()); QCOMPARE(ctx->scopeChain().size(), 1); +} +void tst_QScriptContext::pushAndPopScope_globalContext2() +{ + QScriptEngine eng; + QScriptContext *ctx = eng.currentContext(); QVERIFY(ctx->popScope().strictlyEquals(eng.globalObject())); QVERIFY(ctx->scopeChain().isEmpty()); // Used to work with old back-end, doesn't with new one because JSC requires that the last object in // a scope chain is the Global Object. QTest::ignoreMessage(QtWarningMsg, "QScriptContext::pushScope() failed: initial object in scope chain has to be the Global Object"); - ctx->pushScope(obj); + ctx->pushScope(eng.newObject()); QCOMPARE(ctx->scopeChain().size(), 0); QScriptEngine eng2; @@ -1043,7 +1092,7 @@ static QScriptValue get_activationObject(QScriptContext *ctx, QScriptEngine *) return ctx->activationObject(); } -void tst_QScriptContext::getSetActivationObject() +void tst_QScriptContext::getSetActivationObject_globalContext() { QScriptEngine eng; QScriptContext *ctx = eng.currentContext(); @@ -1076,7 +1125,7 @@ void tst_QScriptContext::getSetActivationObject() QScriptValue ret = eng.evaluate("get_activationObject(1, 2, 3)"); QVERIFY(ret.isObject()); QScriptValue arguments = ret.property("arguments"); - QEXPECT_FAIL("", "Getting arguments property of activation object doesn't work", Abort); + QEXPECT_FAIL("", "QTBUG-17136: arguments property of activation object is missing", Abort); QVERIFY(arguments.isObject()); QCOMPARE(arguments.property("length").toInt32(), 3); QCOMPARE(arguments.property("0").toInt32(), 1); @@ -1099,6 +1148,8 @@ void tst_QScriptContext::getSetActivationObject_customContext() QCOMPARE(act.property("foo").toInt32(), 123); } +// Helper function that's intended to have the same behavior +// as the built-in eval() function. static QScriptValue myEval(QScriptContext *ctx, QScriptEngine *eng) { QString code = ctx->argument(0).toString(); @@ -1127,13 +1178,14 @@ void tst_QScriptContext::inheritActivationAndThisObject() QCOMPARE(ret.toInt32(), 123); } - // QT-2219 { eng.globalObject().setProperty("a", 123); QScriptValue ret = eng.evaluate("(function() { myEval('var a = 456'); return a; })()"); QVERIFY(ret.isNumber()); QCOMPARE(ret.toInt32(), 456); - QEXPECT_FAIL("", "QT-2219: Wrong activation object is returned from native function's parent context", Continue); + // Since JSC doesn't create an activation object for the anonymous function call, + // myEval() will use the global object as the activation, which is wrong. + QEXPECT_FAIL("", "QTBUG-10313: Wrong activation object is returned from native function's parent context", Continue); QVERIFY(eng.globalObject().property("a").strictlyEquals(123)); } } @@ -1172,11 +1224,11 @@ static QScriptValue storeCalledAsConstructorV3(QScriptContext *ctx, QScriptEngin return eng->undefinedValue(); } -void tst_QScriptContext::calledAsConstructor() +void tst_QScriptContext::calledAsConstructor_fromCpp() { QScriptEngine eng; - QScriptValue fun1 = eng.newFunction(storeCalledAsConstructor); { + QScriptValue fun1 = eng.newFunction(storeCalledAsConstructor); fun1.call(); QVERIFY(!fun1.property("calledAsConstructor").toBool()); fun1.construct(); @@ -1189,25 +1241,31 @@ void tst_QScriptContext::calledAsConstructor() fun.construct(); QVERIFY(fun.property("calledAsConstructor").toBool()); } - { - eng.globalObject().setProperty("fun1", fun1); - eng.evaluate("fun1();"); - QVERIFY(!fun1.property("calledAsConstructor").toBool()); - eng.evaluate("new fun1();"); - QVERIFY(fun1.property("calledAsConstructor").toBool()); - } - { - QScriptValue fun3 = eng.newFunction(storeCalledAsConstructorV3); - eng.globalObject().setProperty("fun3", fun3); - eng.evaluate("function test() { fun3() }"); - eng.evaluate("test();"); - QVERIFY(!fun3.property("calledAsConstructor").toBool()); - eng.evaluate("new test();"); - if (qt_script_isJITEnabled()) - QEXPECT_FAIL("", "QTBUG-6132: calledAsConstructor is not correctly set for JS functions when JIT is enabled", Continue); - QVERIFY(fun3.property("calledAsConstructor").toBool()); - } +} + +void tst_QScriptContext::calledAsConstructor_fromJS() +{ + QScriptEngine eng; + QScriptValue fun1 = eng.newFunction(storeCalledAsConstructor); + eng.globalObject().setProperty("fun1", fun1); + eng.evaluate("fun1();"); + QVERIFY(!fun1.property("calledAsConstructor").toBool()); + eng.evaluate("new fun1();"); + QVERIFY(fun1.property("calledAsConstructor").toBool()); +} +void tst_QScriptContext::calledAsConstructor_parentContext() +{ + QScriptEngine eng; + QScriptValue fun3 = eng.newFunction(storeCalledAsConstructorV3); + eng.globalObject().setProperty("fun3", fun3); + eng.evaluate("function test() { fun3() }"); + eng.evaluate("test();"); + QVERIFY(!fun3.property("calledAsConstructor").toBool()); + eng.evaluate("new test();"); + if (qt_script_isJITEnabled()) + QEXPECT_FAIL("", "QTBUG-6132: calledAsConstructor is not correctly set for JS functions when JIT is enabled", Continue); + QVERIFY(fun3.property("calledAsConstructor").toBool()); } static QScriptValue argumentsObjectInNative_test1(QScriptContext *ctx, QScriptEngine *eng) @@ -1269,7 +1327,7 @@ void tst_QScriptContext::jsActivationObject() QScriptValue result1 = eng.evaluate("f2('hello', 'useless', 'world')"); QScriptValue result2 = eng.evaluate("f3()"); QVERIFY(result1.isObject()); - QEXPECT_FAIL("", "JSC optimize away the activation object", Abort); + QEXPECT_FAIL("", "QTBUG-10313: JSC optimizes away the activation object", Abort); QCOMPARE(result1.property("v1").toInt32() , 42); QCOMPARE(result1.property("arguments").property(1).toString() , QString::fromLatin1("useless")); QVERIFY(result2.isObject()); -- cgit v0.12 From e3be9077b284174a97bff82f52ffbfda11369d18 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Wed, 2 Feb 2011 15:18:33 +0100 Subject: Split QScriptEngine test into smaller functions Also add comments to clarify what we're testing, and remove dependency on precise error messages (we don't care what the precise wording of an error is, only that it is e.g. a TypeError). Task-number: QTBUG-16746 Reviewed-by: Jedrzej Nowacki --- tests/auto/qscriptengine/tst_qscriptengine.cpp | 856 +++++++++++++++---------- 1 file changed, 529 insertions(+), 327 deletions(-) diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp index 956f06c..2f7e0b5 100644 --- a/tests/auto/qscriptengine/tst_qscriptengine.cpp +++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp @@ -93,7 +93,8 @@ private slots: void constructWithParent(); void currentContext(); void pushPopContext(); - void getSetDefaultPrototype(); + void getSetDefaultPrototype_int(); + void getSetDefaultPrototype_customType(); void newFunction(); void newFunctionWithArg(); void newFunctionWithProto(); @@ -109,7 +110,9 @@ private slots: void newVariant_promoteNonObject(); void newVariant_promoteNonQScriptObject(); void newRegExp(); + void jsRegExp(); void newDate(); + void jsParseDate(); void newQObject(); void newQObject_ownership(); void newQObject_promoteObject(); @@ -121,6 +124,7 @@ private slots: void newActivationObject(); void getSetGlobalObject(); void globalObjectProperties(); + void globalObjectProperties_enumerate(); void createGlobalObjectProperty(); void globalObjectGetterSetterProperty(); void customGlobalObjectWithPrototype(); @@ -136,7 +140,14 @@ private slots: void nestedEvaluate(); void uncaughtException(); void errorMessage_QT679(); - void valueConversion(); + void valueConversion_basic(); + void valueConversion_customType(); + void valueConversion_sequence(); + void valueConversion_QVariant(); + void valueConversion_hooliganTask248802(); + void valueConversion_basic2(); + void valueConversion_dateTime(); + void valueConversion_regExp(); void qScriptValueFromValue_noEngine(); void importExtension(); void infiniteRecursion(); @@ -152,32 +163,51 @@ private slots: void numberParsing_data(); void numberParsing(); void automaticSemicolonInsertion(); + void abortEvaluation_notEvaluating(); void abortEvaluation(); + void abortEvaluation_tryCatch(); + void abortEvaluation_fromNative(); void abortEvaluation_QTBUG9433(); - void isEvaluating(); + void isEvaluating_notEvaluating(); + void isEvaluating_fromNative(); + void isEvaluating_fromEvent(); void printFunctionWithCustomHandler(); void printThrowsException(); void errorConstructors(); - void argumentsProperty(); - void numberClass(); - void forInStatement(); - void functionExpression(); + void argumentsProperty_globalContext(); + void argumentsProperty_JS(); + void argumentsProperty_evaluateInNativeFunction(); + void jsNumberClass(); + void jsForInStatement_simple(); + void jsForInStatement_prototypeProperties(); + void jsForInStatement_mutateWhileIterating(); + void jsForInStatement_arrays(); + void jsForInStatement_nullAndUndefined(); + void jsFunctionDeclarationAsStatement(); void stringObjects(); + void jsStringPrototypeReplaceBugs(); void getterSetterThisObject_global(); void getterSetterThisObject_plain(); void getterSetterThisObject_prototypeChain(); void getterSetterThisObject_activation(); - void continueInSwitch(); - void readOnlyPrototypeProperty(); + void jsContinueInSwitch(); + void jsShadowReadOnlyPrototypeProperty(); void toObject(); - void reservedWords_data(); - void reservedWords(); - void futureReservedWords_data(); - void futureReservedWords(); - void throwInsideWithStatement(); - void getSetAgent(); - void reentrancy(); - void incDecNonObjectProperty(); + void jsReservedWords_data(); + void jsReservedWords(); + void jsFutureReservedWords_data(); + void jsFutureReservedWords(); + void jsThrowInsideWithStatement(); + void getSetAgent_ownership(); + void getSetAgent_deleteAgent(); + void getSetAgent_differentEngine(); + void reentrancy_stringHandles(); + void reentrancy_processEventsInterval(); + void reentrancy_typeConversion(); + void reentrancy_globalObjectProperties(); + void reentrancy_Array(); + void reentrancy_objectCreation(); + void jsIncDecNonObjectProperty(); void installTranslatorFunctions_data(); void installTranslatorFunctions(); void translateScript_data(); @@ -609,54 +639,65 @@ void tst_QScriptEngine::newRegExp() QCOMPARE(rexp.toRegExp().pattern(), QRegExp("foo").pattern()); } - { - QScriptValue r = eng.evaluate("/foo/gim"); - QVERIFY(r.isRegExp()); - QCOMPARE(r.toString(), QString::fromLatin1("/foo/gim")); +} + +void tst_QScriptEngine::jsRegExp() +{ + // See ECMA-262 Section 15.10, "RegExp Objects". + // These should really be JS-only tests, as they test the implementation's + // ECMA-compliance, not the C++ API. Compliance should already be covered + // by the Mozilla tests (qscriptjstestsuite). + // We can consider updating the expected results of this test if the + // RegExp implementation changes. - QScriptValue rxCtor = eng.globalObject().property("RegExp"); - QScriptValue r2 = rxCtor.call(QScriptValue(), QScriptValueList() << r); - QVERIFY(r2.isRegExp()); - QVERIFY(r2.strictlyEquals(r)); + QScriptEngine eng; + QScriptValue r = eng.evaluate("/foo/gim"); + QVERIFY(r.isRegExp()); + QCOMPARE(r.toString(), QString::fromLatin1("/foo/gim")); - QScriptValue r3 = rxCtor.call(QScriptValue(), QScriptValueList() << r << "gim"); - QVERIFY(r3.isError()); - QCOMPARE(r3.toString(), QString::fromLatin1("TypeError: Cannot supply flags when constructing one RegExp from another.")); + QScriptValue rxCtor = eng.globalObject().property("RegExp"); + QScriptValue r2 = rxCtor.call(QScriptValue(), QScriptValueList() << r); + QVERIFY(r2.isRegExp()); + QVERIFY(r2.strictlyEquals(r)); - QScriptValue r4 = rxCtor.call(QScriptValue(), QScriptValueList() << "foo" << "gim"); - QVERIFY(r4.isRegExp()); + QScriptValue r3 = rxCtor.call(QScriptValue(), QScriptValueList() << r << "gim"); + QVERIFY(r3.isError()); + QVERIFY(r3.toString().contains(QString::fromLatin1("TypeError"))); // Cannot supply flags when constructing one RegExp from another - QScriptValue r5 = rxCtor.construct(QScriptValueList() << r); - QVERIFY(r5.isRegExp()); - QCOMPARE(r5.toString(), QString::fromLatin1("/foo/gim")); - // In JSC, constructing a RegExp from another produces the same identical object. - // This is different from SpiderMonkey and old back-end. - QVERIFY(r5.strictlyEquals(r)); + QScriptValue r4 = rxCtor.call(QScriptValue(), QScriptValueList() << "foo" << "gim"); + QVERIFY(r4.isRegExp()); - QScriptValue r6 = rxCtor.construct(QScriptValueList() << "foo" << "bar"); - QVERIFY(r6.isError()); - QCOMPARE(r6.toString(), QString::fromLatin1("SyntaxError: Invalid regular expression: invalid regular expression flag")); + QScriptValue r5 = rxCtor.construct(QScriptValueList() << r); + QVERIFY(r5.isRegExp()); + QCOMPARE(r5.toString(), QString::fromLatin1("/foo/gim")); + // In JSC, constructing a RegExp from another produces the same identical object. + // This is different from SpiderMonkey and old back-end. + QVERIFY(r5.strictlyEquals(r)); - QScriptValue r7 = eng.evaluate("/foo/gimp"); - QVERIFY(r7.isError()); - QCOMPARE(r7.toString(), QString::fromLatin1("SyntaxError: Invalid regular expression: invalid regular expression flag")); + QScriptValue r6 = rxCtor.construct(QScriptValueList() << "foo" << "bar"); + QVERIFY(r6.isError()); + QVERIFY(r6.toString().contains(QString::fromLatin1("SyntaxError"))); // Invalid regular expression flag - QScriptValue r8 = eng.evaluate("/foo/migmigmig"); - QVERIFY(r8.isRegExp()); - QCOMPARE(r8.toString(), QString::fromLatin1("/foo/gim")); + QScriptValue r7 = eng.evaluate("/foo/gimp"); + QVERIFY(r7.isError()); + QVERIFY(r7.toString().contains(QString::fromLatin1("SyntaxError"))); // Invalid regular expression flag - QScriptValue r9 = rxCtor.construct(); - QVERIFY(r9.isRegExp()); - QCOMPARE(r9.toString(), QString::fromLatin1("/(?:)/")); + // JSC doesn't complain about duplicate flags. + QScriptValue r8 = eng.evaluate("/foo/migmigmig"); + QVERIFY(r8.isRegExp()); + QCOMPARE(r8.toString(), QString::fromLatin1("/foo/gim")); - QScriptValue r10 = rxCtor.construct(QScriptValueList() << "" << "gim"); - QVERIFY(r10.isRegExp()); - QCOMPARE(r10.toString(), QString::fromLatin1("/(?:)/gim")); + QScriptValue r9 = rxCtor.construct(); + QVERIFY(r9.isRegExp()); + QCOMPARE(r9.toString(), QString::fromLatin1("/(?:)/")); - QScriptValue r11 = rxCtor.construct(QScriptValueList() << "{1.*}" << "g"); - QVERIFY(r11.isRegExp()); - QCOMPARE(r11.toString(), QString::fromLatin1("/{1.*}/g")); - } + QScriptValue r10 = rxCtor.construct(QScriptValueList() << "" << "gim"); + QVERIFY(r10.isRegExp()); + QCOMPARE(r10.toString(), QString::fromLatin1("/(?:)/gim")); + + QScriptValue r11 = rxCtor.construct(QScriptValueList() << "{1.*}" << "g"); + QVERIFY(r11.isRegExp()); + QCOMPARE(r11.toString(), QString::fromLatin1("/{1.*}/g")); } void tst_QScriptEngine::newDate() @@ -695,7 +736,11 @@ void tst_QScriptEngine::newDate() // toDateTime() result should be in local time QCOMPARE(date.toDateTime(), dt.toLocalTime()); } +} +void tst_QScriptEngine::jsParseDate() +{ + QScriptEngine eng; // Date.parse() should return NaN when it fails { QScriptValue ret = eng.evaluate("Date.parse()"); @@ -1196,6 +1241,8 @@ static QScriptValue getSetFoo(QScriptContext *ctx, QScriptEngine *) void tst_QScriptEngine::globalObjectProperties() { + // See ECMA-262 Section 15.1, "The Global Object". + QScriptEngine eng; QScriptValue global = eng.globalObject(); @@ -1271,8 +1318,13 @@ void tst_QScriptEngine::globalObjectProperties() QVERIFY(!global.property("Math").isFunction()); QEXPECT_FAIL("", "[ECMA compliance] JSC sets DontDelete flag for Math object", Continue); QCOMPARE(global.propertyFlags("Math"), QScriptValue::SkipInEnumeration); +} + +void tst_QScriptEngine::globalObjectProperties_enumerate() +{ + QScriptEngine eng; + QScriptValue global = eng.globalObject(); - // enumeration QSet<QString> expectedNames; expectedNames << "isNaN" @@ -1500,7 +1552,7 @@ void tst_QScriptEngine::globalObjectWithCustomPrototype() { QScriptValue ret = engine.evaluate("this.__proto__ = { 'a': 123 }; a"); QVERIFY(ret.isNumber()); - QEXPECT_FAIL("", "QTBUG-9737", Continue); + QEXPECT_FAIL("", "QTBUG-9737: Prototype change in JS not reflected on C++ side", Continue); QVERIFY(ret.strictlyEquals(global.property("a"))); } } @@ -1510,7 +1562,9 @@ void tst_QScriptEngine::builtinFunctionNames_data() QTest::addColumn<QString>("expression"); QTest::addColumn<QString>("expectedName"); - QTest::newRow("print") << QString("print") << QString("print"); + // See ECMA-262 Chapter 15, "Standard Built-in ECMAScript Objects". + + QTest::newRow("print") << QString("print") << QString("print"); // QtScript extension. QTest::newRow("parseInt") << QString("parseInt") << QString("parseInt"); QTest::newRow("parseFloat") << QString("parseFloat") << QString("parseFloat"); QTest::newRow("isNaN") << QString("isNaN") << QString("isNaN"); @@ -1521,8 +1575,8 @@ void tst_QScriptEngine::builtinFunctionNames_data() QTest::newRow("encodeURIComponent") << QString("encodeURIComponent") << QString("encodeURIComponent"); QTest::newRow("escape") << QString("escape") << QString("escape"); QTest::newRow("unescape") << QString("unescape") << QString("unescape"); - QTest::newRow("version") << QString("version") << QString("version"); - QTest::newRow("gc") << QString("gc") << QString("gc"); + QTest::newRow("version") << QString("version") << QString("version"); // QtScript extension. + QTest::newRow("gc") << QString("gc") << QString("gc"); // QtScript extension. QTest::newRow("Array") << QString("Array") << QString("Array"); QTest::newRow("Array.prototype.toString") << QString("Array.prototype.toString") << QString("toString"); @@ -1673,6 +1727,7 @@ void tst_QScriptEngine::builtinFunctionNames() QFETCH(QString, expression); QFETCH(QString, expectedName); QScriptEngine eng; + // The "name" property is actually non-standard, but JSC supports it. QScriptValue ret = eng.evaluate(QString::fromLatin1("%0.name").arg(expression)); QVERIFY(ret.isString()); QCOMPARE(ret.toString(), expectedName); @@ -1894,22 +1949,24 @@ static QScriptValue eval_nested(QScriptContext *ctx, QScriptEngine *eng) return result; } +// Tests that nested evaluate uses the "this" that was passed. void tst_QScriptEngine::nestedEvaluate() { QScriptEngine eng; QScriptValue fun = eng.newFunction(eval_nested); eng.globalObject().setProperty("fun", fun); + // From JS function call { QScriptValue result = eng.evaluate("o = { id:'foo'}; o.fun = fun; o.fun()"); QCOMPARE(result.property("local_bar").toString(), QString("local")); QCOMPARE(result.property("thisObjectIdBefore").toString(), QString("foo")); QCOMPARE(result.property("thisObjectIdAfter").toString(), QString("foo")); QCOMPARE(result.property("evaluatedThisObjectId").toString(), QString("foo")); - QScriptValue bar = eng.evaluate("bar"); + QScriptValue bar = eng.evaluate("bar"); // Was introduced in local scope. QVERIFY(bar.isError()); - QCOMPARE(bar.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bar")); + QVERIFY(bar.toString().contains(QString::fromLatin1("ReferenceError"))); } - + // From QScriptValue::call() { QScriptValue result = fun.call(eng.evaluate("p = { id:'foo' }") , QScriptValueList() ); QCOMPARE(result.property("local_bar").toString(), QString("local")); @@ -1918,7 +1975,7 @@ void tst_QScriptEngine::nestedEvaluate() QCOMPARE(result.property("evaluatedThisObjectId").toString(), QString("foo")); QScriptValue bar = eng.evaluate("bar"); QVERIFY(bar.isError()); - QCOMPARE(bar.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bar")); + QVERIFY(bar.toString().contains(QString::fromLatin1("ReferenceError"))); } } @@ -1985,6 +2042,7 @@ void tst_QScriptEngine::errorMessage_QT679() engine.globalObject().setProperty("foo", 15); QScriptValue error = engine.evaluate("'hello world';\nfoo.bar.blah"); QVERIFY(error.isError()); + // The exact message is back-end specific and subject to change. QCOMPARE(error.toString(), QString::fromLatin1("TypeError: Result of expression 'foo.bar' [undefined] is not an object.")); } @@ -1997,37 +2055,40 @@ public: Q_DECLARE_METATYPE(Foo) Q_DECLARE_METATYPE(Foo*) -void tst_QScriptEngine::getSetDefaultPrototype() +void tst_QScriptEngine::getSetDefaultPrototype_int() { QScriptEngine eng; - { - QScriptValue object = eng.newObject(); - QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).isValid(), false); - eng.setDefaultPrototype(qMetaTypeId<int>(), object); - QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).strictlyEquals(object), true); - QScriptValue value = eng.newVariant(int(123)); - QCOMPARE(value.prototype().isObject(), true); - QCOMPARE(value.prototype().strictlyEquals(object), true); - eng.setDefaultPrototype(qMetaTypeId<int>(), QScriptValue()); - QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).isValid(), false); - QScriptValue value2 = eng.newVariant(int(123)); - QCOMPARE(value2.prototype().strictlyEquals(object), false); - } - { - QScriptValue object = eng.newObject(); - QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).isValid(), false); - eng.setDefaultPrototype(qMetaTypeId<Foo>(), object); - QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(object), true); - QScriptValue value = eng.newVariant(qVariantFromValue(Foo())); - QCOMPARE(value.prototype().isObject(), true); - QCOMPARE(value.prototype().strictlyEquals(object), true); + QScriptValue object = eng.newObject(); + QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).isValid(), false); + eng.setDefaultPrototype(qMetaTypeId<int>(), object); + QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).strictlyEquals(object), true); + QScriptValue value = eng.newVariant(int(123)); + QCOMPARE(value.prototype().isObject(), true); + QCOMPARE(value.prototype().strictlyEquals(object), true); - eng.setDefaultPrototype(qMetaTypeId<Foo>(), QScriptValue()); - QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).isValid(), false); - QScriptValue value2 = eng.newVariant(qVariantFromValue(Foo())); - QCOMPARE(value2.prototype().strictlyEquals(object), false); - } + eng.setDefaultPrototype(qMetaTypeId<int>(), QScriptValue()); + QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).isValid(), false); + QScriptValue value2 = eng.newVariant(int(123)); + QCOMPARE(value2.prototype().strictlyEquals(object), false); +} + +void tst_QScriptEngine::getSetDefaultPrototype_customType() +{ + QScriptEngine eng; + + QScriptValue object = eng.newObject(); + QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).isValid(), false); + eng.setDefaultPrototype(qMetaTypeId<Foo>(), object); + QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(object), true); + QScriptValue value = eng.newVariant(qVariantFromValue(Foo())); + QCOMPARE(value.prototype().isObject(), true); + QCOMPARE(value.prototype().strictlyEquals(object), true); + + eng.setDefaultPrototype(qMetaTypeId<Foo>(), QScriptValue()); + QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).isValid(), false); + QScriptValue value2 = eng.newVariant(qVariantFromValue(Foo())); + QCOMPARE(value2.prototype().strictlyEquals(object), false); } static QScriptValue fooToScriptValue(QScriptEngine *eng, const Foo &foo) @@ -2061,7 +2122,7 @@ Q_DECLARE_METATYPE(QStack<int>) Q_DECLARE_METATYPE(QQueue<char>) Q_DECLARE_METATYPE(QLinkedList<QStack<int> >) -void tst_QScriptEngine::valueConversion() +void tst_QScriptEngine::valueConversion_basic() { QScriptEngine eng; { @@ -2123,7 +2184,11 @@ void tst_QScriptEngine::valueConversion() QCOMPARE(qScriptValueToValue<QChar>(code), c); QCOMPARE(qScriptValueToValue<QChar>(qScriptValueFromValue(&eng, c)), c); } +} +void tst_QScriptEngine::valueConversion_customType() +{ + QScriptEngine eng; { // a type that we don't have built-in conversion of // (it's stored as a variant) @@ -2169,7 +2234,11 @@ void tst_QScriptEngine::valueConversion() QVERIFY(fooVal2.property("x").strictlyEquals(QScriptValue(&eng, 56))); QVERIFY(fooVal2.property("y").strictlyEquals(QScriptValue(&eng, 78))); } +} +void tst_QScriptEngine::valueConversion_sequence() +{ + QScriptEngine eng; qScriptRegisterSequenceMetaType<QLinkedList<QString> >(&eng); { @@ -2248,7 +2317,11 @@ void tst_QScriptEngine::valueConversion() QCOMPARE(qscriptvalue_cast<QObjectList>(val), lst); } +} +void tst_QScriptEngine::valueConversion_QVariant() +{ + QScriptEngine eng; // qScriptValueFromValue() should be "smart" when the argument is a QVariant { QScriptValue val = qScriptValueFromValue(&eng, QVariant()); @@ -2325,7 +2398,12 @@ void tst_QScriptEngine::valueConversion() QCOMPARE(val.toVariant(), var); } - // task 248802 + QCOMPARE(qscriptvalue_cast<QVariant>(QScriptValue(123)), QVariant(123)); +} + +void tst_QScriptEngine::valueConversion_hooliganTask248802() +{ + QScriptEngine eng; qScriptRegisterMetaType<Foo>(&eng, fooToScriptValueV2, fooFromScriptValueV2); { QScriptValue num(&eng, 123); @@ -2343,6 +2421,11 @@ void tst_QScriptEngine::valueConversion() QCOMPARE(foo.x, 123); } +} + +void tst_QScriptEngine::valueConversion_basic2() +{ + QScriptEngine eng; // more built-in types { QScriptValue val = qScriptValueFromValue(&eng, uint(123)); @@ -2379,6 +2462,11 @@ void tst_QScriptEngine::valueConversion() QVERIFY(val.isNumber()); QCOMPARE(val.toInt32(), 123); } +} + +void tst_QScriptEngine::valueConversion_dateTime() +{ + QScriptEngine eng; { QDateTime in = QDateTime::currentDateTime(); QScriptValue val = qScriptValueFromValue(&eng, in); @@ -2391,6 +2479,11 @@ void tst_QScriptEngine::valueConversion() QVERIFY(val.isDate()); QCOMPARE(val.toDateTime().date(), in); } +} + +void tst_QScriptEngine::valueConversion_regExp() +{ + QScriptEngine eng; { QRegExp in = QRegExp("foo"); QScriptValue val = qScriptValueFromValue(&eng, in); @@ -2416,8 +2509,6 @@ void tst_QScriptEngine::valueConversion() QEXPECT_FAIL("", "QTBUG-6136: JSC-based back-end doesn't preserve QRegExp::minimal (always false)", Continue); QCOMPARE(val.toRegExp().isMinimal(), in.isMinimal()); } - - QCOMPARE(qscriptvalue_cast<QVariant>(QScriptValue(123)), QVariant(123)); } void tst_QScriptEngine::qScriptValueFromValue_noEngine() @@ -2522,7 +2613,7 @@ void tst_QScriptEngine::importExtension() QEXPECT_FAIL("", "JSC throws syntax error eagerly", Continue); QCOMPARE(eng.uncaughtExceptionLineNumber(), 4); QVERIFY(ret.isError()); - QCOMPARE(ret.property("message").toString(), QLatin1String("Parse error")); + QVERIFY(ret.toString().contains(QLatin1String("SyntaxError"))); } QStringList imp = eng.importedExtensions(); QCOMPARE(imp.size(), 2); @@ -2548,6 +2639,9 @@ static QScriptValue recurse2(QScriptContext *ctx, QScriptEngine *eng) void tst_QScriptEngine::infiniteRecursion() { + // Infinite recursion in JS should cause the VM to throw an error + // when the JS stack is exhausted. + // The exact error is back-end specific and subject to change. const QString stackOverflowError = QString::fromLatin1("RangeError: Maximum call stack size exceeded."); QScriptEngine eng; { @@ -2610,6 +2704,8 @@ void tst_QScriptEngine::castWithPrototypeChain() baz2.b = 456; QScriptValue baz2Value = qScriptValueFromValue(&eng, &baz2); { + // qscriptvalue_cast() does magic; if the QScriptValue contains + // t of type T, and the target type is T*, &t is returned. Baz *pbaz = qscriptvalue_cast<Baz*>(baz2Value); QVERIFY(pbaz != 0); QCOMPARE(pbaz->b, baz2.b); @@ -2632,6 +2728,13 @@ void tst_QScriptEngine::castWithPrototypeChain() } // establish chain -- now casting should work + // Why? because qscriptvalue_cast() does magic again. + // It the instance itself is not of type T, qscriptvalue_cast() + // searches the prototype chain for T, and if it finds one, it infers + // that the instance can also be casted to that type. This cast is + // _not_ safe and thus relies on the developer doing the right thing. + // This is an undocumented feature to enable qscriptvalue_cast() to + // be used by prototype functions to cast the JS this-object to C++. bazProto.setPrototype(barProto); { @@ -2740,6 +2843,9 @@ void tst_QScriptEngine::collectGarbage() void tst_QScriptEngine::reportAdditionalMemoryCost() { QScriptEngine eng; + // There isn't any reliable way to test whether calling + // this function affects garbage collection responsiveness; + // the best we can do is call it with a few different values. for (int x = 0; x < 1000; ++x) { eng.reportAdditionalMemoryCost(0); eng.reportAdditionalMemoryCost(10); @@ -2757,6 +2863,8 @@ void tst_QScriptEngine::reportAdditionalMemoryCost() void tst_QScriptEngine::gcWithNestedDataStructure() { + // The GC must be able to traverse deeply nested objects, otherwise this + // test would crash. QScriptEngine eng; eng.evaluate( "function makeList(size)" @@ -2778,6 +2886,7 @@ void tst_QScriptEngine::gcWithNestedDataStructure() if (x == 1) eng.evaluate("gc()"); QScriptValue l = head; + // Make sure all the nodes are still alive. for (int i = 0; i < 200; ++i) { QCOMPARE(l.property("data").toString(), QString::number(i)); l = l.property("next"); @@ -2807,6 +2916,8 @@ void tst_QScriptEngine::processEventsWhileRunning() if (x == 0) eng.pushContext(); + // This is running for a silly amount of time just to make sure + // the script doesn't finish before event processing is triggered. QString script = QString::fromLatin1( "var end = Number(new Date()) + 2000;" "var x = 0;" @@ -3012,6 +3123,8 @@ void tst_QScriptEngine::numberParsing() } // see ECMA-262, section 7.9 +// This is testing ECMA compliance, not our C++ API, but it's important that +// the back-end is conformant in this regard. void tst_QScriptEngine::automaticSemicolonInsertion() { QScriptEngine eng; @@ -3257,7 +3370,7 @@ static QScriptValue myFunctionAbortingEvaluation(QScriptContext *, QScriptEngine return eng->nullValue(); // should be ignored } -void tst_QScriptEngine::abortEvaluation() +void tst_QScriptEngine::abortEvaluation_notEvaluating() { QScriptEngine eng; @@ -3270,7 +3383,11 @@ void tst_QScriptEngine::abortEvaluation() QVERIFY(ret.isString()); QCOMPARE(ret.toString(), QString::fromLatin1("ciao")); } +} +void tst_QScriptEngine::abortEvaluation() +{ + QScriptEngine eng; EventReceiver3 receiver(&eng); eng.setProcessEventsInterval(100); @@ -3301,6 +3418,13 @@ void tst_QScriptEngine::abortEvaluation() } } +} + +void tst_QScriptEngine::abortEvaluation_tryCatch() +{ + QScriptEngine eng; + EventReceiver3 receiver(&eng); + eng.setProcessEventsInterval(100); // scripts cannot intercept the abortion with try/catch for (int y = 0; y < 4; ++y) { QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1))); @@ -3334,13 +3458,15 @@ void tst_QScriptEngine::abortEvaluation() break; } } +} - { - QScriptValue fun = eng.newFunction(myFunctionAbortingEvaluation); - eng.globalObject().setProperty("myFunctionAbortingEvaluation", fun); - QScriptValue ret = eng.evaluate("myFunctionAbortingEvaluation()"); - QVERIFY(!ret.isValid()); - } +void tst_QScriptEngine::abortEvaluation_fromNative() +{ + QScriptEngine eng; + QScriptValue fun = eng.newFunction(myFunctionAbortingEvaluation); + eng.globalObject().setProperty("myFunctionAbortingEvaluation", fun); + QScriptValue ret = eng.evaluate("myFunctionAbortingEvaluation()"); + QVERIFY(!ret.isValid()); } class ThreadedEngine : public QThread { @@ -3407,7 +3533,7 @@ public: bool wasEvaluating; }; -void tst_QScriptEngine::isEvaluating() +void tst_QScriptEngine::isEvaluating_notEvaluating() { QScriptEngine eng; @@ -3419,30 +3545,34 @@ void tst_QScriptEngine::isEvaluating() QVERIFY(!eng.isEvaluating()); eng.evaluate("0 = 0"); QVERIFY(!eng.isEvaluating()); +} - { - QScriptValue fun = eng.newFunction(myFunctionReturningIsEvaluating); - eng.globalObject().setProperty("myFunctionReturningIsEvaluating", fun); - QScriptValue ret = eng.evaluate("myFunctionReturningIsEvaluating()"); - QVERIFY(ret.isBoolean()); - QVERIFY(ret.toBoolean()); - } +void tst_QScriptEngine::isEvaluating_fromNative() +{ + QScriptEngine eng; + QScriptValue fun = eng.newFunction(myFunctionReturningIsEvaluating); + eng.globalObject().setProperty("myFunctionReturningIsEvaluating", fun); + QScriptValue ret = eng.evaluate("myFunctionReturningIsEvaluating()"); + QVERIFY(ret.isBoolean()); + QVERIFY(ret.toBoolean()); +} - { - EventReceiver4 receiver(&eng); - QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1))); +void tst_QScriptEngine::isEvaluating_fromEvent() +{ + QScriptEngine eng; + EventReceiver4 receiver(&eng); + QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1))); - QString script = QString::fromLatin1( - "var end = Number(new Date()) + 1000;" - "var x = 0;" - "while (Number(new Date()) < end) {" - " ++x;" - "}"); + QString script = QString::fromLatin1( + "var end = Number(new Date()) + 1000;" + "var x = 0;" + "while (Number(new Date()) < end) {" + " ++x;" + "}"); - eng.setProcessEventsInterval(100); - eng.evaluate(script); - QVERIFY(receiver.wasEvaluating); - } + eng.setProcessEventsInterval(100); + eng.evaluate(script); + QVERIFY(receiver.wasEvaluating); } static QtMsgType theMessageType; @@ -3456,24 +3586,33 @@ static void myMsgHandler(QtMsgType type, const char *msg) void tst_QScriptEngine::printFunctionWithCustomHandler() { + // The built-in print() function passes the output to Qt's message + // handler. By installing a custom message handler, the output can be + // redirected without changing the print() function itself. + // This behavior is not documented. QScriptEngine eng; QtMsgHandler oldHandler = qInstallMsgHandler(myMsgHandler); QVERIFY(eng.globalObject().property("print").isFunction()); + theMessageType = QtSystemMsg; QVERIFY(theMessage.isEmpty()); QVERIFY(eng.evaluate("print('test')").isUndefined()); QCOMPARE(theMessageType, QtDebugMsg); QCOMPARE(theMessage, QString::fromLatin1("test")); + theMessageType = QtSystemMsg; theMessage.clear(); QVERIFY(eng.evaluate("print(3, true, 'little pigs')").isUndefined()); QCOMPARE(theMessageType, QtDebugMsg); QCOMPARE(theMessage, QString::fromLatin1("3 true little pigs")); + qInstallMsgHandler(oldHandler); } void tst_QScriptEngine::printThrowsException() { + // If an argument to print() causes an exception to be thrown when + // it's converted to a string, print() should propagate the exception. QScriptEngine eng; QScriptValue ret = eng.evaluate("print({ toString: function() { throw 'foo'; } });"); QVERIFY(eng.hasUncaughtException()); @@ -3506,34 +3645,30 @@ void tst_QScriptEngine::errorConstructors() } } -static QScriptValue argumentsProperty_fun(QScriptContext *, QScriptEngine *eng) +void tst_QScriptEngine::argumentsProperty_globalContext() { - eng->evaluate("var a = arguments[0];"); - eng->evaluate("arguments[0] = 200;"); - return eng->evaluate("a + arguments[0]"); + QScriptEngine eng; + { + // Unlike function calls, the global context doesn't have an + // arguments property. + QScriptValue ret = eng.evaluate("arguments"); + QVERIFY(ret.isError()); + QVERIFY(ret.toString().contains(QString::fromLatin1("ReferenceError"))); + } + eng.evaluate("arguments = 10"); + { + QScriptValue ret = eng.evaluate("arguments"); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toInt32(), 10); + } + QVERIFY(eng.evaluate("delete arguments").toBoolean()); + QVERIFY(!eng.globalObject().property("arguments").isValid()); } - -void tst_QScriptEngine::argumentsProperty() +void tst_QScriptEngine::argumentsProperty_JS() { { QScriptEngine eng; - { - QScriptValue ret = eng.evaluate("arguments"); - QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: arguments")); - } - eng.evaluate("arguments = 10"); - { - QScriptValue ret = eng.evaluate("arguments"); - QVERIFY(ret.isNumber()); - QCOMPARE(ret.toInt32(), 10); - } - QVERIFY(eng.evaluate("delete arguments").toBoolean()); - QVERIFY(!eng.globalObject().property("arguments").isValid()); - } - { - QScriptEngine eng; eng.evaluate("o = { arguments: 123 }"); QScriptValue ret = eng.evaluate("with (o) { arguments; }"); QVERIFY(ret.isNumber()); @@ -3542,25 +3677,40 @@ void tst_QScriptEngine::argumentsProperty() { QScriptEngine eng; QVERIFY(!eng.globalObject().property("arguments").isValid()); + // This is testing ECMA-262 compliance. In function calls, "arguments" + // appears like a local variable, and it can be replaced. QScriptValue ret = eng.evaluate("(function() { arguments = 456; return arguments; })()"); QVERIFY(ret.isNumber()); QCOMPARE(ret.toInt32(), 456); QVERIFY(!eng.globalObject().property("arguments").isValid()); } +} - { - QScriptEngine eng; - QScriptValue fun = eng.newFunction(argumentsProperty_fun); - eng.globalObject().setProperty("fun", eng.newFunction(argumentsProperty_fun)); - QScriptValue result = eng.evaluate("fun(18)"); - QVERIFY(result.isNumber()); - QCOMPARE(result.toInt32(), 218); - } +static QScriptValue argumentsProperty_fun(QScriptContext *, QScriptEngine *eng) +{ + // Since evaluate() is done in the current context, "arguments" should + // refer to currentContext()->argumentsObject(). + // This is for consistency with the built-in JS eval() function. + eng->evaluate("var a = arguments[0];"); + eng->evaluate("arguments[0] = 200;"); + return eng->evaluate("a + arguments[0]"); } -void tst_QScriptEngine::numberClass() +void tst_QScriptEngine::argumentsProperty_evaluateInNativeFunction() { QScriptEngine eng; + QScriptValue fun = eng.newFunction(argumentsProperty_fun); + eng.globalObject().setProperty("fun", eng.newFunction(argumentsProperty_fun)); + QScriptValue result = eng.evaluate("fun(18)"); + QVERIFY(result.isNumber()); + QCOMPARE(result.toInt32(), 200+18); +} + +void tst_QScriptEngine::jsNumberClass() +{ + // See ECMA-262 Section 15.7, "Number Objects". + + QScriptEngine eng; QScriptValue ctor = eng.globalObject().property("Number"); QVERIFY(ctor.property("length").isNumber()); @@ -3669,7 +3819,7 @@ void tst_QScriptEngine::numberClass() } } -void tst_QScriptEngine::forInStatement() +void tst_QScriptEngine::jsForInStatement_simple() { QScriptEngine eng; { @@ -3692,8 +3842,11 @@ void tst_QScriptEngine::forInStatement() QCOMPARE(lst.at(0), QString::fromLatin1("p")); QCOMPARE(lst.at(1), QString::fromLatin1("q")); } +} - // properties in prototype +void tst_QScriptEngine::jsForInStatement_prototypeProperties() +{ + QScriptEngine eng; { QScriptValue ret = eng.evaluate("o = { }; o.__proto__ = { p: 123 }; r = [];" "for (var p in o) r[r.length] = p; r"); @@ -3718,6 +3871,11 @@ void tst_QScriptEngine::forInStatement() QCOMPARE(lst.at(0), QString::fromLatin1("p")); } +} + +void tst_QScriptEngine::jsForInStatement_mutateWhileIterating() +{ + QScriptEngine eng; // deleting property during enumeration { QScriptValue ret = eng.evaluate("o = { p: 123 }; r = [];" @@ -3743,7 +3901,11 @@ void tst_QScriptEngine::forInStatement() QCOMPARE(lst.at(0), QString::fromLatin1("p")); } - // arrays +} + +void tst_QScriptEngine::jsForInStatement_arrays() +{ + QScriptEngine eng; { QScriptValue ret = eng.evaluate("a = [123, 456]; r = [];" "for (var p in a) r[r.length] = p; r"); @@ -3774,10 +3936,11 @@ void tst_QScriptEngine::forInStatement() QCOMPARE(lst.at(3), QString::fromLatin1("2")); QCOMPARE(lst.at(4), QString::fromLatin1("bar")); } +} - // null and undefined - // according to the spec, we should throw an exception; however, for - // compability with the real world, we don't +void tst_QScriptEngine::jsForInStatement_nullAndUndefined() +{ + QScriptEngine eng; { QScriptValue ret = eng.evaluate("r = true; for (var p in undefined) r = false; r"); QVERIFY(ret.isBool()); @@ -3790,9 +3953,17 @@ void tst_QScriptEngine::forInStatement() } } -void tst_QScriptEngine::functionExpression() +void tst_QScriptEngine::jsFunctionDeclarationAsStatement() { - // task 175679 + // ECMA-262 does not allow function declarations to be used as statements, + // but several popular implementations (including JSC) do. See the NOTE + // at the beginning of chapter 12 in ECMA-262 5th edition, where it's + // recommended that implementations either disallow this usage or issue + // a warning. + // Since we had a bug report long ago about QtScript not supporting this + // "feature" (and thus deviating from other implementations), we still + // check this behavior. + QScriptEngine eng; QVERIFY(!eng.globalObject().property("bar").isValid()); eng.evaluate("function foo(arg) {\n" @@ -3825,6 +3996,8 @@ void tst_QScriptEngine::functionExpression() void tst_QScriptEngine::stringObjects() { + // See ECMA-262 Section 15.5, "String Objects". + QScriptEngine eng; QString str("ciao"); // in C++ @@ -3886,7 +4059,11 @@ void tst_QScriptEngine::stringObjects() QVERIFY(ret7.isBoolean()); QVERIFY(ret7.toBoolean()); } +} +void tst_QScriptEngine::jsStringPrototypeReplaceBugs() +{ + QScriptEngine eng; // task 212440 { QScriptValue ret = eng.evaluate("replace_args = []; \"a a a\".replace(/(a)/g, function() { replace_args.push(arguments); }); replace_args"); @@ -4038,8 +4215,10 @@ void tst_QScriptEngine::getterSetterThisObject_activation() } } -void tst_QScriptEngine::continueInSwitch() +void tst_QScriptEngine::jsContinueInSwitch() { + // This is testing ECMA-262 compliance, not C++ API. + QScriptEngine eng; // switch - continue { @@ -4116,35 +4295,17 @@ void tst_QScriptEngine::continueInSwitch() } } -void tst_QScriptEngine::readOnlyPrototypeProperty() +void tst_QScriptEngine::jsShadowReadOnlyPrototypeProperty() { - QSKIP("JSC semantics differ from old back-end and SpiderMonkey", SkipAll); + // SpiderMonkey has different behavior than JSC and V8; it disallows + // creating a property on the instance if there's a property with the + // same name in the prototype, and that property is read-only. We + // adopted that behavior in the old (4.5) QtScript back-end, but it + // just seems weird -- and non-compliant. Adopt the JSC behavior instead. QScriptEngine eng; - QCOMPARE(eng.evaluate("o = {}; o.__proto__ = parseInt; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length = 4; o.length").toInt32(), 2); - QVERIFY(!eng.evaluate("o.hasOwnProperty('length')").toBoolean()); - QCOMPARE(eng.evaluate("o.length *= 2; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length /= 2; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length %= 2; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length += 2; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length -= 2; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length <<= 2; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length >>= 2; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length >>>= 2; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length &= 0; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length ^= 255; o.length").toInt32(), 2); - QCOMPARE(eng.evaluate("o.length |= 255; o.length").toInt32(), 2); - - { - QScriptValue ret = eng.evaluate("o.__defineGetter__('length', function() {})"); - QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("Error: cannot redefine read-only property")); - } - { - QScriptValue ret = eng.evaluate("o.__defineSetter__('length', function() {})"); - QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("Error: cannot redefine read-only property")); - } + QVERIFY(eng.evaluate("o = {}; o.__proto__ = parseInt; o.length").isNumber()); + QCOMPARE(eng.evaluate("o.length = 123; o.length").toInt32(), 123); + QVERIFY(eng.evaluate("o.hasOwnProperty('length')").toBoolean()); } void tst_QScriptEngine::toObject() @@ -4226,7 +4387,7 @@ void tst_QScriptEngine::toObject() QVERIFY(stringValue.isString()); } -void tst_QScriptEngine::reservedWords_data() +void tst_QScriptEngine::jsReservedWords_data() { QTest::addColumn<QString>("word"); QTest::newRow("break") << QString("break"); @@ -4259,8 +4420,13 @@ void tst_QScriptEngine::reservedWords_data() QTest::newRow("with") << QString("with"); } -void tst_QScriptEngine::reservedWords() +void tst_QScriptEngine::jsReservedWords() { + // See ECMA-262 Section 7.6.1, "Reserved Words". + // We prefer that the implementation is less strict than the spec; e.g. + // it's good to allow reserved words as identifiers in object literals, + // and when accessing properties using dot notation. + QFETCH(QString, word); { QScriptEngine eng; @@ -4298,7 +4464,7 @@ void tst_QScriptEngine::reservedWords() } } -void tst_QScriptEngine::futureReservedWords_data() +void tst_QScriptEngine::jsFutureReservedWords_data() { QTest::addColumn<QString>("word"); QTest::addColumn<bool>("allowed"); @@ -4335,8 +4501,12 @@ void tst_QScriptEngine::futureReservedWords_data() QTest::newRow("volatile") << QString("volatile") << true; } -void tst_QScriptEngine::futureReservedWords() +void tst_QScriptEngine::jsFutureReservedWords() { + // See ECMA-262 Section 7.6.1.2, "Future Reserved Words". + // In real-world implementations, most of these words are + // actually allowed as normal identifiers. + QFETCH(QString, word); QFETCH(bool, allowed); { @@ -4364,8 +4534,10 @@ void tst_QScriptEngine::futureReservedWords() } } -void tst_QScriptEngine::throwInsideWithStatement() +void tst_QScriptEngine::jsThrowInsideWithStatement() { + // This is testing ECMA-262 compliance, not C++ API. + // task 209988 QScriptEngine eng; { @@ -4379,7 +4551,7 @@ void tst_QScriptEngine::throwInsideWithStatement() " bad;" "}"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bad")); + QVERIFY(ret.toString().contains(QString::fromLatin1("ReferenceError"))); } { QScriptValue ret = eng.evaluate( @@ -4392,7 +4564,7 @@ void tst_QScriptEngine::throwInsideWithStatement() " bad;" "}"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bad")); + QVERIFY(ret.toString().contains(QString::fromLatin1("ReferenceError"))); } { eng.clearExceptions(); @@ -4419,7 +4591,7 @@ void tst_QScriptEngine::throwInsideWithStatement() QVERIFY(ret.isNumber()); QScriptValue ret2 = eng.evaluate("bug"); QVERIFY(ret2.isError()); - QCOMPARE(ret2.toString(), QString::fromLatin1("ReferenceError: Can't find variable: bug")); + QVERIFY(ret2.toString().contains(QString::fromLatin1("ReferenceError"))); } } @@ -4429,106 +4601,116 @@ public: TestAgent(QScriptEngine *engine) : QScriptEngineAgent(engine) {} }; -void tst_QScriptEngine::getSetAgent() +void tst_QScriptEngine::getSetAgent_ownership() { - // case 1: engine deleted before agent --> agent deleted too - { - QScriptEngine *eng = new QScriptEngine; - QCOMPARE(eng->agent(), (QScriptEngineAgent*)0); - TestAgent *agent = new TestAgent(eng); - eng->setAgent(agent); - QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent); - eng->setAgent(0); // the engine maintains ownership of the old agent - QCOMPARE(eng->agent(), (QScriptEngineAgent*)0); - delete eng; - } - // case 2: agent deleted before engine --> engine's agent should become 0 - { - QScriptEngine *eng = new QScriptEngine; - TestAgent *agent = new TestAgent(eng); - eng->setAgent(agent); - QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent); - delete agent; - QCOMPARE(eng->agent(), (QScriptEngineAgent*)0); - eng->evaluate("(function(){ return 123; })()"); - delete eng; - } - { - QScriptEngine eng; - QScriptEngine eng2; - TestAgent *agent = new TestAgent(&eng); - QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::setAgent(): cannot set agent belonging to different engine"); - eng2.setAgent(agent); - QCOMPARE(eng2.agent(), (QScriptEngineAgent*)0); - } + // engine deleted before agent --> agent deleted too + QScriptEngine *eng = new QScriptEngine; + QCOMPARE(eng->agent(), (QScriptEngineAgent*)0); + TestAgent *agent = new TestAgent(eng); + eng->setAgent(agent); + QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent); + eng->setAgent(0); // the engine maintains ownership of the old agent + QCOMPARE(eng->agent(), (QScriptEngineAgent*)0); + delete eng; } -void tst_QScriptEngine::reentrancy() +void tst_QScriptEngine::getSetAgent_deleteAgent() { + // agent deleted before engine --> engine's agent should become 0 + QScriptEngine *eng = new QScriptEngine; + TestAgent *agent = new TestAgent(eng); + eng->setAgent(agent); + QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent); + delete agent; + QCOMPARE(eng->agent(), (QScriptEngineAgent*)0); + eng->evaluate("(function(){ return 123; })()"); + delete eng; +} + +void tst_QScriptEngine::getSetAgent_differentEngine() +{ + QScriptEngine eng; + QScriptEngine eng2; + TestAgent *agent = new TestAgent(&eng); + QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::setAgent(): cannot set agent belonging to different engine"); + eng2.setAgent(agent); + QCOMPARE(eng2.agent(), (QScriptEngineAgent*)0); +} + +void tst_QScriptEngine::reentrancy_stringHandles() +{ + QScriptEngine eng1; + QScriptEngine eng2; + QScriptString s1 = eng1.toStringHandle("foo"); + QScriptString s2 = eng2.toStringHandle("foo"); + QVERIFY(s1 != s2); +} + +void tst_QScriptEngine::reentrancy_processEventsInterval() +{ + QScriptEngine eng1; + QScriptEngine eng2; + eng1.setProcessEventsInterval(123); + QCOMPARE(eng2.processEventsInterval(), -1); + eng2.setProcessEventsInterval(456); + QCOMPARE(eng1.processEventsInterval(), 123); +} + +void tst_QScriptEngine::reentrancy_typeConversion() +{ + QScriptEngine eng1; + QScriptEngine eng2; + qScriptRegisterMetaType<Foo>(&eng1, fooToScriptValue, fooFromScriptValue); + Foo foo; + foo.x = 12; + foo.y = 34; { - QScriptEngine eng1; - QScriptEngine eng2; - QScriptString s1 = eng1.toStringHandle("foo"); - QScriptString s2 = eng2.toStringHandle("foo"); - QVERIFY(s1 != s2); - } - { - QScriptEngine eng1; - QScriptEngine eng2; - eng1.setProcessEventsInterval(123); - QCOMPARE(eng2.processEventsInterval(), -1); - eng2.setProcessEventsInterval(456); - QCOMPARE(eng1.processEventsInterval(), 123); + QScriptValue fooVal = qScriptValueFromValue(&eng1, foo); + QVERIFY(fooVal.isObject()); + QVERIFY(!fooVal.isVariant()); + QCOMPARE(fooVal.property("x").toInt32(), 12); + QCOMPARE(fooVal.property("y").toInt32(), 34); + fooVal.setProperty("x", 56); + fooVal.setProperty("y", 78); + + Foo foo2 = qScriptValueToValue<Foo>(fooVal); + QCOMPARE(foo2.x, 56); + QCOMPARE(foo2.y, 78); } { - QScriptEngine eng1; - QScriptEngine eng2; - qScriptRegisterMetaType<Foo>(&eng1, fooToScriptValue, fooFromScriptValue); - Foo foo; - foo.x = 12; - foo.y = 34; - { - QScriptValue fooVal = qScriptValueFromValue(&eng1, foo); - QVERIFY(fooVal.isObject()); - QVERIFY(!fooVal.isVariant()); - QCOMPARE(fooVal.property("x").toInt32(), 12); - QCOMPARE(fooVal.property("y").toInt32(), 34); - fooVal.setProperty("x", 56); - fooVal.setProperty("y", 78); - - Foo foo2 = qScriptValueToValue<Foo>(fooVal); - QCOMPARE(foo2.x, 56); - QCOMPARE(foo2.y, 78); - } - { - QScriptValue fooVal = qScriptValueFromValue(&eng2, foo); - QVERIFY(fooVal.isVariant()); + QScriptValue fooVal = qScriptValueFromValue(&eng2, foo); + QVERIFY(fooVal.isVariant()); - Foo foo2 = qScriptValueToValue<Foo>(fooVal); - QCOMPARE(foo2.x, 12); - QCOMPARE(foo2.y, 34); - } - QVERIFY(!eng1.defaultPrototype(qMetaTypeId<Foo>()).isValid()); - QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid()); - QScriptValue proto1 = eng1.newObject(); - eng1.setDefaultPrototype(qMetaTypeId<Foo>(), proto1); - QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid()); - QScriptValue proto2 = eng2.newObject(); - eng2.setDefaultPrototype(qMetaTypeId<Foo>(), proto2); - QVERIFY(eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid()); - QVERIFY(eng1.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(proto1)); - } - { - QScriptEngine eng1; - QScriptEngine eng2; - QVERIFY(!eng2.globalObject().property("a").isValid()); - eng1.evaluate("a = 10"); - QVERIFY(eng1.globalObject().property("a").isNumber()); - QVERIFY(!eng2.globalObject().property("a").isValid()); - eng2.evaluate("a = 20"); - QVERIFY(eng2.globalObject().property("a").isNumber()); - QCOMPARE(eng1.globalObject().property("a").toInt32(), 10); + Foo foo2 = qScriptValueToValue<Foo>(fooVal); + QCOMPARE(foo2.x, 12); + QCOMPARE(foo2.y, 34); } + QVERIFY(!eng1.defaultPrototype(qMetaTypeId<Foo>()).isValid()); + QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid()); + QScriptValue proto1 = eng1.newObject(); + eng1.setDefaultPrototype(qMetaTypeId<Foo>(), proto1); + QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid()); + QScriptValue proto2 = eng2.newObject(); + eng2.setDefaultPrototype(qMetaTypeId<Foo>(), proto2); + QVERIFY(eng2.defaultPrototype(qMetaTypeId<Foo>()).isValid()); + QVERIFY(eng1.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(proto1)); +} + +void tst_QScriptEngine::reentrancy_globalObjectProperties() +{ + QScriptEngine eng1; + QScriptEngine eng2; + QVERIFY(!eng2.globalObject().property("a").isValid()); + eng1.evaluate("a = 10"); + QVERIFY(eng1.globalObject().property("a").isNumber()); + QVERIFY(!eng2.globalObject().property("a").isValid()); + eng2.evaluate("a = 20"); + QVERIFY(eng2.globalObject().property("a").isNumber()); + QCOMPARE(eng1.globalObject().property("a").toInt32(), 10); +} + +void tst_QScriptEngine::reentrancy_Array() +{ // weird bug with JSC backend { QScriptEngine eng; @@ -4540,79 +4722,82 @@ void tst_QScriptEngine::reentrancy() QScriptEngine eng; QCOMPARE(eng.evaluate("Array()").toString(), QString()); } +} +void tst_QScriptEngine::reentrancy_objectCreation() +{ + QScriptEngine eng1; + QScriptEngine eng2; { - QScriptEngine eng1; - QScriptEngine eng2; - { - QScriptValue d1 = eng1.newDate(0); - QScriptValue d2 = eng2.newDate(0); - QCOMPARE(d1.toDateTime(), d2.toDateTime()); - QCOMPARE(d2.toDateTime(), d1.toDateTime()); - } - { - QScriptValue r1 = eng1.newRegExp("foo", "gim"); - QScriptValue r2 = eng2.newRegExp("foo", "gim"); - QCOMPARE(r1.toRegExp(), r2.toRegExp()); - QCOMPARE(r2.toRegExp(), r1.toRegExp()); - } - { - QScriptValue o1 = eng1.newQObject(this); - QScriptValue o2 = eng2.newQObject(this); - QCOMPARE(o1.toQObject(), o2.toQObject()); - QCOMPARE(o2.toQObject(), o1.toQObject()); - } - { - QScriptValue mo1 = eng1.newQMetaObject(&staticMetaObject); - QScriptValue mo2 = eng2.newQMetaObject(&staticMetaObject); - QCOMPARE(mo1.toQMetaObject(), mo2.toQMetaObject()); - QCOMPARE(mo2.toQMetaObject(), mo1.toQMetaObject()); - } + QScriptValue d1 = eng1.newDate(0); + QScriptValue d2 = eng2.newDate(0); + QCOMPARE(d1.toDateTime(), d2.toDateTime()); + QCOMPARE(d2.toDateTime(), d1.toDateTime()); + } + { + QScriptValue r1 = eng1.newRegExp("foo", "gim"); + QScriptValue r2 = eng2.newRegExp("foo", "gim"); + QCOMPARE(r1.toRegExp(), r2.toRegExp()); + QCOMPARE(r2.toRegExp(), r1.toRegExp()); + } + { + QScriptValue o1 = eng1.newQObject(this); + QScriptValue o2 = eng2.newQObject(this); + QCOMPARE(o1.toQObject(), o2.toQObject()); + QCOMPARE(o2.toQObject(), o1.toQObject()); + } + { + QScriptValue mo1 = eng1.newQMetaObject(&staticMetaObject); + QScriptValue mo2 = eng2.newQMetaObject(&staticMetaObject); + QCOMPARE(mo1.toQMetaObject(), mo2.toQMetaObject()); + QCOMPARE(mo2.toQMetaObject(), mo1.toQMetaObject()); } } -void tst_QScriptEngine:: incDecNonObjectProperty() +void tst_QScriptEngine::jsIncDecNonObjectProperty() { + // This is testing ECMA-262 compliance, not C++ API. + QScriptEngine eng; { QScriptValue ret = eng.evaluate("var a; a.n++"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [undefined] is not an object.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { QScriptValue ret = eng.evaluate("var a; a.n--"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [undefined] is not an object.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { QScriptValue ret = eng.evaluate("var a = null; a.n++"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { QScriptValue ret = eng.evaluate("var a = null; a.n--"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { QScriptValue ret = eng.evaluate("var a; ++a.n"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { QScriptValue ret = eng.evaluate("var a; --a.n"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { QScriptValue ret = eng.evaluate("var a; a.n += 1"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { QScriptValue ret = eng.evaluate("var a; a.n -= 1"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'a' [null] is not an object.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { QScriptValue ret = eng.evaluate("var a = 'ciao'; a.length++"); @@ -5436,6 +5621,7 @@ void tst_QScriptEngine::collectGarbageAfterConnect() .isUndefined()); QVERIFY(widget != 0); engine.evaluate("widget = null;"); + // The connection should not keep the widget alive. collectGarbage_helper(engine); QVERIFY(widget == 0); } @@ -5599,6 +5785,17 @@ void tst_QScriptEngine::reentrency() void tst_QScriptEngine::newFixedStaticScopeObject() { + // "Static scope objects" is an optimization we do for QML. + // It enables the creation of JS objects that can guarantee to the + // compiler that no properties will be added or removed. This enables + // the compiler to generate a very simple (fast) property access, as + // opposed to a full virtual lookup. Due to the inherent use of scope + // chains in QML, this can make a huge difference (10x improvement for + // benchmark in QTBUG-8576). + // Ideally we would not need a special object type for this, and the + // VM would dynamically optimize it to be fast... + // See also QScriptEngine benchmark. + QScriptEngine eng; static const int propertyCount = 4; QString names[] = { "foo", "bar", "baz", "Math" }; @@ -5739,6 +5936,11 @@ void tst_QScriptEngine::newFixedStaticScopeObject() void tst_QScriptEngine::newGrowingStaticScopeObject() { + // The main use case for a growing static scope object is to set it as + // the activation object of a QScriptContext, so that all JS variable + // declarations end up in that object. It needs to be "growable" since + // we don't know in advance how many variables a script will declare. + QScriptEngine eng; QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(&eng); @@ -5826,10 +6028,10 @@ void tst_QScriptEngine::newGrowingStaticScopeObject() { QScriptValue fun = eng.evaluate("(function() { return futureProperty; })"); QVERIFY(fun.isFunction()); - QCOMPARE(fun.call().toString(), QString::fromLatin1("ReferenceError: Can't find variable: futureProperty")); + QVERIFY(fun.call().toString().contains(QString::fromLatin1("ReferenceError"))); scope.setProperty("futureProperty", "added after the function was compiled"); // If scope were dynamic, this would return the new property. - QCOMPARE(fun.call().toString(), QString::fromLatin1("ReferenceError: Can't find variable: futureProperty")); + QVERIFY(fun.call().toString().contains(QString::fromLatin1("ReferenceError"))); } eng.popContext(); -- cgit v0.12 From da48bbe66b7821416bee1ebc0215bc93e68f0a2a Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Wed, 2 Feb 2011 15:45:08 +0100 Subject: Split QScriptQObject test into smaller functions It could be split further (and with more descriptive names), but this is a start, at least. Task-number: QTBUG-16746 Reviewed-by: Jedrzej Nowacki --- .../qscriptextqobject/tst_qscriptextqobject.cpp | 46 ++++++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp index cb29586..1607bed 100644 --- a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp +++ b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp @@ -549,10 +549,19 @@ private slots: void getSetDynamicProperty_doNotHideJSProperty(); void getSetChildren(); void callQtInvokable(); + void callQtInvokable2(); + void callQtInvokable3(); + void callQtInvokable4(); + void callQtInvokable5(); + void callQtInvokable6(); + void callQtInvokable7(); void connectAndDisconnect(); + void connectAndDisconnect_emitFromJS(); + void connectAndDisconnect_senderWrapperCollected(); void connectAndDisconnectWithBadArgs(); void connectAndDisconnect_senderDeleted(); void cppConnectAndDisconnect(); + void cppConnectAndDisconnect2(); void classEnums(); void classConstructor(); void overrideInvokable(); @@ -1270,7 +1279,10 @@ void tst_QScriptExtQObject::callQtInvokable() QCOMPARE(m_myObject->qtFunctionActuals().size(), 2); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); QCOMPARE(m_myObject->qtFunctionActuals().at(1).toInt(), 456); +} +void tst_QScriptExtQObject::callQtInvokable2() +{ m_myObject->resetQtFunctionInvoked(); QVERIFY(m_engine->evaluate("myObject.myInvokableWithVoidStarArg(null)").isUndefined()); QCOMPARE(m_myObject->qtFunctionInvoked(), 44); @@ -1359,7 +1371,10 @@ void tst_QScriptExtQObject::callQtInvokable() QCOMPARE(ret.isArray(), true); QCOMPARE(m_myObject->qtFunctionInvoked(), 11); } +} +void tst_QScriptExtQObject::callQtInvokable3() +{ { QScriptValue ret = m_engine->evaluate("myObject.myInvokableWithVectorOfIntArg(myObject.myInvokableReturningVectorOfInt())"); QCOMPARE(ret.isUndefined(), true); @@ -1485,7 +1500,10 @@ void tst_QScriptExtQObject::callQtInvokable() QCOMPARE(ret.property("0").strictlyEquals(QScriptValue(m_engine, 1)), true); QCOMPARE(ret.property("1").strictlyEquals(QScriptValue(m_engine, 5)), true); } +} +void tst_QScriptExtQObject::callQtInvokable4() +{ m_myObject->resetQtFunctionInvoked(); { QScriptValue ret = m_engine->evaluate("myObject.myInvokableWithQObjectStarArg(myObject)"); @@ -1571,7 +1589,10 @@ void tst_QScriptExtQObject::callQtInvokable() QCOMPARE(v.userType(), int(QMetaType::ULongLong)); QCOMPARE(qvariant_cast<qulonglong>(v), qulonglong(123)); } +} +void tst_QScriptExtQObject::callQtInvokable5() +{ m_myObject->resetQtFunctionInvoked(); { QScriptValue fun = m_engine->evaluate("myObject.myInvokableWithQBrushArg"); @@ -1659,7 +1680,10 @@ void tst_QScriptExtQObject::callQtInvokable() QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(qvariant_cast<QObject*>(m_myObject->qtFunctionActuals().at(0)), (QObject*)m_myObject); } +} +void tst_QScriptExtQObject::callQtInvokable6() +{ // QScriptValue arguments should be passed on without conversion m_myObject->resetQtFunctionInvoked(); { @@ -1723,18 +1747,21 @@ void tst_QScriptExtQObject::callQtInvokable() QCOMPARE(m_myObject->qtFunctionInvoked(), 55); } } +} +void tst_QScriptExtQObject::callQtInvokable7() +{ // qscript_call() { m_myObject->resetQtFunctionInvoked(); QScriptValue ret = m_engine->evaluate("new myObject(123)"); QVERIFY(ret.isError()); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'myObject' [MyQObject(name = \"\")] is not a constructor.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } { m_myObject->resetQtFunctionInvoked(); QScriptValue ret = m_engine->evaluate("myObject(123)"); - QCOMPARE(ret.toString(), QString::fromLatin1("TypeError: Result of expression 'myObject' [MyQObject(name = \"\")] is not a function.")); + QVERIFY(ret.toString().contains(QString::fromLatin1("TypeError"))); } // task 233624 @@ -1971,9 +1998,10 @@ void tst_QScriptExtQObject::connectAndDisconnect() QVERIFY(m_engine->evaluate("myObject.mySignal.connect(myObject, 'mySlot')").isUndefined()); QVERIFY(m_engine->evaluate("myObject.mySignal.disconnect(yetAnotherObject, 'func')").isUndefined()); QVERIFY(m_engine->evaluate("myObject.mySignal.disconnect(myObject, 'mySlot')").isUndefined()); +} - // check that emitting signals from script works - +void tst_QScriptExtQObject::connectAndDisconnect_emitFromJS() +{ // no arguments QVERIFY(m_engine->evaluate("myObject.mySignal.connect(myObject.mySlot)").isUndefined()); m_myObject->resetQtFunctionInvoked(); @@ -2022,7 +2050,10 @@ void tst_QScriptExtQObject::connectAndDisconnect() QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 456); QVERIFY(m_engine->evaluate("myObject.mySignalWithIntArg.disconnect(myObject['myOverloadedSlot(int)'])").isUndefined()); +} +void tst_QScriptExtQObject::connectAndDisconnect_senderWrapperCollected() +{ // when the wrapper dies, the connection stays alive QVERIFY(m_engine->evaluate("myObject.mySignal.connect(myObject.mySlot)").isUndefined()); m_myObject->resetQtFunctionInvoked(); @@ -2210,7 +2241,14 @@ void tst_QScriptExtQObject::cppConnectAndDisconnect() QVERIFY(!qScriptDisconnect(&edit2, SIGNAL(textChanged(const QString &)), receiver, fun)); } } +} +void tst_QScriptExtQObject::cppConnectAndDisconnect2() +{ + QScriptEngine eng; + QLineEdit edit; + QLineEdit edit2; + QScriptValue fun = eng.evaluate("function fun(text) { signalObject = this; signalArg = text; }; fun"); // make sure we don't crash when engine is deleted { QScriptEngine *eng2 = new QScriptEngine; -- cgit v0.12 From 68f78ba6be29b839433d924b5dc348d6d94b3d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com> Date: Wed, 2 Feb 2011 17:30:43 +0100 Subject: Fixed MIT-SHM errors in QNativeImage. The POSIX standard doesn't allow attaching to IPC_RMID-flagged memory, even if Linux allows it, thus we need to wait until after calling XShmAttach and XSync before we set the flag. See the man page for shmctl(). Reviewed-by: Olivier Goffart --- src/gui/image/qnativeimage.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gui/image/qnativeimage.cpp b/src/gui/image/qnativeimage.cpp index 01baa36..8face87 100644 --- a/src/gui/image/qnativeimage.cpp +++ b/src/gui/image/qnativeimage.cpp @@ -181,15 +181,17 @@ QNativeImage::QNativeImage(int width, int height, QImage::Format format,bool /* if (ok) { xshmimg->data = (char*)shmat(xshminfo.shmid, 0, 0); xshminfo.shmaddr = xshmimg->data; - if (shmctl(xshminfo.shmid, IPC_RMID, 0) == -1) - qWarning() << "Error while marking the shared memory segment to be destroyed"; ok = (xshminfo.shmaddr != (char*)-1); if (ok) image = QImage((uchar *)xshmimg->data, width, height, format); } xshminfo.readOnly = false; - if (ok) + if (ok) { ok = XShmAttach(X11->display, &xshminfo); + XSync(X11->display, False); + if (shmctl(xshminfo.shmid, IPC_RMID, 0) == -1) + qWarning() << "Error while marking the shared memory segment to be destroyed"; + } if (!ok) { qWarning() << "QNativeImage: Unable to attach to shared memory segment."; if (xshmimg->data) { -- cgit v0.12 From 30dee4f433d2426ce2dc0bccda8e62683380a1c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com> Date: Thu, 3 Feb 2011 17:06:15 +0100 Subject: Improve performance of partial updates in raster window surface on X11. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An XSync is needed to prevent the raster engine from writing to the shared memory raster backbuffer at the same time the X server reads from it. However, instead of doing the sync right after telling X to blit, we can do it right before we start writing to it with raster. At this point there will on average be less processing heavy X commands in the command queue, and we thus spend less time blocking the GUI thread. Measured frame rate improvement of 20 - 60 % in an update stress testing the performance of partial updates. Idea-from: Olivier Goffart Reviewed-by: Bjørn Erik Nilsen --- src/gui/painting/qwindowsurface_raster.cpp | 29 +++++++++++++++++++++++++++-- src/gui/painting/qwindowsurface_raster_p.h | 3 +++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp index 843c9ff..419518ac 100644 --- a/src/gui/painting/qwindowsurface_raster.cpp +++ b/src/gui/painting/qwindowsurface_raster.cpp @@ -78,6 +78,9 @@ public: #ifdef Q_WS_X11 GC gc; +#ifndef QT_NO_MITSHM + uint needsSync : 1; +#endif #ifndef QT_NO_XRENDER uint translucentBackground : 1; #endif @@ -94,6 +97,9 @@ QRasterWindowSurface::QRasterWindowSurface(QWidget *window, bool setDefaultSurfa d_ptr->translucentBackground = X11->use_xrender && window->x11Info().depth() == 32; #endif +#ifndef QT_NO_MITHSM + d_ptr->needsSync = false; +#endif #endif d_ptr->image = 0; d_ptr->inSetGeometry = false; @@ -116,8 +122,23 @@ QPaintDevice *QRasterWindowSurface::paintDevice() return &d_ptr->image->image; } +#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM) +void QRasterWindowSurface::syncX() +{ + // delay writing to the backbuffer until we know for sure X is done reading from it + if (d_ptr->needsSync) { + XSync(X11->display, false); + d_ptr->needsSync = false; + } +} +#endif + void QRasterWindowSurface::beginPaint(const QRegion &rgn) { +#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM) + syncX(); +#endif + #if (defined(Q_WS_X11) && !defined(QT_NO_XRENDER)) || (defined(Q_WS_WIN) && !defined(Q_WS_WINCE)) if (!qt_widget_private(window())->isOpaque && window()->testAttribute(Qt::WA_TranslucentBackground)) { #if defined(Q_WS_WIN) && !defined(Q_WS_WINCE) @@ -217,13 +238,13 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi if (d_ptr->image->xshmpm) { XCopyArea(X11->display, d_ptr->image->xshmpm, widget->handle(), d_ptr->gc, br.x(), br.y(), br.width(), br.height(), wbr.x(), wbr.y()); - XSync(X11->display, False); + d_ptr->needsSync = true; } else if (d_ptr->image->xshmimg) { const QImage &src = d->image->image; br = br.intersected(src.rect()); XShmPutImage(X11->display, widget->handle(), d_ptr->gc, d_ptr->image->xshmimg, br.x(), br.y(), wbr.x(), wbr.y(), br.width(), br.height(), False); - XSync(X11->display, False); + d_ptr->needsSync = true; } else #endif { @@ -392,6 +413,10 @@ bool QRasterWindowSurface::scroll(const QRegion &area, int dx, int dy) if (!d->image || d->image->image.isNull()) return false; +#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM) + syncX(); +#endif + const QVector<QRect> rects = area.rects(); for (int i = 0; i < rects.size(); ++i) qt_scrollRectInImage(d->image->image, rects.at(i), QPoint(dx, dy)); diff --git a/src/gui/painting/qwindowsurface_raster_p.h b/src/gui/painting/qwindowsurface_raster_p.h index b6e61e1..903810b 100644 --- a/src/gui/painting/qwindowsurface_raster_p.h +++ b/src/gui/painting/qwindowsurface_raster_p.h @@ -107,6 +107,9 @@ public: bool scroll(const QRegion &area, int dx, int dy); private: +#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM) + void syncX(); +#endif void prepareBuffer(QImage::Format format, QWidget *widget); Q_DECLARE_PRIVATE(QRasterWindowSurface) QScopedPointer<QRasterWindowSurfacePrivate> d_ptr; -- cgit v0.12 From e97d3f3f571e3cc5f5851ea2e131ac92212802dd Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@nokia.com> Date: Thu, 3 Feb 2011 19:30:09 +0100 Subject: QtDBus: add support for QVariantHash out of the box --- src/dbus/qdbusargument.h | 15 +++++++++++++++ src/dbus/qdbusmetatype.cpp | 1 + 2 files changed, 16 insertions(+) diff --git a/src/dbus/qdbusargument.h b/src/dbus/qdbusargument.h index 2c8693b..e331d8f 100644 --- a/src/dbus/qdbusargument.h +++ b/src/dbus/qdbusargument.h @@ -376,6 +376,21 @@ inline const QDBusArgument &operator>>(const QDBusArgument &arg, QHash<Key, T> & return arg; } +inline QDBusArgument &operator<<(QDBusArgument &arg, const QVariantHash &map) +{ + arg.beginMap(QVariant::String, qMetaTypeId<QDBusVariant>()); + QVariantHash::ConstIterator it = map.constBegin(); + QVariantHash::ConstIterator end = map.constEnd(); + for ( ; it != end; ++it) { + arg.beginMapEntry(); + arg << it.key() << QDBusVariant(it.value()); + arg.endMapEntry(); + } + arg.endMap(); + return arg; +} + + QT_END_NAMESPACE Q_DECLARE_METATYPE(QDBusArgument) diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp index 6de5d93..9f29205 100644 --- a/src/dbus/qdbusmetatype.cpp +++ b/src/dbus/qdbusmetatype.cpp @@ -127,6 +127,7 @@ void QDBusMetaTypeId::init() registerHelper<QLineF>(); registerHelper<QVariantList>(); registerHelper<QVariantMap>(); + registerHelper<QVariantHash>(); qDBusRegisterMetaType<QList<bool> >(); qDBusRegisterMetaType<QList<short> >(); -- cgit v0.12 From d9c06bf25210b3d0b31ee6126e57bcb82c292da1 Mon Sep 17 00:00:00 2001 From: Harald Fernengel <harald.fernengel@nokia.com> Date: Fri, 4 Feb 2011 10:46:01 +0100 Subject: Revert "Delay creation of the process manager" This reverts commit daba2c507ad42c66dafa6a29cffa94e9641e0c58. There's a potential deadlock when a QProcess is created while a QCoreApplication is instantiated but never executed, or if the main thread waits() for the child thread. --- src/corelib/io/qprocess_unix.cpp | 30 ++++-------------------------- src/corelib/kernel/qcoreapplication.cpp | 18 ++++++------------ src/corelib/kernel/qcoreapplication.h | 1 - src/corelib/kernel/qcoreapplication_p.h | 2 -- 4 files changed, 10 insertions(+), 41 deletions(-) diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index b120f7f..f9f5362 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -169,27 +169,17 @@ private: Q_GLOBAL_STATIC(QMutex, processManagerGlobalMutex) -static QProcessManager *processManagerInstance = 0; - -static QProcessManager *processManager() -{ +static QProcessManager *processManager() { // The constructor of QProcessManager should be called only once // so we cannot use Q_GLOBAL_STATIC directly for QProcessManager QMutex *mutex = processManagerGlobalMutex(); QMutexLocker locker(mutex); - - if (!processManagerInstance) - QProcessPrivate::initializeProcessManager(); - - Q_ASSERT(processManagerInstance); - return processManagerInstance; + static QProcessManager processManager; + return &processManager; } QProcessManager::QProcessManager() { - // can only be called from main thread - Q_ASSERT(!qApp || qApp->thread() == QThread::currentThread()); - #if defined (QPROCESS_DEBUG) qDebug() << "QProcessManager::QProcessManager()"; #endif @@ -208,8 +198,6 @@ QProcessManager::QProcessManager() ::sigaction(SIGCHLD, &action, &oldAction); if (oldAction.sa_handler != qt_sa_sigchld_handler) qt_sa_old_sigchld_handler = oldAction.sa_handler; - - processManagerInstance = this; } QProcessManager::~QProcessManager() @@ -238,8 +226,6 @@ QProcessManager::~QProcessManager() if (oldAction.sa_handler != qt_sa_sigchld_handler) { ::sigaction(SIGCHLD, &oldAction, 0); } - - processManagerInstance = 0; } void QProcessManager::run() @@ -1306,15 +1292,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a void QProcessPrivate::initializeProcessManager() { - if (qApp && qApp->thread() != QThread::currentThread()) { - // The process manager must be initialized in the main thread - // Note: The call below will re-enter this function, but in the right thread, - // so the else statement below will be executed. - QMetaObject::invokeMethod(qApp, "_q_initializeProcessManager", Qt::BlockingQueuedConnection); - } else { - static QProcessManager processManager; - Q_UNUSED(processManager); - } + (void) processManager(); } QT_END_NAMESPACE diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 9bd32d1..26a398e 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -392,16 +392,6 @@ void QCoreApplicationPrivate::createEventDispatcher() #endif } -void QCoreApplicationPrivate::_q_initializeProcessManager() -{ -#ifndef QT_NO_PROCESS -# ifdef Q_OS_UNIX - QProcessPrivate::initializeProcessManager(); -# endif -#endif -} - - QThread *QCoreApplicationPrivate::theMainThread = 0; QThread *QCoreApplicationPrivate::mainThread() { @@ -666,6 +656,12 @@ void QCoreApplication::init() } #endif +#if defined(Q_OS_UNIX) && !(defined(QT_NO_PROCESS)) + // Make sure the process manager thread object is created in the main + // thread. + QProcessPrivate::initializeProcessManager(); +#endif + #ifdef QT_EVAL extern void qt_core_eval_init(uint); qt_core_eval_init(d->application_type); @@ -2732,5 +2728,3 @@ int QCoreApplication::loopLevel() */ QT_END_NAMESPACE - -#include "moc_qcoreapplication.cpp" diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h index 024c509..3957158 100644 --- a/src/corelib/kernel/qcoreapplication.h +++ b/src/corelib/kernel/qcoreapplication.h @@ -205,7 +205,6 @@ protected: QCoreApplication(QCoreApplicationPrivate &p); private: - Q_PRIVATE_SLOT(d_func(), void _q_initializeProcessManager()) static bool sendSpontaneousEvent(QObject *receiver, QEvent *event); bool notifyInternal(QObject *receiver, QEvent *event); diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h index fdceab4..add2a35 100644 --- a/src/corelib/kernel/qcoreapplication_p.h +++ b/src/corelib/kernel/qcoreapplication_p.h @@ -85,8 +85,6 @@ public: bool sendThroughObjectEventFilters(QObject *, QEvent *); bool notify_helper(QObject *, QEvent *); - void _q_initializeProcessManager(); - virtual QString appName() const; virtual void createEventDispatcher(); static void removePostedEvent(QEvent *); -- cgit v0.12 From 6163c36249eea0a2a578b9990470fcaa2f7bcf5f Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Thu, 3 Feb 2011 15:48:02 +0100 Subject: Add Context2D QtScript benchmark Reuse the Context2D implementation from examples/script/context2d and create a benchmark out of it. This benchmark actually measures a meaningful, real-world use case. Task-number: QTBUG-17192 Reviewed-by: Jedrzej Nowacki --- examples/script/context2d/environment.cpp | 17 ++ examples/script/context2d/environment.h | 2 + tests/benchmarks/script/context2d/context2d.pro | 22 +++ .../benchmarks/script/context2d/tst_context2d.cpp | 177 +++++++++++++++++++++ tests/benchmarks/script/script.pro | 3 +- 5 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 tests/benchmarks/script/context2d/context2d.pro create mode 100644 tests/benchmarks/script/context2d/tst_context2d.cpp diff --git a/examples/script/context2d/environment.cpp b/examples/script/context2d/environment.cpp index 7d6d6f8..e68c1ca 100644 --- a/examples/script/context2d/environment.cpp +++ b/examples/script/context2d/environment.cpp @@ -363,6 +363,23 @@ QScriptValue Environment::evaluate(const QString &code, const QString &fileName) return m_engine->evaluate(code, fileName); } +bool Environment::hasIntervalTimers() const +{ + return !m_intervalHash.isEmpty(); +} + +// This is used by the Context2D QtScript benchmark. +void Environment::triggerTimers() +{ + for (int x = 0; x < 2; ++x) { + QList<int> timerIds = x ? m_intervalHash.keys() : m_timeoutHash.keys(); + for (int i = 0; i < timerIds.size(); ++i) { + QTimerEvent fakeEvent(timerIds.at(i)); + timerEvent(&fakeEvent); + } + } +} + //! [2] QScriptValue Environment::toWrapper(QObject *object) { diff --git a/examples/script/context2d/environment.h b/examples/script/context2d/environment.h index dd92e85..221875f 100644 --- a/examples/script/context2d/environment.h +++ b/examples/script/context2d/environment.h @@ -78,6 +78,8 @@ public: //! [0] QScriptEngine *engine() const; + bool hasIntervalTimers() const; + void triggerTimers(); //! [1] public slots: diff --git a/tests/benchmarks/script/context2d/context2d.pro b/tests/benchmarks/script/context2d/context2d.pro new file mode 100644 index 0000000..bc94c4f --- /dev/null +++ b/tests/benchmarks/script/context2d/context2d.pro @@ -0,0 +1,22 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = tst_bench_context2d + +SOURCES += tst_context2d.cpp + +CONTEXT2D_EXAMPLE_DIR = $$QT_SOURCE_TREE/examples/script/context2d +INCLUDEPATH += $$CONTEXT2D_EXAMPLE_DIR + +HEADERS += $$CONTEXT2D_EXAMPLE_DIR/qcontext2dcanvas.h \ + $$CONTEXT2D_EXAMPLE_DIR/context2d.h \ + $$CONTEXT2D_EXAMPLE_DIR/domimage.h \ + $$CONTEXT2D_EXAMPLE_DIR/environment.h + +SOURCES += $$CONTEXT2D_EXAMPLE_DIR/qcontext2dcanvas.cpp \ + $$CONTEXT2D_EXAMPLE_DIR/context2d.cpp \ + $$CONTEXT2D_EXAMPLE_DIR/domimage.cpp \ + $$CONTEXT2D_EXAMPLE_DIR/environment.cpp + +RESOURCES += $$CONTEXT2D_EXAMPLE_DIR/context2d.qrc + +QT += script diff --git a/tests/benchmarks/script/context2d/tst_context2d.cpp b/tests/benchmarks/script/context2d/tst_context2d.cpp new file mode 100644 index 0000000..8401590 --- /dev/null +++ b/tests/benchmarks/script/context2d/tst_context2d.cpp @@ -0,0 +1,177 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> +#include <QtCore/qdir.h> +#include <QtCore/qfile.h> +#include <QtCore/qtextstream.h> +#include <QtScript/qscriptengine.h> +#include <QtScript/qscriptvalue.h> +#include "context2d.h" +#include "environment.h" +#include "qcontext2dcanvas.h" + +static QString readFile(const QString &filename) +{ + QFile file(filename); + if (!file.open(QFile::ReadOnly)) + return QString(); + QTextStream stream(&file); + stream.setCodec("UTF-8"); + return stream.readAll(); +} + +class tst_Context2D : public QObject +{ + Q_OBJECT + +public: + tst_Context2D(); + ~tst_Context2D(); + +private slots: + void singleExecution_data(); + void singleExecution(); + void repeatedExecution_data(); + void repeatedExecution(); + +private: + void newEnvironment(); + +private: + QDir testsDir; + Environment *m_env; + QContext2DCanvas *m_canvas; +}; + +tst_Context2D::tst_Context2D() + : m_env(0), m_canvas(0) +{ + testsDir = QDir(":/scripts"); + if (!testsDir.exists()) + qWarning("*** no scripts/ dir!"); +} + +tst_Context2D::~tst_Context2D() +{ + delete m_canvas; + delete m_env; +} + +void tst_Context2D::newEnvironment() +{ + delete m_canvas; + delete m_env; + m_env = new Environment(); + Context2D *context = new Context2D(m_env); + context->setSize(150, 150); // Hard-coded in many of the scripts. + m_canvas = new QContext2DCanvas(context, m_env); + m_canvas->setFixedSize(context->size()); + m_canvas->setObjectName("tutorial"); // Acts as the DOM element ID. + m_env->addCanvas(m_canvas); +} + +void tst_Context2D::singleExecution_data() +{ + QTest::addColumn<QString>("testName"); + QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files); + foreach (QFileInfo tfi, testFileInfos) { + QString name = tfi.baseName(); + QTest::newRow(name.toLatin1().constData()) << name; + } +} + +void tst_Context2D::singleExecution() +{ + QFETCH(QString, testName); + QString script = readFile(testsDir.absoluteFilePath(testName + ".js")); + QVERIFY(!script.isEmpty()); + + newEnvironment(); + QBENCHMARK { + m_env->evaluate(script, testName); + // Some of the scripts (e.g. plasma.js) merely start a timer and do + // the actual drawing in the timer event. Trigger the timers now to + // ensure that the real work is done. + m_env->triggerTimers(); + } + QVERIFY(!m_env->engine()->hasUncaughtException()); +} + +void tst_Context2D::repeatedExecution_data() +{ + // We look for scripts that register an interval timer. + // Such scripts run a function every n milliseconds to update the canvas. + // The benchmark will execute this function repeatedly, which can allow + // us to observe potential effects of profiling-based JIT optimizations. + QTest::addColumn<QString>("testName"); + QTest::addColumn<QString>("script"); + QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files); + foreach (QFileInfo tfi, testFileInfos) { + QString script = readFile(tfi.absoluteFilePath()); + QString name = tfi.baseName(); + newEnvironment(); + m_env->evaluate(script, name); + if (m_env->engine()->hasUncaughtException()) + continue; + if (m_env->hasIntervalTimers()) + QTest::newRow(name.toLatin1().constData()) << name << script; + } +} + +void tst_Context2D::repeatedExecution() +{ + QFETCH(QString, testName); + QFETCH(QString, script); + + newEnvironment(); + m_env->evaluate(script, testName); + QBENCHMARK { + // Trigger the update function repeatedly, effectively + // performing several frames of animation. + for (int i = 0; i < 16; ++i) + m_env->triggerTimers(); + } + QVERIFY(!m_env->engine()->hasUncaughtException()); +} + +QTEST_MAIN(tst_Context2D) +#include "tst_context2d.moc" diff --git a/tests/benchmarks/script/script.pro b/tests/benchmarks/script/script.pro index b0770ca..da7a5a1 100644 --- a/tests/benchmarks/script/script.pro +++ b/tests/benchmarks/script/script.pro @@ -1,5 +1,6 @@ TEMPLATE = subdirs SUBDIRS = \ + context2d \ qscriptclass \ qscriptengine \ qscriptvalue \ @@ -13,4 +14,4 @@ TRUSTED_BENCHMARKS += \ qscriptvalue \ qscriptengine -include(../trusted-benchmarks.pri) \ No newline at end of file +include(../trusted-benchmarks.pri) -- cgit v0.12 From b0c109ff2479dd8f4474b6c5ad537168224a5dc4 Mon Sep 17 00:00:00 2001 From: Kent Hansen <kent.hansen@nokia.com> Date: Fri, 4 Feb 2011 09:39:10 +0100 Subject: Add QScriptClass/ByteArray benchmark Reuse the ByteArray implementation from examples/script/customclass and create a benchmark out of it. This benchmark actually measures a meaningful, real-world use case for QScriptClass. Task-number: QTBUG-17192 Reviewed-by: Jedrzej Nowacki --- .../qscriptclass_bytearray.pro | 10 ++ .../qscriptclass_bytearray.qrc | 5 + .../qscriptclass_bytearray/tests/construct-copy.js | 3 + .../qscriptclass_bytearray/tests/construct.js | 2 + .../script/qscriptclass_bytearray/tests/for-in.js | 3 + .../qscriptclass_bytearray/tests/get-element.js | 3 + .../qscriptclass_bytearray/tests/get-length.js | 3 + .../script/qscriptclass_bytearray/tests/mid.js | 3 + .../qscriptclass_bytearray/tests/set-element.js | 3 + .../qscriptclass_bytearray/tests/set-length.js | 3 + .../script/qscriptclass_bytearray/tests/sum.js | 8 ++ .../script/qscriptclass_bytearray/tests/trimmed.js | 3 + .../tst_qscriptclass_bytearray.cpp | 109 +++++++++++++++++++++ tests/benchmarks/script/script.pro | 1 + 14 files changed, 159 insertions(+) create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js create mode 100644 tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp diff --git a/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro new file mode 100644 index 0000000..d64f705 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro @@ -0,0 +1,10 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = tst_bench_qscriptclass_bytearray + +SOURCES += tst_qscriptclass_bytearray.cpp +RESOURCES += qscriptclass_bytearray.qrc + +include($$QT_SOURCE_TREE/examples/script/customclass/bytearrayclass.pri) + +QT = core script diff --git a/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc new file mode 100644 index 0000000..a894ee5 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc @@ -0,0 +1,5 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>tests</file> +</qresource> +</RCC> diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js new file mode 100644 index 0000000..9c03871 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js @@ -0,0 +1,3 @@ +ba = new ByteArray(123); +for (i = 0; i < 5000; ++i) + new ByteArray(ba); diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js new file mode 100644 index 0000000..2c2bbf5 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js @@ -0,0 +1,2 @@ +for (i = 0; i < 5000; ++i) + new ByteArray(123); diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js new file mode 100644 index 0000000..46bc9f3 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js @@ -0,0 +1,3 @@ +ba = new ByteArray(8000); +for (var p in ba) + ; diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js new file mode 100644 index 0000000..9f6a503 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js @@ -0,0 +1,3 @@ +ba = new ByteArray(123); +for (i = 0; i < 10000; ++i) + ba[10]; diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js new file mode 100644 index 0000000..5de2f58 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js @@ -0,0 +1,3 @@ +ba = new ByteArray(123); +for (i = 0; i < 10000; ++i) + ba.length; diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js new file mode 100644 index 0000000..752d875 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js @@ -0,0 +1,3 @@ +ba = new ByteArray(123); +for (i = 0; i < 3000; ++i) + ba.mid(50); diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js new file mode 100644 index 0000000..4883765 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js @@ -0,0 +1,3 @@ +ba = new ByteArray(123); +for (i = 0; i < 10000; ++i) + ba[10] = 123; diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js new file mode 100644 index 0000000..18c9f59 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js @@ -0,0 +1,3 @@ +ba = new ByteArray(); +for (i = 0; i < 10000; ++i) + ba.length = 123; diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js new file mode 100644 index 0000000..096937d --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js @@ -0,0 +1,8 @@ +function sum(ba) { + var result = 0; + for (var i = 0; i < ba.length; ++i) + result += ba[i]; + return result; +} + +sum(new ByteArray(10000)); diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js new file mode 100644 index 0000000..967dba6 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js @@ -0,0 +1,3 @@ +ba = new ByteArray(123); +for (i = 0; i < 3000; ++i) + ba.trimmed(); diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp b/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp new file mode 100644 index 0000000..351adc8 --- /dev/null +++ b/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> +#include <QtCore/qdir.h> +#include <QtCore/qfile.h> +#include <QtCore/qtextstream.h> +#include <QtScript/qscriptengine.h> +#include <QtScript/qscriptvalue.h> +#include "bytearrayclass.h" + +static QString readFile(const QString &filename) +{ + QFile file(filename); + if (!file.open(QFile::ReadOnly)) + return QString(); + QTextStream stream(&file); + stream.setCodec("UTF-8"); + return stream.readAll(); +} + +class tst_QScriptClass_ByteArray : public QObject +{ + Q_OBJECT + +public: + tst_QScriptClass_ByteArray(); + +private slots: + void benchmark_data(); + void benchmark(); + +private: + QDir testsDir; +}; + +tst_QScriptClass_ByteArray::tst_QScriptClass_ByteArray() +{ + testsDir = QDir(":/tests"); + if (!testsDir.exists()) + qWarning("*** no tests/ dir!"); +} + +void tst_QScriptClass_ByteArray::benchmark_data() +{ + QTest::addColumn<QString>("testName"); + QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files); + foreach (QFileInfo tfi, testFileInfos) { + QString name = tfi.baseName(); + QTest::newRow(name.toLatin1().constData()) << name; + } +} + +void tst_QScriptClass_ByteArray::benchmark() +{ + QFETCH(QString, testName); + QString testContents = readFile(testsDir.absoluteFilePath(testName + ".js")); + QVERIFY(!testContents.isEmpty()); + + QScriptEngine eng; + ByteArrayClass *baClass = new ByteArrayClass(&eng); + eng.globalObject().setProperty("ByteArray", baClass->constructor()); + + QBENCHMARK { + eng.evaluate(testContents); + } + QVERIFY(!eng.hasUncaughtException()); +} + +QTEST_MAIN(tst_QScriptClass_ByteArray) +#include "tst_qscriptclass_bytearray.moc" diff --git a/tests/benchmarks/script/script.pro b/tests/benchmarks/script/script.pro index da7a5a1..d4fc822 100644 --- a/tests/benchmarks/script/script.pro +++ b/tests/benchmarks/script/script.pro @@ -2,6 +2,7 @@ TEMPLATE = subdirs SUBDIRS = \ context2d \ qscriptclass \ + qscriptclass_bytearray \ qscriptengine \ qscriptvalue \ sunspider \ -- cgit v0.12 From 59f440ef78d310fdf18d655b2b768b6e59786fa9 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Fri, 4 Feb 2011 13:27:55 +0100 Subject: Fix warning about deprecated conversions of string literals to char * MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Samuel Rødal --- src/opengl/qglshaderprogram.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opengl/qglshaderprogram.cpp b/src/opengl/qglshaderprogram.cpp index 7f41339..4598bff 100644 --- a/src/opengl/qglshaderprogram.cpp +++ b/src/opengl/qglshaderprogram.cpp @@ -261,14 +261,14 @@ bool QGLShaderPrivate::compile(QGLShader *q) log = QString::fromLatin1(logbuf); QString name = q->objectName(); - char *types[] = { + const char *types[] = { "Fragment", "Vertex", "Geometry", "" }; - char *type = types[3]; + const char *type = types[3]; if (shaderType == QGLShader::Fragment) type = types[0]; else if (shaderType == QGLShader::Vertex) -- cgit v0.12 From bc21d7604c78cf05780bb9974911ba81e787b6f9 Mon Sep 17 00:00:00 2001 From: Robin Burchell <robin.burchell@collabora.co.uk> Date: Fri, 4 Feb 2011 12:39:51 +0100 Subject: Fix builds with compilers without --with-fpu=neon as a default. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The changes introduced in fac68dca46131d63f11c37210834073848f5a93d do not work correctly on compilers without --with-fpu=neon as a default, NEON_SOURCES would be (incorrectly) compiled without -mfpu=neon, resulting in build failure. This also moves -mfpu=neon after CXXFLAGS, as CXXFLAGS may contain -mfpu=vfpv3-d16. Issue noted by Carsten Munk while building Qt for MeeGo ARM with NEON. Merge-request: 1042 Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com> --- src/gui/gui.pro | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/gui/gui.pro b/src/gui/gui.pro index fe1a595..076fe0a 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -65,15 +65,14 @@ symbian { neon:*-g++* { DEFINES += QT_HAVE_NEON HEADERS += $$NEON_HEADERS - SOURCES += $$NEON_SOURCES DRAWHELPER_NEON_ASM_FILES = $$NEON_ASM - neon_compiler.commands = $$QMAKE_CXX -c -mfpu=neon - neon_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} + neon_compiler.commands = $$QMAKE_CXX -c + neon_compiler.commands += $(CXXFLAGS) -mfpu=neon $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} neon_compiler.dependency_type = TYPE_C neon_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)} - neon_compiler.input = DRAWHELPER_NEON_ASM_FILES + neon_compiler.input = DRAWHELPER_NEON_ASM_FILES NEON_SOURCES neon_compiler.variable_out = OBJECTS neon_compiler.name = compiling[neon] ${QMAKE_FILE_IN} silent:neon_compiler.commands = @echo compiling[neon] ${QMAKE_FILE_IN} && $$neon_compiler.commands -- cgit v0.12