X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fcairocell.cc;h=7ce77355b6e883f665e91d7fbe7563bb87004e4e;hb=8dcc28c9ad91baade9c30a2ec6d59a1f799dc654;hp=79b5a673b45ccc9422fc6c10eb6f2d899b40d68e;hpb=0a53bb1d42361eeb6552af03a1d3578535d948d0;p=ardour.git diff --git a/libs/gtkmm2ext/cairocell.cc b/libs/gtkmm2ext/cairocell.cc index 79b5a673b4..7ce77355b6 100644 --- a/libs/gtkmm2ext/cairocell.cc +++ b/libs/gtkmm2ext/cairocell.cc @@ -25,6 +25,7 @@ #include "gtkmm2ext/utils.h" using std::string; +using std::vector; using std::map; using std::max; using std::cerr; @@ -39,49 +40,53 @@ CairoFontDescription::CairoFontDescription (Pango::FontDescription& fd) switch (fd.get_style()) { case Pango::STYLE_NORMAL: - slant = Cairo::FONT_SLANT_NORMAL; + _slant = Cairo::FONT_SLANT_NORMAL; break; case Pango::STYLE_OBLIQUE: - slant = Cairo::FONT_SLANT_OBLIQUE; + _slant = Cairo::FONT_SLANT_OBLIQUE; break; case Pango::STYLE_ITALIC: - slant = Cairo::FONT_SLANT_ITALIC; + _slant = Cairo::FONT_SLANT_ITALIC; break; } switch (fd.get_weight()) { case Pango::WEIGHT_ULTRALIGHT: - weight = Cairo::FONT_WEIGHT_NORMAL; + _weight = Cairo::FONT_WEIGHT_NORMAL; break; case Pango::WEIGHT_LIGHT: - weight = Cairo::FONT_WEIGHT_NORMAL; + _weight = Cairo::FONT_WEIGHT_NORMAL; break; case Pango::WEIGHT_NORMAL: - weight = Cairo::FONT_WEIGHT_NORMAL; + _weight = Cairo::FONT_WEIGHT_NORMAL; break; case Pango::WEIGHT_SEMIBOLD: - weight = Cairo::FONT_WEIGHT_BOLD; + _weight = Cairo::FONT_WEIGHT_BOLD; break; case Pango::WEIGHT_BOLD: - weight = Cairo::FONT_WEIGHT_BOLD; + _weight = Cairo::FONT_WEIGHT_BOLD; break; case Pango::WEIGHT_ULTRABOLD: - weight = Cairo::FONT_WEIGHT_BOLD; + _weight = Cairo::FONT_WEIGHT_BOLD; break; case Pango::WEIGHT_HEAVY: - weight = Cairo::FONT_WEIGHT_BOLD; + _weight = Cairo::FONT_WEIGHT_BOLD; break; + /* to silence warnings when compiling with newer pango versions. */ + default: + _weight = Cairo::FONT_WEIGHT_NORMAL; + break; } face = fd.get_family(); -} +} CairoCell::CairoCell (int32_t id) : _id (id) @@ -116,16 +121,23 @@ CairoTextCell::render (Cairo::RefPtr& context) return; } + context->save (); + + context->rectangle (bbox.x, bbox.y, bbox.width, bbox.height); + context->clip (); + _font->apply (context); context->move_to (bbox.x, bbox.y + bbox.height + y_offset); context->show_text (_text); + + context->restore (); } void CairoTextCell::set_size (Cairo::RefPtr& context) { const uint32_t lim = (uint32_t) ceil (_width_chars); - char buf[lim+1]; + vector buf(lim+1); uint32_t n; double max_width = 0.0; double max_height = 0.0; @@ -139,11 +151,11 @@ CairoTextCell::set_size (Cairo::RefPtr& context) for (int digit = 0; digit < 10; digit++) { for (n = 0; n < lim; ++n) { - buf[n] = '0' + digit; + buf[n] = '0' + digit; } - - context->get_text_extents (buf, ext); - + + context->get_text_extents (&buf[0], ext); + max_width = max (ext.width + ext.x_bearing, max_width); max_height = max (ext.height, max_height); bsum += ext.x_bearing; @@ -171,7 +183,7 @@ CairoCharCell::set_size (Cairo::RefPtr& context) Cairo::TextExtents ext; _font->apply (context); - + { const char* buf = "8"; context->get_text_extents (buf, ext); @@ -204,7 +216,6 @@ CairoEditableText::CairoEditableText (boost::shared_ptr fo set_flags (Gtk::CAN_FOCUS); set_can_default (true); - set_receives_default (true); } CairoEditableText::~CairoEditableText () @@ -225,13 +236,13 @@ CairoEditableText::on_scroll_event (GdkEventScroll* ev) } bool -CairoEditableText::on_focus_in_event (GdkEventFocus* ev) +CairoEditableText::on_focus_in_event (GdkEventFocus*) { return false; } bool -CairoEditableText::on_focus_out_event (GdkEventFocus* ev) +CairoEditableText::on_focus_out_event (GdkEventFocus*) { if (editing_cell) { queue_draw_cell (editing_cell); @@ -244,7 +255,7 @@ void CairoEditableText::add_cell (CairoCell* cell) { cells.push_back (cell); - + CairoTextCell* tc = dynamic_cast(cell); if (tc) { @@ -280,7 +291,14 @@ CairoEditableText::set_text (CairoTextCell* cell, const string& text) bool CairoEditableText::on_expose_event (GdkEventExpose* ev) { - Cairo::RefPtr context = get_window()->create_cairo_context(); + Glib::RefPtr win = get_window (); + + if (!win) { + std::cerr << "CET: no window to draw on\n"; + return false; + } + + Cairo::RefPtr context = win->create_cairo_context(); if (cells.empty()) { return true; @@ -292,7 +310,7 @@ CairoEditableText::on_expose_event (GdkEventExpose* ev) Gtk::Allocation alloc = get_allocation (); double width = alloc.get_width(); double height = alloc.get_height (); - + if (_draw_bg) { context->set_source_rgba (bg_r, bg_g, bg_b, bg_a); if (_corner_radius) { @@ -302,14 +320,14 @@ CairoEditableText::on_expose_event (GdkEventExpose* ev) } context->fill (); } - + for (CellMap::iterator i = cells.begin(); i != cells.end(); ++i) { CairoCell* cell = (*i); /* is cell inside the expose area? */ - + if (cell->intersects (ev->area)) { if (cell == editing_cell) { context->set_source_rgba (edit_r, edit_b, edit_g, edit_a); @@ -399,9 +417,9 @@ CairoEditableText::set_cell_sizes () if (!win) { return; } - + Cairo::RefPtr context = win->create_cairo_context(); - + if (!context) { return; } @@ -418,7 +436,7 @@ CairoEditableText::on_size_request (GtkRequisition* req) max_cell_width = 0; max_cell_height = 0; - + for (CellMap::iterator i = cells.begin(); i != cells.end(); ++i) { max_cell_width += (*i)->width(); max_cell_height = std::max ((double) (*i)->height(), max_cell_height);