+ Gtk::Window window (WINDOW_TOPLEVEL);
+ Gtk::Label foobar;
+ Glib::RefPtr<Gtk::Style> style;
+
+ window.add (foobar);
+ foobar.set_name (widgetname);
+ foobar.ensure_style();
+
+ style = foobar.get_style ();
+
+ Glib::RefPtr<const Pango::Layout> layout = foobar.get_layout();
+
+ PangoFontDescription *pfd = (PangoFontDescription *)pango_layout_get_font_description((PangoLayout *)layout->gobj());
+
+ if (!pfd) {
+
+ /* layout inherited its font description from a PangoContext */
+
+ PangoContext* ctxt = (PangoContext*) pango_layout_get_context ((PangoLayout*) layout->gobj());
+ pfd = pango_context_get_font_description (ctxt);
+ return new Pango::FontDescription (pfd, true); /* make a copy */
+ }
+
+ return new Pango::FontDescription (pfd, true); /* make a copy */
+}
+
+uint32_t
+rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, string attr, int state, bool rgba)
+{
+ /* In GTK+2, styles aren't set up correctly if the widget is not
+ attached to a toplevel window that has a screen pointer.
+ */
+
+ static Gtk::Window* window = 0;
+
+ if (window == 0) {
+ window = new Window (WINDOW_TOPLEVEL);
+ }
+
+ Gtk::Label foo;
+
+ window->add (foo);
+
+ foo.set_name (style);
+ foo.ensure_style ();
+
+ GtkRcStyle* waverc = foo.get_style()->gobj()->rc_style;
+
+ if (waverc) {
+ if (attr == "fg") {
+ r = waverc->fg[state].red / 257;
+ g = waverc->fg[state].green / 257;
+ b = waverc->fg[state].blue / 257;
+
+ /* what a hack ... "a" is for "active" */
+ if (state == Gtk::STATE_NORMAL && rgba) {
+ a = waverc->fg[GTK_STATE_ACTIVE].red / 257;
+ }
+ } else if (attr == "bg") {
+ r = g = b = 0;
+ r = waverc->bg[state].red / 257;
+ g = waverc->bg[state].green / 257;
+ b = waverc->bg[state].blue / 257;
+ } else if (attr == "base") {
+ r = waverc->base[state].red / 257;
+ g = waverc->base[state].green / 257;
+ b = waverc->base[state].blue / 257;
+ } else if (attr == "text") {
+ r = waverc->text[state].red / 257;
+ g = waverc->text[state].green / 257;
+ b = waverc->text[state].blue / 257;
+ }