message: highgui(gtk): use recursive cv::Mutex for 'window_mutex' variable
diff: @@ -597,10 +597,15 @@ int thread_started=0;
  static gpointer icvWindowThreadLoop(gpointer data);
  GMutex* last_key_mutex = NULL;
  GCond* cond_have_key = NULL;
  -GMutex* window_mutex = NULL;
  GThread* window_thread = NULL;
  #endif
  +static cv::Mutex& getWindowMutex()
  +{
  + static cv::Mutex* g_window_mutex = new cv::Mutex();
  + return *g_window_mutex;
  +}
  +
  static int last_key = -1;
  static std::vector< Ptr<CvWindow> > g_windows;
  @@ -627,14 +632,14 @@ CV_IMPL int cvInitSystem( int argc, char** argv )
  CV_IMPL int cvStartWindowThread(){
  #ifdef HAVE_GTHREAD
  cvInitSystem(0,NULL);
  - if (!thread_started) {
  + if (!thread_started)
  + {
  if (!g_thread_supported ()) {
  /* the GThread system wasn't inited, so init it */
  g_thread_init(NULL);
  }
  - // this mutex protects the window resources
  - window_mutex = g_mutex_new();
  + (void)getWindowMutex(); // force mutex initialization
  // protects the 'last key pressed' variable
  last_key_mutex = g_mutex_new();
  @@ -661,9 +666,10 @@ CV_IMPL int cvStartWindowThread(){
  gpointer icvWindowThreadLoop(gpointer /*data*/)
  {
  while(1){
  - g_mutex_lock(window_mutex);
  + {
  + cv::AutoLock lock(getWindowMutex());
  gtk_main_iteration_do(FALSE);
  - g_mutex_unlock(window_mutex);
  + }
  // little sleep
  g_usleep(500);
  @@ -673,20 +679,10 @@ gpointer icvWindowThreadLoop(gpointer /*data*/)
  return NULL;
  }
  -
  -class GMutexLock {
  - GMutex* mutex_;
  -public:
  - GMutexLock(GMutex* mutex) : mutex_(mutex) { if (mutex_) g_mutex_lock(mutex_); }
  - ~GMutexLock() { if (mutex_) g_mutex_unlock(mutex_); mutex_ = NULL; }
  -};
  -
  -#define CV_LOCK_MUTEX() GMutexLock lock(window_mutex);
  -
  -#else
  -#define CV_LOCK_MUTEX()
  #endif
  +#define CV_LOCK_MUTEX() cv::AutoLock lock(getWindowMutex())
  +
  static CvWindow* icvFindWindowByName( const char* name )
  {
  for(size_t i = 0; i < g_windows.size(); ++i)
  