Ideas for a brand new widget toolkit

Adam D. Ruppe destructionator at gmail.com
Tue Aug 13 19:23:00 PDT 2013


On Tuesday, 13 August 2013 at 20:33:48 UTC, Joakim wrote:
> You mentioned X11 to me before, when we talked about this idea 
> over email.

Ah yes. I think X's biggest problem though is that it doesn't do 
*enough*. The protocol is fairly efficient for what it does, but 
it just doesn't do enough so the commands aren't particularly 
compact when you start to get fancier.

For instance, in my crappygui.d, I used XDrawString to draw text. 
This was the result: http://arsdnet.net/gui.png

That's a true type font (Bitstream Vera Sans, a fairly good 
looking font), but X doesn't support antialiasing.

There's a library called Xft that draws fonts prettier. But how 
does it work? Instead of sending DrawText(x, y, "hello world!") 
to the display server, it uses a drawing library to render the 
text as an image in the application, then sends that image to the 
display server.

And BTW if the display doesn't support the alpha blending 
extension (the XRender extension), it first takes a partial 
screenshot, does the blending in library, and sends that image 
back!

Note that the X protocol does not compress the image data. So if 
you send a 100x30 pixel image of text, you're shooting some 10 KB 
- or double that without XRender - down the network wire instead 
of the .... idk exactly for sure, but I think it is about 32 
bytes to just send the draw instruction.


Now, you can compress an X stream over ssh, so it isn't always 
this bad in practice, but still, since the X display server 
doesn't support the expected modern feature, it blows up in 
bandwidth to compensate and that can kill the user experience.

Note btw though, you *can* save the image on the display server 
to reuse it later, so every time you print a string it doesn't 
necessarily send that data across, but I'm not sure if the higher 
level libraries actually do this... the downsides of abstractions 
is you can miss important details like this.

This is why my simpledisplay.d now has a class Sprite in addition 
to class Image, and why Qt has QImages and QPixmaps, but how 
often do you think of drawing text as being something that needs 
a Pixmap to be efficient? Again the library might handle it, I'm 
not sure, but the relatively pathetic performance of a lot of 
apps on a remote X connection makes me think they probably don't.



Anyway, the other thing too is all events go to the client 
application from the display server, and then the application's 
changes go back to the display server. Since X itself doesn't 
offer any kind of widgets, a text control for instance would work 
like this:

application -> display: draw the box
display -> application: key press event
application -> display: draw the character, advance the cursor,,, 
and if oyu have to scroll btw it might draw a whole lot of stuff 
(though if you know you're on a potentially networked app, you'd 
do something like XCopyArea and tell the display to move a whole 
block of data up without resending it all, but again the leaky 
abstraction can kill you)


But yeah, the event needs a round trip to react. On a LAN, you're 
probably ok, but what about on the open internet where there's 
some latency? Well, sometimes it is actually quite fine there 
too, I spend a *lot* of time using both X and ssh remotely, but 
sometimes it gets to be really, really annoying.


So I'd want to do higher level events too, and the application 
can request them. For instance, if all you want is a basic text 
input, output something like <textarea></textarea> and let the 
display do the details.

(Another really nice benefit here, if we do it right, is it could 
use native controls on systems like Windows, or even pipe it to 
an external app on unix, and get a nice customized, adaptable 
system. Though while it sounds simpler in ways, this is easier 
said than done.)

With these higher level events and widgets, unless you need to 
override some event, it can just be handled without the round 
trip and improve response time on slow connections.

Though, if you do need real time event processing, you're back to 
the round trip, but meh, some speedup is better than none.




But, indeed, we don't want to go *too* far either, especially 
since then we'd end up with a web browser situation where people 
write their applications in the scripting language...


> What basic widgets do you have in mind, to keep on the 
> client-side?  Also, just widgets in the client or some basic 
> layout too?

Layout would be nice too. Ideally, I'd love if my apps worked on 
both guis and text mode uis and laying them out would be a bit 
different.

For my crappygui.d, I'm aiming to do:

menus, labels, radio box, checkbox, buttons, grid layouts, text 
input, slider, number chooser, list boxes, and basic 2d drawing. 
Pretty much the basic stuff you get on html forms. Maybe more 
later, but I want to actually be able to get this working over 
the next weekend or two, so I'm keeping it simple. (And right now 
I'm not actually doing network transparency, I'll come back to 
that, my basic idea there is to simply forward all the function 
calls with rpc.)

> As for detaching and reattaching, that is easier to do, the 
> more state is kept on the server. :)

Yeah, my old DWS idea was to do three applications, but that was 
a pain, a lot of duplication to add a new function. So now I want 
the middle man program to be really simple, basically a 
switchboard, and then the detach/attach messages will be handled 
by the application, just shooting its current state to the new 
display.

> it's more complicated to code all that reattaching 
> functionality and isn't necessary for most apps, most app devs 
> don't bother.

If we do it right, it will be zero effort :) GNU Screen has 
pretty much pulled it off for unix terminal programs. GUIs have 
Remote Desktop and friends... rdp is amazing btw, Microsoft (or 
whoever wrote it originally and sold it to them) did an excellent 
job and is a decent counter argument to me -  I think remote 
desktop is a simple viewer, the rdesktop app on unix isn't a 
particularly large piece of code and works quite well, but still 
I like my way.


More information about the Digitalmars-d mailing list