Re: An interface! / GtkEntry,GtkEditable,GtkOldEditable



Owen,

This is a Really Cool Thing[tm]!  I only browsed the code briefly,
but it looks like it rocks.. hopefully this should make it much less
painful to make a good editable canvas item. =)  I've also been
wanting to see how Glib's new interfaces work.. it's pretty smooth
looking.

> 
> The implementation of things like selections is split about 50-50
> between GtkEditable and GtkEntry; but 
> 
>  a) GtkEditable can't be fixed because changing that would break
>     widgets deriving from GtkEditable, such as GtkText, GtkSCText, (there
>     are about 5 others in GNOME CVS.)
> 
>  b) GtkEntry has to continue to be a GtkEditable because 
>     there is a lot of code out there that uses GtkEditable
>     function calls on GtkEntry. 
> 
> The solution I found was to use the new interfaces functionality in
> GObject.
> 
> We turn GtkEditable into an interface, so code such as:
> 
>  gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1)
> 
> continues to work, but GtkEntry doesn't need to share any code with
> GtkEditable. The only code that needs to be changed is code such as:
> 
>  GTK_EDITABLE (entry)->current_pos
> 
> which  needs to be changed to;
> 
>  gtk_editable_get_position (GTK_EDITABLE (entry));
> 
> The implementation that is currently in GtkEditable moves to a new
> GtkOldEditable class. Fixing up legacy widgets such as GtkText becomes
> 99% just mechanical substitution.
> 
> 
> The GtkEditable interface is then exported by both GtkEntry and
> GtkOldEditable. It can also, in the future, be exported by objects
> such as GtkTextView or GtkTextBuffer, which wasn't previously
> possible; a fairly common request was to have editable widgets that
> were derived from GtkContainer.
> 
> 
> A possibly odd thing about GtkEditable is that to conform to the
> GtkEditable interface, you need to not just export the vtable in the
> GObject manner, you also need to have a 'editable' argument and
> ::cut_clipboard, ::copy_clipboard, and ::paste_clipboard action
> signals.
> 
> I've appended gtkeditable.[ch] below and also gtkoldeditable.[ch]
> as an example of a class exporting GtkEditable. I'd appreciate
> if Tim in particular would take a look at this and see if
> it matches his imagination for how the interfaces would be
> used.
> 
> Notes on GInterface (in addition to the previous comment that
> interfaces vtables should simply be initialized in the class_init
> function):
> 
>  - The GInterfaceInfo argument g_type_add_interface_static needs
>    to be const.
> 
>  - There clearly needs to be G_TYPE_INSTANCE_GET_IFACE macro
>    to simplify:
> 
>   #define GTK_EDITABLE_GET_IFACE(obj) \
>     ((GtkEditableIface *)g_type_interface_peek (((GTypeInstance *)GTK_EDITABLE (obj))->g_class, \
>                                                 GTK_TYPE_EDITABLE))
> 
> Other than that, the interface stuff seemed to work flawlessly.
> 
> Regards,
>                                         Owen
> 
> 
> 




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