From: Stephen Leake <Stephe.Leake@nasa.gov>
Subject: Re: Custom model in gtkada?
Date: Sun, 02 Jul 2006 11:17:17 -0400
Date: 2006-07-02T11:17:17-04:00 [thread overview]
Message-ID: <uy7vcrq82.fsf@nasa.gov> (raw)
In-Reply-To: iyw9ksz63snu$.1e3qctqdr4a6x$.dlg@40tude.net
"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:
> On Thu, 29 Jun 2006 13:11:12 -0400, Stephen Leake wrote:
>
>> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:
>>
>>>> I think Gtk is the best model, although the C underpinnings make
>>>> things difficult sometimes. In particular, it is difficult to detect
>>>> some errors at compile time, that the fully Ada systems can detect. At
>>>> root, the C pointers are not strongly typed.
>>>
>>> I don't see how Ada could help there. An event is either handled or not.
>>> "Event" is not an Ada term, so the compiler cannot check anything. An
>>> abstract primitive subprogram is.
>>
>> An Ada pointer to a subprogram is also strongly typed; that's what's
>> missing in the C code. You can easily specify a pointer to a
>> subprogram with the wrong parameter profile. If you are lucky, the
>> error will be caught at runtime, with a sort-of-helpful error message.
>
> Yes, but what pointers lack is safety of composition. Primitive operation
> is safely inherited and required to be overridden when abstract. Also
> within a primitive subprogram you are safe against re-dispatch. An
> equivalent design based on pointers will always "dispatch".
This is true, but I don't see how it is relevant to a GUI design. Of
course you want the call to "dispatch" to the user-provided operation!
If the GUI designer derives a new widget from an existing widget, the
designer must arrange for the callbacks to work properly. That can be
done with the pure pointer model, or with inherited operations.
I have not done much with deriving new widgets from existing widgets.
The few times I tried it I ended up with a totally new widget. I'd
have to go back and re-examine the details to understand why.
>>> 1. There are many communication / synchronization / notification
>>> mechanisms. Among them events are not necessarily the best.
>>
>> Well, of course. But that's not a very helpful statement.
>>
>> For the specific case of windowing Graphical User Interfaces, I think
>> events are the best. For many other applications, they are not.
>
> For all, GTK events are probably not events, but some kind of dispatching
> for poor. A 'true' event has no parameters and its handling is asynchronous
> to the emitter. They lack serialization.
Well, that's an extreme definition. By that definition, no existing
GUI has an event queue.
> IMO, GUI are better with messages, because quite often the emitter
> needs to resynchronize itself with the server to be sure about the
> state of the widget.
Indeed, in Microsoft Windows, the "events" are called "messages". In
Gtk they are called "events". I don't know what they are called in X
Windows.
> It could also need to receive some data back. Probably, a kind of
> transaction would even better, considering low-level drawing, double
> buffering issues etc.
By "transaction", you mean something like an Ada rendezvous? Or like a
database transaction, with start, operate, end/rollback semantics?
> Windows DCs are much like transactions.
I assume "DC" = "Device Context". Yes, they do have start/operate/end
semantics. But no "roll back".
In Windex, I did the "start" and "end" parts in the top level message
handler, leaving only "operate" up to the client. That made things
simpler.
I assume the Gtk implementation for Windows uses DCs at the bottom
layer; it must do the start and end like Windex does.
> Another orthogonal problem is safe composition: widgets as containers,
> extensible widgets. Here I don't see nothing better than some sort of
> polymorphism. Events and messages are spaghetti. An alternative approach
> would what we have for finalization. When a record is finalized all its
> members will be finalized as well. Widget containers handle signals in
> similar manner.
The Gtk container widgets work pretty well for layout (position and
sizing of windows). They fail miserably when it comes to composing
event handling.
I never implemented container widgets in Windex. GWindows now has
Packing_Boxes, based on my experience with Gtk containers. We still
have not figured out a good way to compose the event handling.
Perhaps you'd like to help with that?
>>> 3. I designed soft-real time GUI libraries for Windows, where control over
>>> resources and multitasking was essential. Especially because the data rates
>>> (1-10ms) were sufficiently higher than the visualization rates (100ms). I
>>> don't think that event/callback mindset is any good for such things. At
>>> least it would require a lot of acrobatics.
>>
>> Clearly you don't generate GUI events for every real-time data point.
>>
>> What is better than events, for this application, in your opinion? And
>> most importantly, why?
>
> In this particular case polling is better than events. The widgets are not
> controlled by data flow. Instead of that there is a refresh engine which
> orders the widgets to redraw themselves.
So that "order" is a GUI event, and the timing of that event is based
on how humans process visual information (minimum flicker rate
requirements). That's a good design.
> But obviously keyboard input would represent an opposite case, where
> polling would be wrong.
Yes.
> One could, and usually all GUI libraries do it, add some timer event
> or message.
To handle events that have timing requirements, but are asynchronous
from others, yes. Not to handle keyboard input.
> But this makes things worse. A clean serialized model becomes in
> fact asynchronous, because the sources of timer events and "normal"
> events are asynchronous.
Well, of course; that's reality. "serialized" means "in time order,
routed to the correct window". It does _not_ mean "synchronized with
some clock".
Why is that "worse"? What is the alternative?
> IMO, Ada could provide a much cleaner view on these things, especially,
> because it is natively multitasking.
Yes. But it doesn't eliminate the need for GUI events driven by timers.
--
-- Stephe
next prev parent reply other threads:[~2006-07-02 15:17 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-13 18:01 Custom model in gtkada? Dmitry A. Kazakov
2006-06-13 19:53 ` M E Leypold
2006-06-14 7:17 ` Dmitry A. Kazakov
2006-06-14 21:00 ` Maxim Reznik
2006-06-15 7:38 ` Dmitry A. Kazakov
2006-06-15 15:31 ` Georg Bauhaus
2006-06-15 16:24 ` Ed Falis
2006-06-15 18:44 ` M E Leypold
2006-06-15 16:25 ` Dmitry A. Kazakov
2006-06-17 15:13 ` Georg Bauhaus
2006-06-17 16:44 ` Dmitry A. Kazakov
2006-06-22 7:16 ` Emmanuel Briot
2006-06-22 8:31 ` Dmitry A. Kazakov
2006-06-22 12:08 ` Emmanuel Briot
2006-06-23 12:32 ` Stephen Leake
2006-06-23 13:58 ` Dmitry A. Kazakov
2006-06-29 17:11 ` Stephen Leake
2006-06-30 12:29 ` Dmitry A. Kazakov
2006-07-02 15:17 ` Stephen Leake [this message]
2006-07-03 18:23 ` Dmitry A. Kazakov
2006-07-04 13:51 ` Stephen Leake
2006-07-05 13:06 ` Dmitry A. Kazakov
2006-07-06 7:10 ` Stephen Leake
2006-06-23 16:59 ` Jeffrey R. Carter
2006-06-23 17:37 ` Ed Falis
2006-06-23 18:11 ` Dmitry A. Kazakov
2006-06-29 17:20 ` Stephen Leake
2006-06-29 20:08 ` Jeffrey R. Carter
2006-06-30 10:28 ` Alex R. Mosteo
2006-06-30 16:07 ` Stephen Leake
2006-06-30 19:45 ` Jeffrey R. Carter
2006-06-30 22:41 ` Randy Brukardt
2006-07-01 5:11 ` Jeffrey R. Carter
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox