From: Braden M. <br...@us...> - 2007-01-23 04:08:41
|
Update of /cvsroot/openvrml/openvrml/src/openvrml-gtkplug In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26194/src/openvrml-gtkplug Modified Files: 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.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** gtkvrmlbrowser.cpp 4 Jan 2007 03:44:11 -0000 1.9 --- gtkvrmlbrowser.cpp 23 Jan 2007 04:08:39 -0000 1.10 *************** *** 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,129 **** --- 139,152 ---- GdkEventExpose *, gpointer); + friend gboolean + (::gtk_vrml_browser_motion_notify_event)(GtkWidget *, + GdkEventMotion *, + gpointer); ::resource_fetcher fetcher_; openvrml::browser browser_; + ::browser_listener browser_listener_; + bool browser_initialized_; + boost::mutex browser_initialized_mutex_; GtkVrmlBrowser & vrml_browser_; guint timer; *************** *** 177,180 **** --- 200,208 ---- 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); } *************** *** 184,187 **** --- 212,219 ---- { 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); } *************** *** 275,278 **** --- 307,313 ---- 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)) { *************** *** 457,465 **** 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; --- 492,503 ---- 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; *************** *** 535,539 **** const int get_url_result = this->streambuf_->get_url_result(); if (get_url_result != 0) { ! this->setstate(std::ios_base::badbit); } --- 573,577 ---- const int get_url_result = this->streambuf_->get_url_result(); if (get_url_result != 0) { ! this->setstate(ios_base::badbit); } *************** *** 561,564 **** --- 599,619 ---- } + 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(); + } + } + // // We use stdout for communication with the host process; so send *************** *** 569,576 **** --- 624,634 ---- fetcher_(request_channel), browser_(this->fetcher_, std::cerr, std::cerr), + 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); } *************** *** 579,582 **** --- 637,641 ---- { if (this->timer) { g_source_remove(timer); } + this->browser_.remove_listener(this->browser_listener_); } |