Moving to GtkBox (Re: Minutes of the GTK+ Team Meeting - 2008-09-23)
- From: Tim Janik <timj imendio com>
- To: Mike Kestner <mkestner gmail com>
- Cc: Michael Natterer <mitch gimp org>, Gtk+ Developers <gtk-devel-list gnome org>, Alexander Larsson <alexl redhat com>, Morten Welinder <mortenw gnome org>
- Subject: Moving to GtkBox (Re: Minutes of the GTK+ Team Meeting - 2008-09-23)
- Date: Fri, 26 Sep 2008 11:44:19 +0200 (CEST)
On Thu, 25 Sep 2008, Mike Kestner wrote:
The types would essentially be
boilerplate, so it's not like they are going to be a maintenance issue.
If the motivation for removing the types is that, "things aren't as
beautiful as they could be" then that argument doesn't really outweigh
the pain of porting existing code. Especially when the cost of
supporting existing code is so low.
There doesn't really need to be any pain involved for the application
developers at all here. We've previously talked about libgtk3compat
(or libgtk3graveyard) and this looks like another good example for
having it. I.e. the box changes can look as follows:
- Make GtkBox a constructable widget (effectively introducing a new
user level widget as Mitch described)
- Add orientation switching to GtkBox:
gtk_box_set_orientation (GtkBox*, GtkOrientation);
This effectively moves all hbox_size_request, vbox_size_request,
hbox_size_allocate and vbox_size_allocate logic into gtkbox.c
- Make GtkHBox and GtkVBox very shallow compatibility types derived
from GtkBox. This involves one G_DEFINE_TYPE() macro and implementing
gtk_hbox_new and gtk_vbox_new as simple wrappers around g_object_new.
(They'd effectively call gtk_box_set_orientation() in their _init
functions.)
- Change the packing defaults for gtk_box_pack_start_defaults and friends
unless old compat types are detected, i.e.:
void
gtk_box_pack_start_defaults (GtkBox *box, GtkWidget *child)
{
gboolean compat_type =
g_type_is_named (G_OBJECT_TYPE (box), "GtkHBox") ||
g_type_is_named (G_OBJECT_TYPE (box), "GtkVBox");
gboolean expand = compat_type ? TRUE : FALSE;
gboolean fill = compat_type ? TRUE : FALSE;
gtk_box_pack_start (box, child, expand, fill, 0);
}
I've used a new helper function g_type_is_named() here, since adding
that might be helpful in a couple other compat cases as well. It roughly
amounts to g_type_is_a (type, g_type_from_name (type_name)); and doesn't
require the checked for type to actually be registered.
- Change additional defaults as needed, e.g.:
gtk_box_init (GtkBox *self)
{
gboolean compat_type =
g_type_is_named (G_OBJECT_TYPE (box), "GtkHBox") ||
g_type_is_named (G_OBJECT_TYPE (box), "GtkVBox");
if (!compat_type)
gtk_widget_show (self); // GtkBox defaults to ::visible=TRUE
}
- The shallow compat types GtkHBox and GtkVBox could be moved into a
libgtk3compat that allows fine grained "undeprecation", e.g.:
#define GTK_DISABLE_DEPRECATED 1 // allow code cleanups
#define GTK_COMPAT_HBOX 1 // still need GtkHBox though
So as long as GTK_COMPAT_{H|V}BOX are defined, *no* existing
application code will need changing.
- Locking the orientation for GtkHBox and GtkVBox widgets could be added
in addition, but I don't think it's strictly neccessary. After all,
GtkHBox and GtkVBox will continue as mere wrappers to help people in
their porting efforts and IMHO should be kept as simple as possible.
The officially supported box interface will be GtkBox anyway.
---
ciaoTJ
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]