From: Braden M. <br...@us...> - 2007-01-23 04:08:12
|
Update of /cvsroot/openvrml/openvrml/src/openvrml-gtkplug In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26117/src/openvrml-gtkplug Modified Files: Tag: OpenVRML-0_16-BRANCH gtkvrmlbrowser.cpp Log Message: Because of the way rendering is currently intertwined with the core runtime, we can't safely do much while the browser is loading a new world. So, use an openvrml::browser_event::initialized event to trigger making the widget usable again. Index: gtkvrmlbrowser.cpp =================================================================== RCS file: /cvsroot/openvrml/openvrml/src/openvrml-gtkplug/gtkvrmlbrowser.cpp,v retrieving revision 1.2.2.7 retrieving revision 1.2.2.8 diff -C2 -d -r1.2.2.7 -r1.2.2.8 *** gtkvrmlbrowser.cpp 4 Jan 2007 03:43:40 -0000 1.2.2.7 --- gtkvrmlbrowser.cpp 23 Jan 2007 04:08:08 -0000 1.2.2.8 *************** *** 111,115 **** --- 111,131 ---- }; + + class GtkGLViewer; + + class G_GNUC_INTERNAL browser_listener : + public openvrml::browser_listener { + + GtkGLViewer & viewer_; + + public: + explicit browser_listener(GtkGLViewer & viewer); + + private: + virtual void do_browser_changed(const openvrml::browser_event & event); + }; + class G_GNUC_INTERNAL GtkGLViewer : public openvrml::gl::viewer { + friend class browser_listener; friend void (::gtk_vrml_browser_load_url)(GtkVrmlBrowser * vrml_browser, *************** *** 123,128 **** --- 139,151 ---- GdkEventExpose *, gpointer); + friend gboolean + (::gtk_vrml_browser_motion_notify_event)(GtkWidget *, + GdkEventMotion *, + gpointer); ::browser browser_; + ::browser_listener browser_listener_; + bool browser_initialized_; + boost::mutex browser_initialized_mutex_; GtkVrmlBrowser & vrml_browser_; guint timer; *************** *** 176,179 **** --- 199,207 ---- while (url && *url) { url_vec.push_back(*(url++)); } while (parameter && *parameter) { param_vec.push_back(*(parameter++)); } + + { + boost::mutex::scoped_lock lock(viewer.browser_initialized_mutex_); + viewer.browser_initialized_ = false; + } viewer.browser_.load_url(url_vec, param_vec); } *************** *** 183,186 **** --- 211,218 ---- { GtkGLViewer & viewer = *static_cast<GtkGLViewer *>(vrml_browser->viewer); + { + boost::mutex::scoped_lock lock(viewer.browser_initialized_mutex_); + viewer.browser_initialized_ = false; + } viewer.browser_.set_world(in); } *************** *** 274,277 **** --- 306,312 ---- GtkGLViewer & viewer = *static_cast<GtkGLViewer *>(GTK_VRML_BROWSER(widget)->viewer); + boost::mutex::scoped_lock lock(viewer.browser_initialized_mutex_); + if (!viewer.browser_initialized_) { return true; } + if (event->count == 0 && gdk_gl_drawable_make_current(gl_drawable, gl_context)) { *************** *** 456,464 **** GdkGLContext * const gl_context = gtk_widget_get_gl_context(widget); g_assert(gl_context); if (gdk_gl_drawable_make_current(gl_drawable, gl_context)) { ! GtkGLViewer * const viewer = ! static_cast<GtkGLViewer *>(GTK_VRML_BROWSER(widget)->viewer); ! g_assert(viewer); ! viewer->input(&info); } return true; --- 491,502 ---- GdkGLContext * const gl_context = gtk_widget_get_gl_context(widget); g_assert(gl_context); + if (gdk_gl_drawable_make_current(gl_drawable, gl_context)) { ! g_assert(GTK_VRML_BROWSER(widget)->viewer); ! GtkGLViewer & viewer = ! *static_cast<GtkGLViewer *>(GTK_VRML_BROWSER(widget)->viewer); ! boost::mutex::scoped_lock lock(viewer.browser_initialized_mutex_); ! if (!viewer.browser_initialized_) { return true; } ! viewer.input(&info); } return true; *************** *** 539,543 **** const int get_url_result = this->streambuf_->get_url_result(); if (get_url_result != 0) { ! this->setstate(std::ios_base::badbit); } --- 577,581 ---- const int get_url_result = this->streambuf_->get_url_result(); if (get_url_result != 0) { ! this->setstate(ios_base::badbit); } *************** *** 565,575 **** --- 603,633 ---- } + browser_listener::browser_listener(GtkGLViewer & viewer): + viewer_(viewer) + {} + + void + browser_listener::do_browser_changed(const openvrml::browser_event & event) + { + if (event.id() == openvrml::browser_event::initialized) { + using boost::mutex; + mutex::scoped_lock lock(this->viewer_.browser_initialized_mutex_); + this->viewer_.browser_initialized_ = true; + gdk_threads_enter(); + this->viewer_.post_redraw(); + gdk_threads_leave(); + } + } + GtkGLViewer::GtkGLViewer(GIOChannel & request_channel, GtkVrmlBrowser & vrml_browser): browser_(request_channel), + browser_listener_(*this), + browser_initialized_(true), vrml_browser_(vrml_browser), timer(0), redrawNeeded(false) { + this->browser_.add_listener(this->browser_listener_); this->browser_.viewer(this); } *************** *** 578,581 **** --- 636,640 ---- { if (this->timer) { g_source_remove(timer); } + this->browser_.remove_listener(this->browser_listener_); } |