Re: Gtk::Style usage help needed



On Fri, 2010-10-29 at 14:47 -0700, siagogam wrote:
> First of all, thanks José for your complete answer,
> 
> I've done both steps you commented. Final sample code looks now like this:
> 
> #include <gtkmm.h>
> 
> class mystyle : public Gtk::Style
> {
>   public:
>      static Glib::RefPtr <mystyle> create()
>      {
> 	return Glib::RefPtr <mystyle> (new mystyle);
>      }
> 
>   protected:
>      mystyle() : Gtk::Style(), Glib::ObjectBase("mystyle")
>      {
>      }
> };
> 
> int main (int argc, char **argv)
> {
>    Gtk::Main mainkit(argc, argv);
> 
>    Gtk::Window window;
>    Gtk::Label label("test");
>    Glib::RefPtr <mystyle> style = mystyle::create();
> 
>    label.set_style(style);
>    
>    window.resize(400,100);
>    window.add(label);
>    window.show_all();
>    mainkit.run(window);
> 
>    return 0;
> }
> 
> Anyway it doesn't work. Same errors, and same segfault.
> Tried running under valgrind and here is a surprise.. under valgrind works!!
> Valgrind don't show any errors in this code execution, but upon window close
> I get this error:
> 
> (a.out:14344): GLib-GObject-CRITICAL **: g_object_unref: assertion
> `G_IS_OBJECT (object)' failed
> 
> any idea?

I would use a debugger.  Other than that, it's difficult to know what's
wrong because it is not clear what it is you're trying to do.

> 
> 
> José Alburquerque wrote:
> > 
> > On Fri, 2010-10-29 at 11:08 -0700, siagogam wrote:
> >> Ok, I'll try to explain what I want to do, so you can tell me if I'm
> >> doing it
> >> the way is supposed to be done. 
> >> 
> >> As you said, I want to modify how widgets are drawn (by using cairo
> >> inside
> >> the style virtual functions), and I have no intention of creating a new
> >> complete theme engine. If all applications should share the same look is
> >> a
> >> point of view quite extended , but what I want to do is just the opposite
> >> (define my own look and feel in my application) 
> >> 
> >> I'm trying to do it just the way you mentioned, by calling set_style in
> >> the
> >> affected widgets. But if we recover the example code, I'm getting some
> >> pango
> >> errors and a segfault when trying to use an overloaded Gtk::Style in a
> >> label
> >> widget (other widgets I have tested works fine with this approach). 
> >> 
> >> I've been looking to the Gtk::Style code in style.cc and the create()
> >> function does nothing but create the Glib::RefPtr, so I'm quite confused
> >> write now. ¿what can it be wrong? 
> > 
> > I suppose that if you want to derive from Gtk::Style you should follow
> > the same "structure" as the original Gtk::Style class.
> > 
> > Since Gtk::Style is reference counted, it is normally accessed using
> > Gli::RefPtr<>.  Its constructors are protected and the create() method
> > constructs the style and returns a Glib::RefPtr<> to the style.  You
> > might follow a similar structure for your class (I think).
> > 
> > As far as drawing widgets with cairo, there is good docs in the
> > programming book:
> > http://library.gnome.org/devel/gtkmm-tutorial/unstable/chapter-drawingarea.html
> > 
> > There's also a section on creating custom widgets that might be helpful:
> > http://library.gnome.org/devel/gtkmm-tutorial/unstable/chapter-customwidgets.html
> > 
> > Finally, I think it may be necessary to call the Glib::ObjectBase(const
> > char*) constructor from the derived style class (I don't know for sure).
> > See the following bug in case it is relevant:
> > https://bugzilla.gnome.org/show_bug.cgi?id=523043
> > 
> >> 
> >> TIA
> >> 
> >> 
> >> José Alburquerque wrote:
> >> > 
> >> > On Fri, 2010-10-29 at 00:40 -0700, siagogam wrote: 
> >> >> Yes I've already tried in my test example the Gtk::Style::create() and
> >> >> works
> >> >> fine, but what I want to do is overload the style drawing functions in
> >> >> order
> >> >> to perform some changes in the way some widgets are drawn. I can not
> >> do
> >> >> that
> >> >> using the create static method.
> >> > 
> >> > As Paul said, users normally determine the look of applications on
> >> their
> >> > desktop by selecting themes themselves.  If you should still want to
> >> > modify how widgets are drawn for some reason, the best way to do it, I
> >> > think, is by using the various style manipulating methods in the
> >> > Gtk::Widget API[1] such as get_style()[2], set_style()[3] and
> >> > modify_style()[4] among others.
> >> > 
> >> > [1] http://library.gnome.org/devel/gtkmm/stable/classGtk_1_1Widget.html
> >> > [2]
> >> >
> >> http://library.gnome.org/devel/gtkmm/stable/classGtk_1_1Widget.html#a3a3c08d5fcb8a134fff5e3f3a11f4f7f
> >> > [3]
> >> >
> >> http://library.gnome.org/devel/gtkmm/stable/classGtk_1_1Widget.html#a50ef706c909b415894aab77663447af3
> >> > [4]
> >> >
> >> http://library.gnome.org/devel/gtkmm/stable/classGtk_1_1Widget.html#a8fe55b3cc4342ae1242b384b2de813bd
> >> > 
> >> >> 
> >> >> I'm not sure of whats rcstyle for, but I think its for defining the
> >> >> system
> >> >> apearance through an rc style file. is this true? Anyway, thats not
> >> what
> >> >> I'm
> >> >> looking for.
> >> >> 
> >> >> Gtk::Style offers lots of protected virtual methods, so its' designed
> >> to
> >> >> be
> >> >> inherited, but in the other hand the label style seems to depend on
> >> the
> >> >> code
> >> >> executed in the create() method, that can not be overloaded. Is this a
> >> >> bug?
> >> >> 
> >> >> TIA
> >> > 
> >> > -- 
> >> > José
> >> > 
> >> > 
> >> > 
> >> > _______________________________________________
> >> > gtkmm-list mailing list
> >> > gtkmm-list gnome org
> >> > http://mail.gnome.org/mailman/listinfo/gtkmm-list
> >> > 
> >> > 
> >> 
> > 
> > -- 
> > José
> > 
> > _______________________________________________
> > gtkmm-list mailing list
> > gtkmm-list gnome org
> > http://mail.gnome.org/mailman/listinfo/gtkmm-list
> > 
> > 
> 

-- 
José



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]