Add cv::setWindowTitle to highgui
authorAndrey Kamaev <andrey.kamaev@itseez.com>
Mon, 17 Nov 2014 23:27:02 +0000 (02:27 +0300)
committerAndrey Kamaev <andrey.kamaev@itseez.com>
Tue, 18 Nov 2014 13:54:03 +0000 (16:54 +0300)
modules/highgui/include/opencv2/highgui.hpp
modules/highgui/src/window.cpp
modules/highgui/src/window_QT.cpp
modules/highgui/src/window_QT.h
modules/highgui/src/window_carbon.cpp
modules/highgui/src/window_cocoa.mm
modules/highgui/src/window_gtk.cpp
modules/highgui/src/window_w32.cpp

index aef9105..41b8cd8 100644 (file)
@@ -136,6 +136,8 @@ CV_EXPORTS_W void moveWindow(const String& winname, int x, int y);
 
 CV_EXPORTS_W void setWindowProperty(const String& winname, int prop_id, double prop_value);
 
+CV_EXPORTS_W void setWindowTitle(const String& winname, const String& title);
+
 CV_EXPORTS_W double getWindowProperty(const String& winname, int prop_id);
 
 //! assigns callback for mouse events
index 03ff988..e3c997c 100644 (file)
@@ -379,7 +379,8 @@ CV_IMPL void cvUpdateWindow(const char*)
 cv::QtFont cv::fontQt(const String& nameFont, int pointSize, Scalar color, int weight,  int style, int /*spacing*/)
 {
     CvFont f = cvFontQt(nameFont.c_str(), pointSize,color,weight, style);
-    return *(cv::QtFont*)(&f);
+    void* pf = &f; // to suppress strict-aliasing
+    return *(cv::QtFont*)pf;
 }
 
 void cv::addText( const Mat& img, const String& text, Point org, const QtFont& font)
@@ -490,6 +491,12 @@ int cv::createButton(const String&, ButtonCallback, void*, int , bool )
 // version with a more capable one without a need to recompile dependent
 // applications or libraries.
 
+void cv::setWindowTitle(const String&, const String&)
+{
+    CV_Error(Error::StsNotImplemented, "The function is not implemented. "
+        "Rebuild the library with Windows, GTK+ 2.x or Carbon support. "
+        "If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script");
+}
 
 #define CV_NO_GUI_ERROR(funcname) \
     cvError( CV_StsError, funcname, \
index f67c2f6..fc94ded 100644 (file)
@@ -181,6 +181,18 @@ void cvSetPropWindow_QT(const char* name,double prop_value)
         Q_ARG(double, prop_value));
 }
 
+void cv::setWindowTitle(const String& winname, const String& title)
+{
+    if (!guiMainThread)
+        CV_Error(Error::StsNullPtr, "NULL guiReceiver (please create a window)");
+
+    QMetaObject::invokeMethod(guiMainThread,
+        "setWindowTitle",
+        autoBlockingConnection(),
+        Q_ARG(QString, QString(winname.c_str())),
+        Q_ARG(QString, QString(title.c_str())));
+}
+
 
 void cvSetModeWindow_QT(const char* name, double prop_value)
 {
@@ -371,7 +383,7 @@ static CvWindow* icvFindWindowByName(QString name)
             if (temp->type == type_CvWindow)
             {
                 CvWindow* w = (CvWindow*) temp;
-                if (w->windowTitle() == name)
+                if (w->objectName() == name)
                 {
                     window = w;
                     break;
@@ -527,7 +539,7 @@ CV_IMPL const char* cvGetWindowName(void* window_handle)
     if( !window_handle )
         CV_Error( CV_StsNullPtr, "NULL window handler" );
 
-    return ((CvWindow*)window_handle)->windowTitle().toLatin1().data();
+    return ((CvWindow*)window_handle)->objectName().toLatin1().data();
 }
 
 
@@ -871,6 +883,22 @@ void GuiReceiver::setPropWindow(QString name, double arg2)
     w->setPropWindow(flags);
 }
 
+void GuiReceiver::setWindowTitle(QString name, QString title)
+{
+    QPointer<CvWindow> w = icvFindWindowByName(name);
+
+    if (!w)
+    {
+        cvNamedWindow(name.toLatin1().data());
+        w = icvFindWindowByName(name);
+    }
+
+    if (!w)
+        return;
+
+    w->setWindowTitle(title);
+}
+
 
 double GuiReceiver::isFullScreen(QString name)
 {
@@ -1494,7 +1522,7 @@ void CvWinProperties::showEvent(QShowEvent* evnt)
     //no value pos was saved so we let Qt move the window in the middle of its parent (event ignored).
     //then hide will save the last position and thus, we want to retreive it (event accepted).
     QPoint mypos(-1, -1);
-    QSettings settings("OpenCV2", windowTitle());
+    QSettings settings("OpenCV2", objectName());
     mypos = settings.value("pos", mypos).toPoint();
 
     if (mypos.x() >= 0)
@@ -1511,7 +1539,7 @@ void CvWinProperties::showEvent(QShowEvent* evnt)
 
 void CvWinProperties::hideEvent(QHideEvent* evnt)
 {
-    QSettings settings("OpenCV2", windowTitle());
+    QSettings settings("OpenCV2", objectName());
     settings.setValue("pos", pos()); //there is an offset of 6 pixels (so the window's position is wrong -- why ?)
     evnt->accept();
 }
@@ -1520,7 +1548,7 @@ void CvWinProperties::hideEvent(QHideEvent* evnt)
 CvWinProperties::~CvWinProperties()
 {
     //clear the setting pos
-    QSettings settings("OpenCV2", windowTitle());
+    QSettings settings("OpenCV2", objectName());
     settings.remove("pos");
 }
 
@@ -1540,9 +1568,9 @@ CvWindow::CvWindow(QString name, int arg2)
     //setAttribute(Qt::WA_DeleteOnClose); //in other case, does not release memory
     setContentsMargins(0, 0, 0, 0);
     setWindowTitle(name);
-        setObjectName(name);
+    setObjectName(name);
 
-        setFocus( Qt::PopupFocusReason ); //#1695 arrow keys are not received without the explicit focus
+    setFocus( Qt::PopupFocusReason ); //#1695 arrow keys are not received without the explicit focus
 
     resize(400, 300);
     setMinimumSize(1, 1);
@@ -1702,7 +1730,6 @@ void CvWindow::setPropWindow(int flags)
     }
 }
 
-
 void CvWindow::toggleFullScreen(int flags)
 {
     if (isFullScreen() && flags == CV_WINDOW_NORMAL)
index a96a8c6..20cd414 100644 (file)
@@ -132,6 +132,7 @@ public slots:
     double isFullScreen(QString name);
     double getPropWindow(QString name);
     void setPropWindow(QString name, double flags );
+    void setWindowTitle(QString name, QString title);
     double getRatioWindow(QString name);
     void setRatioWindow(QString name, double arg2 );
     void saveWindowParameters(QString name);
index 3d092e7..93d9e4f 100644 (file)
@@ -833,6 +833,23 @@ void cvSetModeWindow_CARBON( const char* name, double prop_value)//Yannick Verdi
     __END__;
 }
 
+void cv::setWindowTitle(const String& winname, const String& title)
+{
+    CvWindow* window = icvFindWindowByName(winname.c_str());
+
+    if (!window)
+    {
+        namedWindow(winname);
+        window = icvFindWindowByName(winname.c_str());
+    }
+
+    if (!window)
+        CV_Error(Error::StsNullPtr, "NULL window");
+
+    if (noErr != SetWindowTitleWithCFString(window->window, CFStringCreateWithCString(NULL, title.c_str(), kCFStringEncodingASCII)))
+        CV_Error_(Error::StsError, ("Failed to set \"%s\" window title to \"%s\"", winname.c_str(), title.c_str()));
+}
+
 CV_IMPL int cvNamedWindow( const char* name, int flags )
 {
     int result = 0;
index fca6ff9..977d619 100644 (file)
@@ -603,6 +603,27 @@ void cvSetModeWindow_COCOA( const char* name, double prop_value )
     __END__;
 }
 
+void cv::setWindowTitle(const String& winname, const String& title)
+{
+    CVWindow *window = cvGetWindow(winname.c_str());
+
+    if (window == NULL)
+    {
+        namedWindow(winname);
+        window = cvGetWindow(winname.c_str());
+    }
+
+    if (window == NULL)
+        CV_Error(Error::StsNullPtr, "NULL window");
+
+    NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init];
+
+    NSString *windowTitle = [NSString stringWithFormat:@"%s", title.c_str()];
+    [window setTitle:windowTitle];
+
+    [localpool drain];
+}
+
 @implementation CVWindow
 
 @synthesize mouseCallback;
index 0d53276..4b916e6 100644 (file)
@@ -732,6 +732,23 @@ void cvSetModeWindow_GTK( const char* name, double prop_value)//Yannick Verdie
     __END__;
 }
 
+void cv::setWindowTitle(const String& winname, const String& title)
+{
+    CvWindow* window = icvFindWindowByName(winname.c_str());
+
+    if (!window)
+    {
+        namedWindow(winname);
+        window = icvFindWindowByName(winname.c_str());
+    }
+
+    if (!window)
+        CV_Error(Error::StsNullPtr, "NULL window");
+
+    CV_LOCK_MUTEX();
+    gtk_window_set_title(GTK_WINDOW(window->frame), title.c_str());
+    CV_UNLOCK_MUTEX();
+}
 
 double cvGetPropWindowAutoSize_GTK(const char* name)
 {
index bcf1bae..8e8c766 100644 (file)
@@ -483,6 +483,23 @@ void cvSetModeWindow_W32( const char* name, double prop_value)//Yannick Verdie
     __END__;
 }
 
+void cv::setWindowTitle(const String& winname, const String& title)
+{
+    CvWindow* window = icvFindWindowByName(winname.c_str());
+
+    if (!window)
+    {
+        namedWindow(winname);
+        window = icvFindWindowByName(winname.c_str());
+    }
+
+    if (!window)
+        CV_Error(Error::StsNullPtr, "NULL window");
+
+    if (!SetWindowText(window->frame, title.c_str()))
+        CV_Error_(Error::StsError, ("Failed to set \"%s\" window title to \"%s\"", winname.c_str(), title.c_str()));
+}
+
 double cvGetPropWindowAutoSize_W32(const char* name)
 {
     double result = -1;