mirror of
https://github.com/opencv/opencv.git
synced 2024-11-24 19:20:28 +08:00
highgui: fix GTK issues with external UI thread
This commit is contained in:
parent
5e6a3f1f6c
commit
aa0c6ddb4c
@ -40,9 +40,6 @@
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
#include "opencv2/imgproc.hpp"
|
||||
|
||||
using namespace cv;
|
||||
|
||||
#ifndef _WIN32
|
||||
|
||||
@ -66,6 +63,11 @@ using namespace cv;
|
||||
#include <GL/glu.h>
|
||||
#endif
|
||||
|
||||
#include <opencv2/core/utils/logger.hpp>
|
||||
#include "opencv2/imgproc.hpp"
|
||||
|
||||
using namespace cv;
|
||||
|
||||
#ifndef BIT_ALLIN
|
||||
#define BIT_ALLIN(x,y) ( ((x)&(y)) == (y) )
|
||||
#endif
|
||||
@ -1705,18 +1707,19 @@ static gboolean icvOnKeyPress(GtkWidget* widget, GdkEventKey* event, gpointer us
|
||||
code |= event->state << 16;
|
||||
|
||||
#ifdef HAVE_GTHREAD
|
||||
if(thread_started) g_mutex_lock(last_key_mutex);
|
||||
#endif
|
||||
|
||||
last_key = code;
|
||||
|
||||
#ifdef HAVE_GTHREAD
|
||||
if(thread_started){
|
||||
if(thread_started)
|
||||
{
|
||||
g_mutex_lock(last_key_mutex);
|
||||
last_key = code;
|
||||
// signal any waiting threads
|
||||
g_cond_broadcast(cond_have_key);
|
||||
g_mutex_unlock(last_key_mutex);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
last_key = code;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@ -1886,10 +1889,12 @@ static gboolean icvAlarm( gpointer user_data )
|
||||
CV_IMPL int cvWaitKey( int delay )
|
||||
{
|
||||
#ifdef HAVE_GTHREAD
|
||||
if(thread_started && g_thread_self()!=window_thread){
|
||||
gboolean expired;
|
||||
if (thread_started && g_thread_self() != window_thread)
|
||||
{
|
||||
gboolean expired = true;
|
||||
int my_last_key;
|
||||
|
||||
g_mutex_lock(last_key_mutex);
|
||||
// wait for signal or timeout if delay > 0
|
||||
if(delay>0){
|
||||
GTimeVal timer;
|
||||
@ -1898,8 +1903,15 @@ CV_IMPL int cvWaitKey( int delay )
|
||||
expired = !g_cond_timed_wait(cond_have_key, last_key_mutex, &timer);
|
||||
}
|
||||
else{
|
||||
g_cond_wait(cond_have_key, last_key_mutex);
|
||||
expired=false;
|
||||
if (g_windows.empty())
|
||||
{
|
||||
CV_LOG_WARNING(NULL, "cv::waitKey() is called without timeout and missing active windows. Ignoring");
|
||||
}
|
||||
else
|
||||
{
|
||||
g_cond_wait(cond_have_key, last_key_mutex);
|
||||
expired=false;
|
||||
}
|
||||
}
|
||||
my_last_key = last_key;
|
||||
g_mutex_unlock(last_key_mutex);
|
||||
@ -1908,21 +1920,20 @@ CV_IMPL int cvWaitKey( int delay )
|
||||
}
|
||||
return my_last_key;
|
||||
}
|
||||
else{
|
||||
else
|
||||
#endif
|
||||
{
|
||||
int expired = 0;
|
||||
guint timer = 0;
|
||||
if( delay > 0 )
|
||||
timer = g_timeout_add( delay, icvAlarm, &expired );
|
||||
last_key = -1;
|
||||
while( gtk_main_iteration_do(TRUE) && last_key < 0 && !expired && !g_windows.empty())
|
||||
while( gtk_main_iteration_do(TRUE) && last_key < 0 && !expired && (delay > 0 || !g_windows.empty()))
|
||||
;
|
||||
|
||||
if( delay > 0 && !expired )
|
||||
g_source_remove(timer);
|
||||
#ifdef HAVE_GTHREAD
|
||||
}
|
||||
#endif
|
||||
return last_key;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user