Re: GSeal bugs in GtkAccelLabel hampering flexibility
- From: Mathias Hasselmann <mathias hasselmann gmx de>
- To: Peter Clifton <pcjc2 cam ac uk>
- Cc: gtk-devel-list gnome org
- Subject: Re: GSeal bugs in GtkAccelLabel hampering flexibility
- Date: Mon, 26 Jan 2009 10:15:28 +0100
Am Montag, den 26.01.2009, 04:03 +0000 schrieb Peter Clifton:
> Hi,
>
> I'm trying to write a subclass of GtkAccelLabel in order to override its
> source for the accelerator string.
>
> gEDA (GPL Electronic CAD) uses multi-key-press keyboard shortcuts which
> are unfortunately incompatible with the GtkAccelGroup way of achieving
> keyboard shortcuts.
>
>
> By subclassing GtkAction, I've been able to add extra data, stashing our
> desired accelerator string, and have been able to override the
> connect_proxy method in order to replace the GtkAccelLabel in the menu
> item with a custom "GschemAccelLabel", upon which I set a string
> property with our desired accelerator text.
>
> All is well here, and menus work - display as expected. (Even if I
> suspect the fact you can swap the GtkMenuItem's label before hooking the
> GtkAction connect_proxy method may be exploiting implementation details
> of the system.
>
>
> Unfortunately, GtkMenuItem will only check the accelerator width for
> GtkAccelLabel and its subclasses. (I'm currently subclassing GtkLabel).
>
> However.. even if I subclass GtkAccelLabel, I have no means to override
> its idea of what the accelerator string is, nor the width it returns
> when queried.
>
>
> The header file GSEALs the required members:
>
> struct _GtkAccelLabel
> {
> GtkLabel label;
>
> guint GSEAL (gtk_reserved);
> guint GSEAL (accel_padding); /* should be style property? */
> GtkWidget *GSEAL (accel_widget); /* done*/
> GClosure *GSEAL (accel_closure); /* has set function */
> GtkAccelGroup *GSEAL (accel_group); /* set by set_accel_closure() */
> gchar *GSEAL (accel_string); /* has set function */
> guint16 GSEAL (accel_string_width); /* seems to be private */
> };
>
> "seems to be private" -> Has broken my ability to override it
> accel_string _does not_ have a direct setter -> I can't override it.
>
>
> I felt like I was so close to making this work without having to
> re-write the whole damned GtkMenu* GtkAction* GtkAccel* class hierarchy
> in our app, but I'm beginning to realise this isn't going to work
> without major surgery.
>
> Please please ensure that when GSEAL'ing members / hiding implementation
> details away in prep for GTK3.0, that the toolkit is actually actually
> usable / flexible enough for developers who need to subclass and extend
> or change its default behaviour.
>
> Either make the widgets flexible enough in the first place, or expose
> the appropriate hooks / class member virtual functions in order for us
> to extend things! GtkAccel* could so nearly have been directly usable
> for what we want, but due to lack of virtual functions in the class, we
> can't just subclass it to give the behaviours we need.
>
>
> I'm running out of decent arguments against other developers on the team
> who want to switch away from GTK, and my own patience is becoming
> stretched. I want to love GTK, but sometimes (like tonight) it
> frustrates me so very much!
>
> Sorry for the rant..
>
> Any suggestions as to how to fix this will be warmly received.
What about creating a patch providing the hooks you need?
In the end that's how FOSS works.
Ciao,
Mathias
--
Mathias Hasselmann <mathias hasselmann gmx de>
Personal Blog: http://taschenorakel.de/mathias/
Openismus GmbH: http://www.openismus.com/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]