diff --git a/src/gui_builder.cc b/src/gui_builder.cc index d6fc9b7..d14d3aa 100644 --- a/src/gui_builder.cc +++ b/src/gui_builder.cc @@ -38,6 +38,14 @@ using namespace sgpem; using Gnome::Glade::Xml; +void +test_me() +{ + // A test for widget display: + Simulation& sim = Simulation::get_instance(); + sim.get_history().add_process("goofy", 0, 0); +} + GuiBuilder::GuiBuilder(const std::string& gladefile) : _refXml(Xml::create(gladefile)) @@ -58,7 +66,8 @@ GuiBuilder::GuiBuilder(const std::string& gladefile) _refXml->get_widget("MenuItem.Help.About", help_about); AboutDialog* about_dialog = NULL; _refXml->get_widget("AboutDialog", about_dialog); - help_about->signal_activate().connect(sigc::mem_fun(*about_dialog, &Window::show)); + //help_about->signal_activate().connect(sigc::mem_fun(*about_dialog, &Window::show)); + help_about->signal_activate().connect(sigc::ptr_fun(test_me)); // Temporary code to test the Schedulables custom widget Expander* scheds_expander = NULL; @@ -68,9 +77,6 @@ GuiBuilder::GuiBuilder(const std::string& gladefile) // we have to remember to manually show custom added widgets: scheds_widget->show(); - // A test for widget display: - Simulation& sim = Simulation::get_instance(); - sim.get_history().add_process("goofy", 0, 0); } diff --git a/src/schedulables_widget.cc b/src/schedulables_widget.cc index 9c3d2e2..33540ec 100644 --- a/src/schedulables_widget.cc +++ b/src/schedulables_widget.cc @@ -26,16 +26,19 @@ #include +#include #include #include + using namespace sgpem; SchedulablesWidget::SchedulablesWidget() - : Glib::ObjectBase("sgpem_CairoWidget"), + : Glib::ObjectBase("sgpem_CairoWidget"), Gtk::Widget(), _h(1), _buf(NULL) { + set_flags(Gtk::NO_WINDOW); // Register this observer: Simulation::get_instance().get_history().attach(*this); } @@ -51,24 +54,27 @@ void SchedulablesWidget::update(const History& history) { if(!is_realized()) - return; // Nowhere to draw to. + return; // Nowhere to draw to. // Determine the final height before to start drawing unsigned int w = get_allocation().get_width(); _h = calc_height(history); - + // get_window() returns a null pointer // if the widget has not been realized _buf = Gdk::Pixmap::create(get_window(), w, _h); + cairo_t* ctx = gdk_cairo_create(_buf->gobj()); // do the drawing... draw_widget(ctx); - + cairo_scale(ctx, w, _h); // manually force an expose_event? cairo_destroy(ctx); + + queue_draw(); } @@ -95,13 +101,13 @@ SchedulablesWidget::calc_height(const History& history) const void SchedulablesWidget::on_realize() { - set_flags(Gtk::REALIZED); - - // Add other events we want to manage (as mouse clicks) - // when needed - add_events(Gdk::EXPOSURE_MASK); + if(is_realized()) return; - GdkWindowAttr attributes; + Gtk::Widget::on_realize(); + ensure_style(); + + GdkWindowAttr attributes; + memset(&attributes, 0, sizeof(attributes)); Gtk::Allocation alloc = get_allocation(); @@ -110,20 +116,23 @@ SchedulablesWidget::on_realize() attributes.width = alloc.get_width(); attributes.height = alloc.get_height(); attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = get_visual()->gobj(); - attributes.colormap = get_colormap()->gobj(); - + attributes.event_mask = get_events() | GDK_EXPOSURE_MASK; + attributes.window_type = GDK_WINDOW_CHILD; + Glib::RefPtr window = Gdk::Window::create(get_parent_window(), &attributes, - GDK_WA_X | GDK_WA_Y | GDK_WA_COLORMAP | - GDK_WA_VISUAL | GDK_WA_WMCLASS); + Gdk::WA_X | Gdk::WA_Y | + Gdk::WA_WMCLASS); + unset_flags(Gtk::NO_WINDOW); + set_window(window); - // get_style()->attach(window); window->set_user_data(gobj()); get_style()->set_background(window, Gtk::STATE_ACTIVE); + + _refGC = Gdk::GC::create(window); } - -void + +void SchedulablesWidget::on_size_request(Gtk::Requisition* requisition) { // FIXME: take correct measures, consider also using a viewport(?) @@ -147,28 +156,29 @@ SchedulablesWidget::on_size_allocate(const Gtk::Allocation& allocation) bool SchedulablesWidget::on_expose_event(GdkEventExpose* event) { - if(!event || event->count > 0) - return false; - // calculated dinamically: - set_size_request(get_allocation().get_width(), _h); + int w = get_allocation().get_width(); + set_size_request(w, _h); // Clip to redraw only the smallest possible area std::auto_ptr clip_area; - clip_area = std::auto_ptr(new Gdk::Rectangle(event->area.x, event->area.y, - event->area.width, event->area.height)); + if(event) + clip_area = std::auto_ptr(new Gdk::Rectangle(event->area.x, event->area.y, + event->area.width, event->area.height)); + else + clip_area = std::auto_ptr(new Gdk::Rectangle(0, 0, w, _h)); // Use double buffering or we're CPU-dead // Copy from the buffer to the screen if(_buf) - get_window()->draw_drawable(Gdk::GC::create(get_window()), _buf, - clip_area->get_x(), clip_area->get_y(), - clip_area->get_x(), clip_area->get_y(), - clip_area->get_width(), clip_area->get_height()); + get_window()->draw_drawable(_refGC, _buf, + clip_area->get_x(), clip_area->get_y(), + clip_area->get_x(), clip_area->get_y(), + clip_area->get_width(), clip_area->get_height()); - return true; + return true; } - + bool SchedulablesWidget::on_button_press_event(GdkEventButton* event) diff --git a/src/schedulables_widget.hh b/src/schedulables_widget.hh index 9dd5a54..4b9e9c3 100644 --- a/src/schedulables_widget.hh +++ b/src/schedulables_widget.hh @@ -59,6 +59,7 @@ namespace sgpem typedef std::vector areas_vect_t; Glib::RefPtr _buf; + Glib::RefPtr _refGC; }; } //~ namespace sgpem